【问题标题】:Dump a mysql database to a plaintext (CSV) backup from the command line从命令行将 mysql 数据库转储到纯文本 (CSV) 备份
【发布时间】:2010-10-02 19:40:13
【问题描述】:

我想避免使用 mysqldump,因为它以只方便 mysql 读取的形式输出。 CSV 似乎更通用(每个表一个文件就可以了)。但是,如果 mysqldump 有优势,我会全力以赴。另外,我想要一些可以从命令行(linux)运行的东西。如果那是一个 mysql 脚本,那么如何制作这样的东西的指针会很有帮助。

【问题讨论】:

标签: mysql command-line csv backup


【解决方案1】:

如果你想将整个数据库转储为 csv

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://buckera/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

【讨论】:

    【解决方案2】:

    有一种更简单的方法可以让所有表格快速进入制表符分隔:

    #!/bin/bash
    tablenames=$(mysql your_database -e "show tables;" -B |sed "1d")
    
    IFS=$'\n'
    
    tables=($tablenames)
    
    for table in ${tables[@]}; do
            mysql your_database -e "select * from ${table}" -B > "${table}.tsv"
    done
    

    【讨论】:

      【解决方案3】:

      您可以使用mysqldump's --tab 选项一次性转储整个数据库。您提供一个目录路径,它会创建一个具有CREATE TABLE DROP IF EXISTS 语法的.sql 文件和一个带有内容的.txt 文件,制表符分隔。要创建逗号分隔的文件,您可以使用以下内容:

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

      该路径需要 mysql 用户和运行命令的用户都可写,因此为简单起见,我建议首先使用 chmod 777 /tmp/path_to_dump/

      【讨论】:

      • 我一直回到这个答案,这绝对是将所有表格导出到分隔文件的最佳方式。
      • mysqldump: You must use option --tab with --fields-...
      • 作为根用户:GRANT FILE ON *.* TO 'user1'@'localhost'; - stackoverflow.com/a/15014385/1707015。在我的情况下,我不得不采取/var/lib/mysql-files/(而不是/tmp/),将用户设置为mysql:mysql并将权限设置为777 - stackoverflow.com/a/32737616/1707015
      【解决方案4】:

      两行 PowerShell 答案:

      # 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
      

      嘭嘭嘭

      -D = 您的数据库名称

      -e = 查询

      -B = 制表符分隔

      【讨论】:

        【解决方案5】:

        您可以使用下面的脚本来获取 csv 文件的输出。每个表一个文件,带有标题。

        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 是您的用户名,如果您不想为每个表输入密码,password 是密码,mydb 是数据库名称。

        脚本说明:sed 中的第一个表达式将用“,”替换制表符,因此您的字段用双引号括起来并用逗号分隔。第二个在开头插入双引号,第三个在末尾插入双引号。最后一个负责\n。

        【讨论】:

        • 这主要是把我带到了我需要去的地方,但是当字母“t”被逗号替换时我感到很惊讶:stackoverflow.com/a/2610121/8400969
        • 这在我的mysql版本中也应该是--skip-column-names
        【解决方案6】:

        这是最简单的命令

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

        如果列值中有逗号,那么我们可以使用以下命令生成 .tsv 而不是 .csv

        mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv
        

        【讨论】:

        • 对于 CSV:它适用于我只需要逗号的地方。 mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' &gt; /tmp/output.csv`
        【解决方案7】:

        select into outfile 选项对我不起作用,但以下通过 SED 管道制表符分隔文件的迂回方式可以:

        mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
        

        【讨论】:

        • 此命令导致输出文件中的字母 t 被替换为 ", "。不完全是我所追求的。
        • 这不起作用。它不会生成 csv 文件
        【解决方案8】:

        查看mk-parallel-dump,它是永远有用的maatkit suite of tools 的一部分。这可以使用 --csv 选项转储逗号分隔的文件。

        这可以在不指定单个表的情况下完成整个数据库,并且您可以在备份集表中指定表组。

        请注意,它还将表定义、视图和触发器转储到单独的文件中。除了以更普遍可访问的形式提供完整备份之外,它还可以通过mk-parallel-restore 立即恢复

        【讨论】:

        • 这可能不是理想的备份,但对于分享来说非常棒。谢谢!
        • maatkit 现在似乎是percona toolkit 的一部分,但我找不到相应的工具。
        【解决方案9】:

        如果您真的需要“备份”,那么您还需要数据库模式,例如表定义、视图定义、存储过程等。数据库的备份不仅仅是数据。

        mysqldump 格式备份的价值在于,用它来恢复mysql数据库非常容易。不容易恢复的备份的用处要小得多。如果您正在寻找一种可靠地将 mysql 数据备份到的方法,以便您可以恢复到 mysql 服务器,那么我认为您应该坚持使用 mysqldump 工具。

        Mysql 是免费的,可以在许多不同的平台上运行。设置一个我可以恢复到的新 mysql 服务器很简单。我一点也不担心无法设置 mysql,所以我可以进行恢复。

        我会更担心基于 csv/tsv 等脆弱格式的自定义备份/恢复失败。您确定数据中的所有引号、逗号或制表符都会正确转义,然后由您的还原工具正确解析吗?

        如果您正在寻找一种提取数据的方法,请在其他答案中查看几个。

        【讨论】:

        • 谢谢,非常有帮助!你说服了我。我确实有其他理由想要一种通过命令行命令快速获取 csv 转储的方法。我坚持“接受的答案”。 (虽然我现在可能可以从当前的答案中将它拼凑起来,我猜想使用 mysql 脚本)。
        • 我可以看到使用本机方法进行备份和提取用于其他目的的很多价值。
        • mk-parallel-restore 可以恢复使用 mk-parallel dump 创建的 CSV 备份,因此您可以两全其美。事实上,mk-parallel-restore 通过确保您定义的任何触发器最后恢复来做得更好。
        【解决方案10】:

        如果您可以处理一次一张表,并且您的数据不是二进制的,请使用mysql 命令的-B 选项。使用此选项,它将生成 TSV(制表符分隔)文件,这些文件可以很容易地导入 Excel 等:

        % echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database
        

        或者,如果您可以直接访问服务器的文件系统,请使用SELECT INTO OUTFILE,它可以生成真正的 CSV 文件:

        SELECT * INTO OUTFILE 'table.csv'
            FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
            LINES TERMINATED BY '\n'
        FROM table
        

        【讨论】:

        • 谢谢!你的第二个“表”应该是“数据库”,对吧?没有您知道的 CSV 替代 TSV 选项?
        • duh - 是的,它应该读取“数据库”。不,没有 CSV 选项,这是我所知道的最好的,不使用 MySQL 的内置“select into outfile”,它 可以 执行 CSV,但将文件写入服务器,而不是客户端.
        • 如何强制覆盖输出文件?
        • 请注意,当给出相对路径(或简单的文件名)时,该文件将出现在您的 MYSQL 目录中,而不是您当前的 shell 目录中(即\. file.sql 的读取位置)。因此,根据您的安装,您可能会在 /var/lib/mysql/[db_name]/table.csv 找到它
        【解决方案11】:

        在 MySQL 本身中,您可以指定 CSV 输出,例如:

        SELECT order_id,product_name,qty
        FROM orders
        INTO OUTFILE '/tmp/orders.csv'
        FIELDS TERMINATED BY ','
        ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
        

        来自http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

        【讨论】:

        • 我在我指定的目录中似乎找不到转储文件,这是为什么呢?
        • @JCm 它转储到服务器上
        猜你喜欢
        • 2011-03-02
        • 2016-02-19
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 2010-10-23
        • 2013-09-11
        • 1970-01-01
        • 2017-08-29
        相关资源
        最近更新 更多