mysqldump整个结构,但仅在单个命令中选择表中的数据
Posted
技术标签:
【中文标题】mysqldump整个结构,但仅在单个命令中选择表中的数据【英文标题】:mysqldump entire structure but only data from selected tables in a single command 【发布时间】:2010-12-18 08:59:42 【问题描述】:我的数据库有 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
按照转储顺序导入它们(结构,然后是表 1 和表 2 中的数据)
有没有办法将它组合成一个 mysqldump 命令?
【问题讨论】:
【参考方案1】:您不能将它们组合在一个命令中,但您可以同时执行两个命令并输出到同一个文件。
mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql
为了避免输入两次密码,您可以使用-ppassword
(注意空间不足!)。还要在第一个命令中使用--no-data
,否则你最终也会得到数据。当你只做一个数据库时,不需要 -d。
【讨论】:
感谢您的回答!但是我想知道现在是否仍然不可能以更优雅的方式做到这一点。 @EmilioNicolás 我不知道-d
是--no-data
的别名,请查看docs。使用哪一个并不重要。【参考方案2】:
鉴于您可能希望像我一样将输出通过管道传输到另一个命令,而不是仅仅重定向到一个文件并在下一个命令中附加到该文件,您可以尝试(根据 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 调用中。
【讨论】:
【参考方案3】:我不认为你可以在一个命令中做到这一点。但是您绝对可以将输出合并到一个文件中。为什么不将它包装在一些执行以下操作的 shell 脚本中:
mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql
您将使用两个参数运行此脚本:用户名和密码。
【讨论】:
【参考方案4】:实际上很简单,在不需要数据的表上使用 --where 子句,并给它一个始终为假的条件。例如,在 foo 和 gah 上加载数据,在 bar 上仅加载模式:
mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql
所以是的,您可以在一行中执行此操作。
【讨论】:
【参考方案5】:您可以删除INSERT INTO ...
部分:
mysqldump \
--opt \
-u $DB_USER -p$DB_PASS \
$DB_NAME \
| grep -v 'INSERT INTO `table3`' \
| grep -v 'INSERT INTO `table4`'
【讨论】:
以上是关于mysqldump整个结构,但仅在单个命令中选择表中的数据的主要内容,如果未能解决你的问题,请参考以下文章