1

我想使用通配符导出以某个前缀开头的表列表。

理想情况下,我会这样做:

mysqldump -uroot -p mydb table_prefix_* > backup.sql

显然那是行不通的。但是这样做的正确方法是什么?

4

2 回答 2

1

如果它有前缀,则使用 GRANT 使用户具有对表的选择和锁定权限,如下所示

GRANT SELECT, LOCK TABLES ON  `table\_prefix\_%` . * TO  'backup-user'@'localhost';

然后不是以 root 身份运行 mysql dump,而是使用选项 --all-databases 以备份用户身份运行它

由于备份用户仅对这些表具有选择和锁定权限,因此它们是唯一存在的。

使用这样的用户而不是root帐户也更安全

于 2013-06-21T18:02:48.513 回答
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中。所以我需要告诉你的第一件事是你需要的参数的顺序:

  1. 主机(如果mysql服务器在你的机器上,写localhost
  2. 您的用户
  3. 你的密码
  4. 您的数据库的名称
  5. 要导出的表的前缀

脚本的第一行

我将把这条线分成三部分:

  • 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 命令。


希望这可以帮助

于 2013-06-19T23:22:11.540 回答