我正在尝试转储我们数据库中所有表的结构,然后只转储我特别想要的那些数据,但我似乎做错了,因为我没有得到为其创建的空表我从数据转储中排除的那些。
我有一个文本文件,它指定我要转储数据的表(称为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查询结果中包含的所有表的转储,但我没有得到其余表的结构。
如果我只将结构部分作为单个命令运行,那么工作正常,我会为所有表转储结构。但是将它与数据转储相结合似乎不起作用。
你能指点一下我出错的地方吗?
感谢。
答案 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