mysql:从带前缀的 sql dump 导入多个数据库

mysql:从带前缀的 sql dump 导入多个数据库

我在 .sql 文件中有一个 mysql 转储。其中有许多数据库,每个数据库前都有DROP DATABASE和命令。USE

正在运行的服务器上有同名的数据库。我不想覆盖它们。如何导入所有这些带前缀的数据库而不删除任何现有数据库/表?但带有前缀的现有数据库应该被覆盖。

答案1

为了方便使用,让我们初始化一些变量:

DB_PREFIX=yourprefix_
FILE_MYSQLDUMP=/path/to/mysqldump.sql

现在获取现有数据库的列表(不包括以您不介意覆盖的前缀开头的表以及可能不应该在 mysqldump.sql 中的 information_schema 和 mysql 表):

echo "SHOW DATABASES;" \
| mysql \
| egrep -v "^(Database|information\_schema|mysql|${DB_PREFIX}(.*))$" \
> /var/tmp/existing_databases

现在循环遍历条目existing_databases并替换中的 CREATE DATABASE 语句$FILE_MYSQLDUMP

while read DB_NAME;
do
  ARG_SED="-i 's/CREATE DATABASE \`"${DB_NAME}"\`/CREATE DATABASE \`"${DB_PREFIX}${DB_NAME}"\`/g'";
  eval "sed ${ARG_SED} ${FILE_MYSQLDUMP}";
done < <(cat /var/tmp/existing_databases)

再次替换 USE 语句:

while read DB_NAME;
do
  ARG_SED="-i 's/USE \`"${DB_NAME}"\`/USE \`"${DB_PREFIX}${DB_NAME}"\`/g'";
  eval "sed ${ARG_SED} ${FILE_MYSQLDUMP}";
done < <(cat /var/tmp/existing_databases)

最后您可以使用...导入修改后的数据库转储mysql < ${FILE_MYSQLDUMP},并且,假设数据库转储中没有任何棘手的 USE 或 CREATE DATABASE 实例记录(哎呀)您应该覆盖匹配的数据库yourprefix_并在转储文件中创建其他数据库的前缀版本。

打算定期这样做吗?查看高级 Bash 脚本指南- 它的封面几乎您所需要的一切。

致谢 + 点赞为 sed 搜索模式转义字符串用于eval处理sed参数的方法。

相关内容