我想使用通配符导出以某个前缀开头的表列表。
理想情况下,我会这样做:
mysqldump -uroot -p mydb table_prefix_* > backup.sql
显然那是行不通的。但是这样做的正确方法是什么?
我想使用通配符导出以某个前缀开头的表列表。
理想情况下,我会这样做:
mysqldump -uroot -p mydb table_prefix_* > backup.sql
显然那是行不通的。但是这样做的正确方法是什么?
如果它有前缀,则使用 GRANT 使用户具有对表的选择和锁定权限,如下所示
GRANT SELECT, LOCK TABLES ON `table\_prefix\_%` . * TO 'backup-user'@'localhost';
然后不是以 root 身份运行 mysql dump,而是使用选项 --all-databases 以备份用户身份运行它
由于备份用户仅对这些表具有选择和锁定权限,因此它们是唯一存在的。
使用这样的用户而不是root帐户也更安全
好的。这是一个使用 Bash 脚本的解决方案(我已经在 Linux 中对其进行了测试)。
创建一个名为“ dumpTablesWithPrefix.script ”的文本文件并将其放入其中:
tableList=$(mysql -h $1 -u $2 -p$3 $4 -e"show tables" | grep "^$5.*" | sed ':a;N;$!ba;s/\n/ /g')
mysqldump -h $1 -u $2 -p$3 $4 $tableList
保存它,并使其可执行:
$ chmod +x dumpTablesWithPrefix.script
现在你可以运行它了:
$ ./dumpTablesWithPrefix.script host user pwd database tblPrefix > output.sql
现在让我解释每一部分:
Bash 脚本将命令行参数存储在变量$1
、$2
等$3
中。所以我需要告诉你的第一件事是你需要的参数的顺序:
localhost
)我将把这条线分成三部分:
mysql -h $1 -u $2 -p$3 $4 -e"show tables"
这部分检索数据库的完整表列表,每行一个表。
| grep "^$5.*"
这部分使用您指定的前缀过滤表列表。
| sed ':a;N;$!ba;s/\n/ /g'
这最后一块(我在这里找到的一个宝石:如何使用 sed 替换换行符 (\n)?)用空格替换所有“换行符”字符。
这三块串在一起,抛出过滤后的表格列表,并存储在tableList
变量中。
mysqldump -h $1 -u $2 -p$3 $4 $tableList
这一行只是执行您需要的 MySQL Dump 命令。
希望这可以帮助