我试图转储数据库中所有表的结构,然后只转储我特别想要的表的数据,但我似乎做错了什么,因为我没有得到为数据转储中排除的表创建的空表。
我有一个文本文件,它指定要转储数据的表(称为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我得到显示查询结果中包含的所有表的转储,但没有得到其余表的结构。
如果我只以一个命令的形式运行结构部分,这就可以正常工作,并为所有表转储结构。但将其与数据转储相结合似乎不起作用。
你能告诉我这件事哪里出了问题吗?
谢谢。
发布于 2014-01-15 11:10:22
我认为您弄错了命令行参数的顺序(对文件的重定向应该是结束),您需要为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/
发布于 2016-08-22 23:42:39
使用Jon的答案,但是xargs中的-I将为每个表运行一个单独的mysqldump命令。只允许xargs默认值更容易,它将前一个命令的输出附加到下一个命令。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
https://stackoverflow.com/questions/21135407
复制相似问题