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

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

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

只要删除这些bak_表格就容易了,但是我想首先把它们bak_ (看看我在那里做了什么?)。 在我看来,我可以像这样描绘一个命令:

 mysqldump -u username -p mydatabase bak_* 

但是这不起作用。 什么是最好的方法来做到这一点? 谢谢!

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

您可以在命令行中一个接一个地指定表名,但不能使用通配符。 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 {}" 

这是一个简单的方法:

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

我的最爱:

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

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

另一个oneliner用mysql -sN … -sN提取表名的列表,然后在“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 

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

 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%这样的掩码转换为单个文件。 希望有人会发现它有用。

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

请注意,这是一个不完整的工具,因此您将确保它支持所需的function,并且正确执行它(例如从MySQL 5.7.12开始,触发器导出已损坏)。

build立在这里的其他一些很好的答案,我创build了shell脚本,使这更容易。 该脚本在输出中生成3个文件 – 一个具有所有表格的结构,一个具有所有非排除表格的数据,另一个具有所有“排除”表格的数据(如果您真的不这样做,需要它)。 然后你可以使用你需要的那一个。

 #!/bin/bash echo -n "DB Password: " read -s PASSWORD HOST=yourhostname.com USER=youruser DATABASE=yourdatabase MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';") STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';") echo "Dumping structure..." mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz echo "Dumping main data..." mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz echo "Dumping big table data..." mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz 

我的解决scheme

 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'`