使用'mysqldump'转储CSV格式的所有表


77

我需要以CSV格式转储MySQL中的所有表。

是否有mysqldump用于仅以CSV格式输出每个表的每一行的命令?


1
您可以使用mysql.exe程序进行操作,尝试SELECT * FROM table INTO OUTFILE'file_name'。但是您应该手动指定每个表。
Devart,2012年

Answers:


118

首先,我可以为您提供一张桌子的答案:

所有这些INTO OUTFILE--tab=tmpfile(和-T/path/to/directory)答案的麻烦在于,它需要在与MySQL服务器相同的服务器上运行mysqldump ,并具有这些访问权限。

我的解决方案是简单地对参数使用mysqlnot mysqldump),用-B内联SELECT语句-e,然后用按摩ASCII输出sed,并用CSV结束,包括标题字段行:

例:

 mysql -B -u username -p password database -h dbhost -e "SELECT * FROM accounts;" \
 | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"

“ id”,“登录”,“密码”,“文件夹”,“电子邮件”,“ 8”,“ mariana”,“ xxxxxxxxxx”,“ mariana”,“” 3“,” squaredesign“,” xxxxxxxxxxxxxxxxx“,” squaredesign”,“ mkobylecki@squaredesign.com”,“ 4”,“ miedziak”,“ xxxxxxxxxx”,“ miedziak”,“ miedziak@mail.com”“ 5”,“ Sarko”,“ xxxxxxxxx”,“ Sarko”,“ “” 6“,” Logitrans Poland“,” xxxxxxxxxxxxxx“,” LogitransPoland“,”“” 7“,” Amos“,” xxxxxxxxxxxxxxxxxxxx“,” Amos“,”“” 9“,” Annabelle“,” xxxxxxxxxxxxxxxx“, “ Annabelle”,“”“ 11”,“Brandfathers and Sons“,” xxxxxxxxxxxxxxxxx“,” BrandfathersAndSons“,”“” 12“,” Imagine Group“,” xxxxxxxxxxxxxxxx“,” ImagineGroup“,”“”“ 13”,“ EduSquare.pl”,“ xxxxxxxxxxxxxxxxx”,“ EduSquare .pl“,”“” 101“,” tmp“,” xxxxxxxxxxxxxxxxxxxxx“,” _“,” WOBC-14.squaredesign.atlassian.net@yoMama.com“_“,” WOBC-14.squaredesign.atlassian.net@yoMama.com“_“,” WOBC-14.squaredesign.atlassian.net@yoMama.com“

> outfile.csv在该单行代码的末尾添加一个,以获取该表的CSV文件。

接下来,获取所有表的列表

mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"

从那里开始,仅循环一个步骤,例如,在Bash shell中迭代这些表:

 for tb in $(mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"); do
     echo .....;
 done

do; done 插入之间,我在上面的第1部分中编写了long命令,但用您的表名$tb代替。


1
如果查询结果超出转储到的计算机上的内存,此操作将失败。有什么解决方法吗?
T. Brian Jones

2
这似乎没有考虑到其中包含双引号的STRING列类型-应该将其转义,否则会损坏。任何想法如何做到这一点?
timetofly

2
@Blossoming_Flower:这里是更新的正则表达式来逃避双引号: | sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"正确逃生CSV双引号
OlivierLarue

1
@Olivier,@Blossoming_Flower:也许| sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g",添加g选项将输入中的每个“加倍”?Ruby CSV期望这样的约定
。– kostas

2
这是不带引号的sed:sed“ s /'//; s / \ t /,/ g; s / \ n // g”
优雅的骰子,

31

此命令将在/ path / to /目录table_name.sqltable_name.txt中创建两个文件。

SQL文件将包含表创建模式,而txt文件将包含mytable表的记录,这些记录的字段以逗号分隔。

mysqldump -u username -p -t  -T/path/to/directory dbname table_name --fields-terminated-by=','

5
记住要使用-T / path到mysql进程可写的东西。
Mayank Jain

10
仅当您从与数据库服务器相同的机器上运行mysqldump时才有效
Jake

3
如果您遇到mysql的安全文件priv问题,请执行以下操作,SHOW VARIABLES LIKE "secure_file_priv";并使用该文件夹作为mysqldump命令中的输出文件夹,如果您无法重新启动mysql服务器。
sjas

21

mysqldump 具有CSV格式的选项:

--fields-terminated-by=name
                  Fields in the output file are terminated by the given
--lines-terminated-by=name
                  Lines in the output file are terminated by the given

name应包含下列之一:

`--fields-terminated-by`

\t 要么 "\""

`--fields-enclosed-by=name`
   Fields in the output file are enclosed by the given

--lines-terminated-by

  • \r
  • \n
  • \r\n

自然,您应该mysqldump分别转储每个表。

我建议您将所有表名称收集在一个文本文件中。然后,遍历所有运行mysqldump的表。这是一个脚本,可同时转储和压缩10个表:

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQLSTMT="SELECT CONCAT(table_schema,'.',table_name)"
SQLSTMT="${SQLSTMT} FROM information_schema.tables WHERE table_schema NOT IN "
SQLSTMT="${SQLSTMT} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/DBTB.txt
COMMIT_COUNT=0
COMMIT_LIMIT=10
TARGET_FOLDER=/path/to/csv/files
for DBTB in `cat /tmp/DBTB.txt`
do
    DB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $2}'`
    DUMPFILE=${DB}-${TB}.csv.gz
    mysqldump ${MYSQL_CONN} -T ${TARGET_FOLDER} --fields-terminated-by="," --fields-enclosed-by="\"" --lines-terminated-by="\r\n" ${DB} ${TB} | gzip > ${DUMPFILE}
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

2
那不是CSV,那是制表符分隔的。CSV要求转义逗号,引号等。
肯威廉斯

1
@KenWilliams谢谢。我在中加了双引号--fields-enclosed-by
RolandoMySQLDBA

这会产生错误。mysqldump: You must use option --tab with --fields-...
Anthony Hatzopoulos

3
我找不到--tab您说添加的选项。
DrLightman

1
Cloud SQL文档介绍了如何创建mysqldump。 cloud.google.com/sql/docs/mysql/import-export 一些选项也可能与为bigquery创建CSV转储有关,例如mysqldump --- hex-blob --default-character-set = utf8
intotecho

17

如果您使用的是MySQL或MariaDB,则对单个表进行转储CSV的最简单,最有效的方法是-

SELECT customer_id, firstname, surname INTO OUTFILE '/exportdata/customers.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM customers;

现在,您可以使用其他技术对多个表重复此命令。在这里查看更多详细信息:


这似乎是最合适的答案,因为它既灵活又高效。
Thomas Kimber '18

9

这对我来说很好:

mysqldump <DBNAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/

或者,如果您只想转储特定表:

mysqldump <DBNAME> <TABLENAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/

我转储以/var/lib/mysql-files/避免此错误:

mysqldump:得到错误:1290:MySQL服务器正在使用--secure-file-priv选项运行,因此在执行“ SELECT INTO OUTFILE”时无法执行该语句


8

看起来其他人也有此问题,并且现在有一个简单的Python脚本,用于将mysqldump的输出转换为CSV文件。

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
mysqldump -u username -p --host=rdshostname database table | python mysqldump_to_csv.py > table.csv

注意,mysqldump-to-csv的简单代码中包含一些错误。因此,请准备对其进行错误修复,或使用较慢但稳定的解决方案...
Vajk Hermecz 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.