Mysqldump只有具有某些前缀/ Mysqldump通配符的表?

时间:2011-03-11 04:25:01

标签: mysql mysqldump

我正在清理这个庞大而混乱的数据库。它包含500多个表,这是将Magento Enterprise与Joomla合并在一个数据库中的结果。

更糟糕的是,有一组70多个Joomla表根本没有使用。这些都以bak_为前缀。

只是删除这些bak_表格很容易,但我想首先“b”他们(看看我在那里做了什么?)。在我看来,我可以想象一个这样的命令:

mysqldump -u username -p mydatabase bak_*

但这不起作用。最好的方法是什么?谢谢!

编辑:是的,我可以明确列出要包含的70个表,或者排除〜430个表,但如果可能的话,我正在寻找更好的方法。

10 个答案:

答案 0 :(得分:102)

您可以在命令行上依次指定表名,但不使用通配符。 mysqldump databasename table1 table2 table3

如果时间更短,您也可以使用--ignore-table

另一个想法是将表格放入一个类似

的文件中
mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

编辑文件并将所有数据库放到一行。然后做

mysqldump dbname `cat tables.txt` > dump_file.sql

要将表格放在一行(不推荐),您可以执行以下操作

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

答案 1 :(得分:54)

这是一个简单的方法:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

答案 2 :(得分:48)

我的最爱:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

所有答案都采用几乎相同的方法,但这是最简洁的语法。

答案 3 :(得分:2)

使用mysql -sN …提取表名称列表的另一个oneliner然后使用“for ... in ...”shell循环中的每个项目删除它们:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

或(扩展版)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

或者使用“group_concat”来连接表的名称,如果它们足够短的话:

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

*某些限制,例如“group_concat_max_len”的值(通常等于1024,参见70个表格)可能会产生干扰。


相同的原则,但是为了转储除“bak _”以外的所有表:

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done

答案 4 :(得分:2)

已经有很多好的答案,但我带着这样的变化来到这里:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

通过此操作,我将掩码,如%mask%从数据库转换为单个文件。 希望有人会发现它很有用。

答案 5 :(得分:2)

从MySQL 5.7开始,mysqlpump工具支持使用模式进行表名过滤。

请注意,它是一个半生不熟的工具,因此您将确保它支持所需的功能,并确保它正确执行(例如,从MySQL 5.7.12开始,触发器导出被破坏)。

答案 6 :(得分:2)

这对我有用

mysqldump -u USER -p DATABASE $(mysql -u USER -p -D DATABASE -Bse "show tables like 'PREFIX%'") > /tmp/DATABASE.sql

答案 7 :(得分:1)

在此处基于其他一些不错的答案,我创建了shell脚本,使这更容易。此脚本在输出中生成3个文件 - 一个包含所有表的结构,一个包含所有非排除表的数据,另一个包含所有“排除”表的数据(如果您真的不喜欢,可以对此进行评论)需要它)。然后你可以使用你需要的那个。

DateDiff('d')

答案 8 :(得分:0)

我的解决方案:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`

答案 9 :(得分:0)

mysql数据库-u用户名-p -e'显示类似“ PREFIX%”的表' grep -v Tables_in | xargs mysqldump数据库-u用户名-p> DUMP.sql