Vamos inicializar algumas variáveis para facilitar o uso:
DB_PREFIX=yourprefix_
FILE_MYSQLDUMP=/path/to/mysqldump.sql
Agora, obtenha uma lista de bancos de dados existentes (excluindo as tabelas que começam com o prefixo que você não se importa em sobrescrever e as tabelas information_schema e mysql que provavelmente não deveriam estar no mysqldump.sql):
echo "SHOW DATABASES;" \
| mysql \
| egrep -v "^(Database|information\_schema|mysql|${DB_PREFIX}(.*))$" \
> /var/tmp/existing_databases
Agora percorra as entradas em existing_databases
e substitua as instruções CREATE DATABASE em $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)
E mais uma vez para substituir as instruções 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)
Finalmente você pode importar seu despejo de banco de dados revisado com mysql < ${FILE_MYSQLDUMP}
... e, desde que não haja nenhuma instância complicada de USE ou CREATE DATABASE nos registros do seu banco de dados em>> (yikes) você deve ter sobrescrito bancos de dados correspondentes a yourprefix_
e criado versões prefixadas dos outros bancos de dados no arquivo de despejo.
Planejando fazer isso regularmente? Confira o Guia avançado de script de bash - ele aborda quase tudo o que você precisa.
Crédito + upvotes para Escape de uma string para o padrão de pesquisa sed para o método eval
para manipular sed
argumentos.