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


83

我正在清理这个庞大而混乱的数据库。它可以容纳500多个表,这是将Magento Enterprise和Joomla合并到一个数据库中的结果。

更糟糕的是,有一组70多个Joomla表完全没有使用。这些都以开头bak_

只需删除这些bak_表将很容易,但是我想先将其“ bak”起来(看我在那里做了什么?)。在我看来,我可以想象这样的命令:

mysqldump -u username -p mydatabase bak_*

但这是行不通的。最好的方法是什么?谢谢!

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


答案是通过查询选择该表并通过mysqldump传递该查询,因为mysqldump不支持正则表达式。谢谢您好运
Daric 2011年

1
我想回答你的问题就在这里:stackoverflow.com/questions/2949330/...
raghu

@minaz给出的答案显然比当前标记为最佳的答案更好。如果您同意的话,将有助于将其标记为更好。
Dan Dascalescu 2012年

Answers:


119

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

4
但是无论哪种方式,我都必须列出要忽略的70个表或要包括的430个表。这就是我要避免做的事情。我的问题应该更清楚一些,但感谢您的回答。这项工作是,是;)
thaddeusmt 2011

1
另一个想法是使用诸如“mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt编辑文件”之类的方法将表放入文件中,并将所有数据库归为一行。然后做mysqldump dbname `cat tables.txt`
sreimer 2011年

我最终只是删除了bak_表,但仍然使用它来获取表列表。然后我用逗号将它们组合在一起以创建一个大的DROP TABLE语句gawk '{print $1"," }' tables.txt > baktables.sql。谢谢!
thaddeusmt 2011年

有什么办法可以做到这一点吗?即:不使用临时文件作为中介?
Tom Auger

3
会做到这一点mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer 2011年

59

这是一个简单的方法:

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

4
它应该是show tables like "<prefix>\_%",因为_也是一个通配符,应当逃脱......否则你会得到一个问题与具有相同前缀的前缀像bak_和bak2_表将双方的比赛上bak_%
再氧化

5
您可以将-N传递给mysql,而无需运行grep来过滤出该Tables_in行。
Dan Dascalescu 2012年

1
为我工作,但使用mysql -NB。
wesamly 2015年

如果不show tables like "bak\_%"返回任何内容,则将所有数据库转储。有什么办法可以防止这种情况?
Seb33300 '19

56

我的最爱:

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

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


11
对于那些谁是好奇,这些标志都是-B一批-e执行-s安静模式(减少输出) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
JSH

我喜欢这个。我已经回到这里很多次了!
杰森·加洛滕

有点麻烦:对于mysqldump和mysql命令,您可能必须填写用户名和密码参数。而且,如果mysql调用失败,则mysqldump默认将转储整个数据库,这可能会很大,尤其是在您倾向于仅转储一部分数据的情况下。
gwideman

这不起作用mysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
cloudbud

2

另一个oneliner用来提取表名称列表,mysql -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

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%)从数据库将表转储到单个文件。希望有人会发现它有用。


2

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

注意,这是一个半熟的工具,因此您需要确保它支持所需的功能,并且正确执行了这些功能(例如,从MySQL 5.7.12开始,触发器导出已损坏)。


3
原来“ mysqlpump”不是错字。dev.mysql.com/doc/refman/5.7/en/mysqlpump.html。是的,--include-tables abc%选项确实允许使用通配符指定要转储的表。但是似乎没有办法使mysqlpump排除视图。是的,确实是半生不熟的。
gwideman

1

在这里基于其他一些不错的答案的基础上,我创建了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

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

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.