Answers:
如果要从mydb转储表t1,t2和t3
mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql
如果mydb中有大量表,并且想转储t1,t2和t3以外的所有内容,请执行以下操作:
DBTODUMP=mydb
SQL="SET group_concat_max_len = 10240;"
SQL="${SQL} SELECT GROUP_CONCAT(table_name separator ' ')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='${DBTODUMP}'"
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
TBLIST=`mysql -u... -p... -AN -e"${SQL}"`
mysqldump -u... -p... ${DBTODUMP} ${TBLIST} > mydb_tables.sql
试试看 !!!
@RoryDonohue向我指出,GROUP_CONCAT函数需要扩展其最大长度。我将会话变量group_concat_max_len添加到了答案中,最大长度为10K。谢谢@RoryDonohue。
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
为SQL="${SQL} AND table_name NOT LIKE 'foo\_%'"
。我刚刚对其进行了测试,并且可以正常工作。您可以将条件更改为'%foo%',以获取名称中包含“ foo”的所有表(包括“ food”,“ fool”等)。
--ignore-table
吗?如果是这样,从答案中删除脚本并推荐就更好了--ignore-table
吗?
Illegal use of option --ignore-table=<database>.<table>
除非我将表指定为schemaname.tablename
。
关于RolandoMySQLDBA扩展答案的注释。
他包含的脚本是包含(and table_name in
)或排除(and table_name NOT in
)表列表的好方法。
如果只需要排除一个或两个表,则可以使用以下--ignore-table
选项分别排除它们:
mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql
当您有多个表时,最好运行以下命令:
mysql databasename -u [user] -p[password] -e 'show tables like "table_name_%"'
| grep -v Tables_in
| xargs mysqldump [databasename] -u [root] -p [password] > [target_file]
或这样的想法:
mysqldump -u [user] -p[password] databasename `echo "show tables like 'table_name_%';"
| mysql -u[user] -p[password] databasename
| sed '/Tables_in/d'` > [target_file]
请记住,这些命令只能在一行中键入。
您可以使用以下命令轻松完成此操作:
mysqldump -uusername -ppassword dbname \
--ignore-table=schema.tablename1 \
--ignore-table=schema.tablename2 \
--ignore-table=schema.tablename3 > mysqldump.sql