mysqldump 忽略带有通配符的表

mysqldump 忽略带有通配符的表

我需要转储一个包含 50 多个表的数据库,其中我想排除大约 15 个具有前缀的表exam_

我试了好mysqldump --ignore-table=dbname.exam_* 几次都--ignore-table=dbname.exam_% 没有效果,只能用好--ignore-table几次了。

编辑:我见过一些列出tables not like tablename_%并将其传递给的shell 脚本mysqldump

不过,我想知道 mysqldump 或 mysql 中是否有一个选项,这样无需编写脚本即可执行相同操作。

编辑添加:最终使用脚本转储不包括表的数据库,并使用ignore-table=多次。

答案1

不,命令中没有这样的选项mysqldump,因为文档说:

–ignore-table=db_name.tbl_name

不转储给定的表,必须使用
数据库名称和表名称指定该表。要忽略多个表,请
多次使用此选项。此选项也可用于忽略视图。

答案2

您可以从 mysql 中获取您想要的表名,然后使用它们来构建您的 mysql 转储参数。

在下面的例子中,只需将“someprefix”替换为您的前缀(例如“exam_”)。

可以修改查询SHOW TABLES以查找其他表集。或者,您可以使用针对INFORMATION_SCHEMA表的查询来使用更多条件。

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

这是在有关获取“bash 中排除的所有表”的答案的帮助下构建的:https://stackoverflow.com/a/9232076/631764

这是关于使用一些 bash 跳过表格的答案:https://stackoverflow.com/a/425172/631764

答案3

我认为使用information_schema是实现这一目标的好方法。

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';

相关内容