Dump a mysql database to a plaintext (CSV) backup from the command line

前端 未结 10 1034
广开言路
广开言路 2020-11-28 19:26

I\'d like to avoid mysqldump since that outputs in a form that is only convenient for mysql to read. CSV seems more universal (one file per table is fine). But if there ar

相关标签:
10条回答
  • 2020-11-28 19:29

    If you really need a "Backup" then you also need database schema, like table definitions, view definitions, store procedures and so on. A backup of a database isn't just the data.

    The value of the mysqldump format for backup is specifically that it is very EASY to use it to restore mysql databases. A backup that isn't easily restored is far less useful. If you are looking for a method to reliably backup mysql data to so you can restore to a mysql server then I think you should stick with the mysqldump tool.

    Mysql is free and runs on many different platforms. Setting up a new mysql server that I can restore to is simple. I am not at all worried about not being able to setup mysql so I can do a restore.

    I would be far more worried about a custom backup/restore based on a fragile format like csv/tsv failing. Are you sure that all your quotes, commas, or tabs that are in your data would get escaped correctly and then parsed correctly by your restore tool?

    If you are looking for a method to extract the data then see several in the other answers.

    0 讨论(0)
  • 2020-11-28 19:32

    Here is the simplest command for it

    mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv
    

    If there is a comma in the column value then we can generate .tsv instead of .csv with the following command

    mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv
    
    0 讨论(0)
  • 2020-11-28 19:33

    You can use below script to get the output to csv files. One file per table with headers.

    for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
    do 
    mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
    done
    

    user is your user name, password is the password if you don't want to keep typing the password for each table and mydb is the database name.

    Explanation of the script: The first expression in sed, will replace the tabs with "," so you have fields enclosed in double quotes and separated by commas. The second one insert double quote in the beginning and the third one insert double quote at the end. And the final one takes care of the \n.

    0 讨论(0)
  • 2020-11-28 19:35

    If you want to dump the entire db as csv

    #!/bin/bash
    
    host=hostname
    uname=username
    pass=password
    
    port=portnr
    db=db_name
    s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/
    
    
    
    DATE=`date +%Y%m%d`
    rm -rf $DATE
    
    echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
    awk 'NR>1' tables.txt > tables_new.txt
    
    while IFS= read -r line
    do
      mkdir -p $DATE/$line
      echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
    done < tables_new.txt
    
    touch $DATE/$DATE.fin
    
    
    rm -rf tables_new.txt tables.txt
    
    0 讨论(0)
  • 2020-11-28 19:36

    You can dump a whole database in one go with mysqldump's --tab option. You supply a directory path and it creates one .sql file with the CREATE TABLE DROP IF EXISTS syntax and a .txt file with the contents, tab separated. To create comma separated files you could use the following:

    mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name
    

    That path needs to be writable by both the mysql user and the user running the command, so for simplicity I recommend chmod 777 /tmp/path_to_dump/ first.

    0 讨论(0)
  • 2020-11-28 19:37

    Two line PowerShell answer:

    # Store in variable
    $Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
    | ConvertFrom-Csv -Delimiter "`t"
    
    # Out to csv
    $Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation
    

    Boom-bata-boom

    -D = the name of your database

    -e = query

    -B = tab-delimited

    0 讨论(0)
提交回复
热议问题