MySQL转储所有表的结构和一些数据

时间:2014-01-15 10:51:15

标签: mysql sql command-line-interface mysqldump

我正在尝试转储我们数据库中所有表的结构,然后只转储我特别想要的那些数据,但我似乎做错了,因为我没有得到为其创建的空表我从数据转储中排除的那些。

我有一个文本文件,它指定我要转储数据的表(称为showtables.txt):

SHOW TABLES FROM mydb
WHERE Tables_in_mydb NOT LIKE '%_history'
AND Tables_in_mydb NOT LIKE '%_log';

然后我执行此命令来转储所有表的结构,然后转储该查询在文本文件中返回的表的数据:

mysqldump -u root -pmypassword mydb --no-data > mydump.sql; mysql -u root -pmypassword < showtables.txt -N | xargs mysqldump mydb -u root -pmypassword > mydump.sql -v

我正在获取showtables查询结果中包含的所有表的转储,但我没有得到其余表的结构。

如果我只将结构部分作为单个命令运行,那么工作正常,我会为所有表转储结构。但是将它与数据转储相结合似乎不起作用。

你能指点一下我出错的地方吗?

感谢。

2 个答案:

答案 0 :(得分:4)

我认为您的命令行参数的顺序是错误的(重定向到文件应该是结束),并且您需要xargs的额外参数,因此我们可以为mysqldump指定数据库名称。

此外,您需要附加>>转储数据,否则您将覆盖每个表的mydump.sql文件:

mysqldump -u root -pmypassword mydb --no-data > mydump.sql
mysql -u root -pmypassword -N < showtables.txt | xargs -I {} mysqldump -v -u root -pmypassword mydb {} >> mydump.sql

资料来源:http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/

答案 1 :(得分:0)

使用Jon的答案,但xargs中的-I将为每个表运行单独的mysqldump命令。更容易只允许xargs default将上一个命令的输出附加到下一个命令。 mysqldump的最后一个参数是您要转储的所有表的列表。

我的解决方案还显示通过堡垒主机连接。通过SSH连接进行流式传输之前的gzip'ing比通过网络发送未压缩的SQL要快得多。

FILE=~/production.sql.gz
HOST=ext-db-read-0.cdzvblmx0n9h.us-west-1.rds.amazonaws.com
USER=username
PASS="s3cret"
DB=myapp_prod
EXCLUDE="'activities', 'changelogs'"

ssh bastion.mycompany.com <<EOF > $FILE
    mysqldump -h $HOST -u $USER -p$PASS $DB --no-data | gzip
    mysql -h $HOST -u $USER -p$PASS -N -e "SHOW TABLES WHERE Tables_in_$DB NOT IN ($EXCLUDE)" $DB | xargs mysqldump -v -h $HOST -u $USER -p$PASS $DB | gzip
EOF

如果你不想保存.gz,只需通过gzip -d

ssh bastion.mycompany.com <<EOF | gzip -d > $FILE etc

或直接到您当地的数据库:

ssh bastion.mycompany.com <<EOF | gzip -d | mysql -uroot myapp_development