从命令行将mysql数据库转储到纯文本(CSV)备份

mysql command-line csv backup

132521 观看

10回复

13622 作者的声誉

我想避免使用mysqldump,因为它以一种只便于mysql读取的形式输出。CSV似乎更通用(每个表一个文件很好)。但如果mysqldump有优势,我全都耳朵。另外,我想从命令行(linux)运行一些东西。如果这是一个mysql脚本,指向如何制作这样的东西会有所帮助。

作者: dreeves 的来源 发布者: 2009 年 1 月 21 日

回应 (10)


135

278013 作者的声誉

决定

如果您可以一次处理表,并且数据不是二进制,请使用命令-B选项mysql。使用此选项,它将生成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
作者: Alnitak 发布者: 21.01.2009 11:18

30

144303 作者的声誉

在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/

作者: Paul Tomblin 发布者: 21.01.2009 11:38

2

248965 作者的声誉

查看mk-parallel-dump,它是一个非常有用的maatkit工具套件的一部分。这可以使用--csv选项转储逗号分隔的文件。

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

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

作者: Paul Dixon 发布者: 21.01.2009 11:41

3

22550 作者的声誉

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

用于备份的mysqldump格式的值特别是使用它来恢复mysql数据库非常容易。不容易恢复的备份远没那么有用。如果您正在寻找可靠地备份mysql数据的方法,以便您可以恢复到mysql服务器,那么我认为您应该坚持使用mysqldump工具。

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

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

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

作者: Zoredache 发布者: 22.01.2009 01:36

19

8036 作者的声誉

您可以使用mysqldump的--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/先使用。

作者: chmac 发布者: 09.05.2012 06:00

17

297 作者的声誉

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

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
作者: Sri 发布者: 16.10.2012 06:21

8

6631 作者的声誉

这是最简单的命令

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
作者: minhas23 发布者: 16.10.2015 07:59

3

31 作者的声誉

您可以使用以下脚本将输出输出到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是您的用户名,如果您不想为每个表键入密码而密码是密码,mydb是数据库名称。

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

作者: Kiran Pathuru 发布者: 10.10.2016 04:59

1

1801 作者的声誉

两行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 =制表符分隔

作者: Kolob Canyon 发布者: 14.09.2017 07:12

0

11 作者的声誉

如果要将整个数据库转储为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
作者: veera 发布者: 11.06.2019 06:37
32x32