我想使用通配符导出以特定前缀开头的表列表。
理想情况下,我会这样做:
mysqldump -uroot -p mydb table_prefix_* > backup.sql
显然这不起作用。但是这样做的正确方法是什么?
答案 0 :(得分:1)
如果它有前缀,请使用GRANT这样的用户选择具有select和lock权限的用户
GRANT SELECT, LOCK TABLES ON `table\_prefix\_%` . * TO 'backup-user'@'localhost';
然后不是以root身份运行mysql dump,而是使用选项--all-databases
将其作为backup-user运行由于备份用户只对这些表具有选择和锁定权限,因此它们是唯一存在的权限。
使用像这样的用户而不是root账号来更安全
答案 1 :(得分:0)
确定。这是一个使用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'
最后一块(我在这里找到的一块宝石:How can I replace a newline (\n) using sed?)用空格替换所有“新行”字符。
将这三个部分串在一起,抛出过滤后的表格列表并将其存储在tableList
变量中。
mysqldump -h $1 -u $2 -p$3 $4 $tableList
这一行只是执行您需要的MySQL Dump命令。
希望这有帮助