我在 .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
参数的方法。