我有一个.sql文件的MySQL转储。 在每个数据库之前, DROP DATABASE和USE命令中有许多数据库。
在运行的服务器上是具有相同名称的数据库。 我不想覆盖他们。 我怎样才能导入所有这些数据库的前缀,而不会丢弃任何现有的数据库/表? 但是具有前缀的现有数据库应该被覆盖。
为便于使用,我们初始化一些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方法。