2014-01-15 24 views
3

我想转储我们的数据库中的所有表的结构,然后只有我特别想要的数据,但我似乎做错了什么我没有得到为从数据转储中排除的表创建的空表。MySQL的转储结构的所有表和数据的一些

我有一个文本文件,该文件指定我想转储(被称为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查询结果转储,但我没有得到其余的结构表格。

如果我只运行结构部分作为一个单一的命令,工作正常,我得到的结构倾倒所有表。但将它与数据转储结合起来似乎不起作用。

你能指出我到哪里去错了吗?

谢谢。

回答

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/

0

工作过乔恩的回答,但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 

如果你不想保存。广州只是把它管道gzip -d

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

,或者直接到本地数据库:

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

相关问题