CSV格式的mysqldump

Ken*_*Ken 65 mysql csv

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

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

Mar*_*cos 106

首先,我可以给你一个表的答案:

所有这些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"
Run Code Online (Sandbox Code Playgroud)

"id","login","password","folder","email""8","mariana","xxxxxxxxxx","mariana","""3","squaredesign","xxxxxxxxxxxxxxxxx"," squaredesign","mkobylecki @ sqdesign.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"

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

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

mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"
Run Code Online (Sandbox Code Playgroud)

从那里开始,制作循环只需要一步.在bashshell中迭代这些表:

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

do; done 插入长命令我在上面第1部分写道,但替换您的表名$tb来代替.

  • 如果查询结果超出要转储到的计算机上的内存,则会失败。有什么解决方法吗? (3认同)
  • 这似乎没有考虑到其中包含双引号的STRING列类型 - 它们应该被转义,否则就会被破坏.知道怎么做吗? (2认同)
  • @Blossoming_Flower:这是更新的正则表达式以逃避双引号:`| sed"s/\"/ \"\"/; s /'/ \'/; s /\t/\",\"/ g; s/^/\"/; s/$/\"/; s/\n // g"`([正确转义CSV中的双引号](http://stackoverflow.com/questions/17808511/properly-escape-a-double-quote-in-csv)) (2认同)
  • 这是没有引号的 sed: sed "s/'//;s/\t/,/g;s/\n//g" (2认同)

Arm*_*nce 25

此命令将在/ path/to/directory table_name.sql和table_name.txt中创建2个文件.

sql文件将包含表创建模式,txt文件将包含mytable表的记录,其中的字段由逗号分隔.

mysqldump -u username -p -t  -T/path/to/directory dbname table_name --fields-terminated-by=',' 
Run Code Online (Sandbox Code Playgroud)

  • 仅当您从与db服务器相同的计算机上运行mysqldump时才有效 (9认同)
  • 记得使用-T/path来处理mysql进程可写的内容. (4认同)
  • 如果您遇到mysql的安全文件priv问题,请执行`SHOW VARIABLES LIKE"secure_file_priv";`并使用您在`mysqldump`命令中输出文件夹的文件夹,如果您无法重启mysql服务器. (2认同)

Rol*_*DBA 19

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
Run Code Online (Sandbox Code Playgroud)

name应包含下列之一

`--fields-terminated-by`
Run Code Online (Sandbox Code Playgroud)

\t 要么 "\""

`--fields-enclosed-by=name`
Run Code Online (Sandbox Code Playgroud)

      输出文件中的字段由给定的数据括起来

--lines-terminated-by

  • \r
  • \n
  • \r\n

当然你应该mysqldump每个表单独

我建议你在文本文件中收集所有表名.然后,遍历运行mysqldump的所有表.这是一个将一次转储和gzip 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
Run Code Online (Sandbox Code Playgroud)

试试看 !!!

  • 我找不到您添加的`--tab`选项. (3认同)
  • 这不是CSV,这是制表符分隔的.CSV需要转义逗号,引用等. (2认同)

Ani*_*nis 8

如果您使用的是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;
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用其他技术为多个表重复此命令.在这里查看更多详情:


Vaj*_*ecz 7

看起来其他人也有这个问题,现在有一个简单的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
Run Code Online (Sandbox Code Playgroud)


fif*_*nce 5

这对我来说很好:

 mysqldump DBNAME --fields-terminated-by ',' \
 --fields-enclosed-by '"' --fields-escaped-by '\' \
 --no-create-info --tab /var/lib/mysql-files/
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想转储TABLENAME:

 mysqldump DBNAME TABLENAME --fields-terminated-by ',' \
 --fields-enclosed-by '"' --fields-escaped-by '\' \
 --no-create-info --tab /var/lib/mysql-files/
Run Code Online (Sandbox Code Playgroud)

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

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