mysqldump整个结构,但只包含单个命令中选定表的数据

时间:2009-11-19 16:02:48

标签: mysql mysqldump

我的数据库有3个表:table1,table2和table3

我想在以下条件下对此数据库执行mysqldump:

  • 所有表格的转储结构
  • 仅转储table1和table2的数据,忽略table3中的数据

目前,我使用2个mysqldump语句执行此操作

mysqldump -u user -p -d db > db_structure.sql
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql

按照转储的顺序(结构,然后是table1和table2中的数据)导入它们

有没有办法将它组合成一个mysqldump命令?

5 个答案:

答案 0 :(得分:40)

您不能将它们组合在一个命令中,但可以同时执行这两个命令并输出到同一个文件。

mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql

为避免必须输入密码两次,您可以执行-ppassword(请注意缺少空间!)。也可以在第一个命令中使用--no-data,或者最终得到数据。当你只做一个数据库时不需要-d。

答案 1 :(得分:6)

鉴于您可能希望将输出通过管道输出到另一个命令,而不是仅仅重定向到文件并在下一个命令中附加到该文件,您可以尝试(从stask示例中修改):

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
your_command

...在我的情况下:

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
gzip -9 > filename.sql.gz

将两个mysqldump命令括在括号中会创建一个子shell,其输出我们将其导入gzip,然后将其重定向到一个文件中。

PS:我也无法将它组合成一个单独的mysqldump调用。

答案 2 :(得分:0)

我认为你不能在一个命令中做到这一点。但你绝对可以将输出合并到一个文件。为什么不将它包装在以下的一些shell脚本中:

mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql

您将使用两个参数运行此脚本:用户名和密码。

答案 3 :(得分:0)

实际上非常简单,在表格中使用 - where子句,你不需要数据并给它一个永远错误的条件。例如,在foo和gah上加载数据,只在bar上加载模式:

mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql

所以,你可以在一条线上做到这一点。

答案 4 :(得分:0)

您可以删除INSERT INTO ...部分:

mysqldump \
  --opt \
  -u ${DB_USER} -p${DB_PASS} \
  ${DB_NAME} \
  | grep -v 'INSERT INTO `table3`' \
  | grep -v 'INSERT INTO `table4`'