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

我有一个.sql文件的MySQL转储。 在每个数据库之前, DROP DATABASEUSE命令中有许多数据库。

在运行的服务器上是具有相同名称的数据库。 我不想覆盖他们。 我怎样才能导入所有这些数据库的前缀,而不会丢弃任何现有的数据库/表? 但是具有前缀的现有数据库应该被覆盖。

为便于使用,我们初始化一些variables:

 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条目并replace$FILE_MYSQLDUMP的CREATE DATABASE语句:

 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) 

再一次replaceUSE语句:

 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}导入修改过的数据库转储mysql < ${FILE_MYSQLDUMP} …并且,如果你的数据库转储logging中没有任何USE或CREATE DATABASE的棘手实例,你应该覆盖匹配你的yourprefix_并创build的数据库转储文件中其他数据库的前缀版本。

打算定期做这个? 检查高级Bash脚本指南 – 它涵盖了几乎所有你需要的。

Credit + upvotes to Escape sedsearch模式的string,用于处理sed参数的eval方法。