mysql: importe vários bancos de dados do sql dump com prefixo

1

Eu tenho um mysql dump em um arquivo .sql. Existem muitos bancos de dados com os comandos DROP DATABASE e USE antes de cada banco de dados.

No servidor em execução, há bancos de dados com os mesmos nomes. Eu não quero sobrescrevê-los. Como posso importar todos esses bancos de dados com um prefixo e sem descartar quaisquer bancos de dados / tabelas existentes? Mas os bancos de dados existentes com o prefixo devem ser sobrescritos.

    
por Pascal Rosin 31.01.2013 / 11:40

1 resposta

2

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.

    
por 31.01.2013 / 12:43

Tags