我需要以CSV格式转储MySQL中的所有表。
是否有mysqldump
用于仅以CSV格式输出每个表的每一行的命令?
Answers:
首先,我可以为您提供一张桌子的答案:
所有这些INTO OUTFILE
或--tab=tmpfile
(和-T/path/to/directory
)答案的麻烦在于,它需要在与MySQL服务器相同的服务器上运行mysqldump ,并具有这些访问权限。
我的解决方案是简单地对参数使用mysql
(not 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
代替。
| sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"
(正确逃生CSV双引号)
| sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"
,添加g选项将输入中的每个“加倍”?Ruby CSV期望这样的约定
此命令将在/ path / to /目录table_name.sql和table_name.txt中创建两个文件。
SQL文件将包含表创建模式,而txt文件将包含mytable表的记录,这些记录的字段以逗号分隔。
mysqldump -u username -p -t -T/path/to/directory dbname table_name --fields-terminated-by=','
SHOW VARIABLES LIKE "secure_file_priv";
并使用该文件夹作为mysqldump
命令中的输出文件夹,如果您无法重新启动mysql服务器。
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
--fields-enclosed-by
。
mysqldump: You must use option --tab with --fields-...
--tab
您说添加的选项。
如果您使用的是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;
现在,您可以使用其他技术对多个表重复此命令。在这里查看更多详细信息:
这对我来说很好:
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”时无法执行该语句
看起来其他人也有此问题,并且现在有一个简单的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
您也可以使用dbForge Studio for MySQL中的数据导出工具来执行此操作。
它将允许您选择部分或全部表格并将其导出为CSV格式。
mysql.exe
程序进行操作,尝试SELECT * FROM table INTO OUTFILE'file_name'。但是您应该手动指定每个表。