У меня есть дамп mysql в файле .sql. В нем много баз данных с DROP DATABASE
и USE
команды перед каждой базой данных.
На работающем сервере находятся одноименные базы данных. Я не хочу их перезаписывать. Как я могу импортировать все эти базы данных с префиксом и не удаляя существующие базы данных / таблицы? Но существующие базы данных с префиксом должны быть перезаписаны.
Давайте инициализируем некоторые переменные для простоты использования:
DB_PREFIX=yourprefix_
FILE_MYSQLDUMP=/path/to/mysqldump.sql
Теперь получите список существующих баз данных (исключая таблицы, начинающиеся с префикса, который вы не против перезаписи, а также таблицы information_schema и mysql, которых, вероятно, не должно быть в mysqldump.sql):
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 записи (yikes) у вас должны быть перезаписанные базы данных, соответствующие yourprefix_
и создал префиксные версии других баз данных в файле дампа.
Планируете делать это регулярно? Проверьте Расширенное руководство по сценариям на Bash - это обложки почти все что тебе нужно.
Кредит + голоса за Экранировать строку для шаблона поиска sed для eval
способ обращения sed
аргументы.