Restaurar banco de dados mysql com nome diferente


Respostas:


58

Você pode permitir que o mysqldump crie o dump de forma que ele não crie ou selecione o banco de dados.

EXEMPLO: Você está descartando o banco de dados db1 e carregando-o no banco de dados db2

Isso colocará os comandos CREATE DATABASE e USE no dump

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

Isso não colocará os comandos CREATE DATABASE e USE no dump ( é isso que você deseja )

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

Você pode carregá-lo em outro banco de dados (como db2) de uma das quatro (4) maneiras:

OPÇÃO 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

OPÇÃO 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

OPÇÃO 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

OPÇÃO 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

De uma chance !!!


Caso alguém mais tenha lutado com isso, -Ddb2não deve ter um hífen na frente. Pelo menos, recebi um erro de sintaxe do MySQL quando o incluí.
Gwg

Isso não parece funcionar. Meu despejo não possui um banco de dados CREATE ou USE, mas ainda existe ALTER DATABASE ... CHARACTER SET ...nele, o que está interrompendo minha importação. Edit: Oracle está basicamente ignorando o bug .
MPEN

5

Sou um grande fã de despejar, editar e inserir. mas você não precisa abrir o arquivo de texto (arquivo de despejo) para alterá-lo (isso é especialmente útil quando tem vários milhões de linhas). se você deseja despejar o banco de dados MYDATABASE.

mysqldump MYDATABASE > mydump.sql

use sed para substituir o antigo nome do banco de dados por um novo como este

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

então você pode simplesmente criar o novo banco de dados e importá-lo novamente, e ele criará todas as tabelas com os novos dados na MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Edit: Como algumas pessoas legais na seção de comentários apontaram, isso pode ser perigoso, se alguns dos dados também forem alterados por isso acima, portanto, para restringir maneiras de evitar isso.

1) Grep para isso no despejo, antes de alterá-lo, assim.

cat mydump.sql | grep "MYDATABASE"

e

2) podemos adicionar alguns `para torná-lo mais seguro assim:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

se alguém tiver sugestões concretas, fico feliz em editar minha resposta em mais quatro anos.


Eu acho que a pergunta era sobre restaurar um banco de dados completo, mas com um nome diferente, não apenas copiar uma tabela em um banco de dados existente.
Michael Green

3
a parte sed é necessária
Steve Buzonas

10
Esse comando é uma péssima idéia e eu votaria negativamente se pudesse. Se você estiver procurando por substituições de string, pelo menos corresponda à linha CREATE TABLE e USE para não substituir outros dados.
bksunday

11
antes de executar o comando sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql), verifique todas as ocorrências de MYDATABASE com cat mydump.sql | grep "MYDATABASE"para garantir que apenas o nome do banco de dados seja alterado, outros dados permanecem intocados.
Rafaf Tahsin 28/06

11
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # edição a vapor potencialmente mais segura. meu dump de banco de dados não contém nenhuma instrução USE ou CREATE DATABASE, mas o nome do banco de dados está em comentários, visualizações e gatilhos sql (MySQL 5.7). Isso NÃO substitui o nome do banco de dados nos comentários, mas eles não têm efeito no banco de dados resultante. Isto funcionou bem para mim.
Jonathan

3

Eu já fiz isso uma vez, há muito tempo.

Quando você exporta todos os seus dados, existe uma opção para definir o nome do banco de dados no início do arquivo, algo como: "use database x"

Então, você pode alterar esta declaração.


3

Se o arquivo é o que você tem na mão e você está manipulando-o a partir de um shell / console, eu usaria sedpara fazer substituições de corda em linhas começando com CREATE DABATASE, CREATE TABLE, USEe optionnally --(comentários mysqldump)

Substituindo o nome db nas linhas que correspondem aos comentários Criar banco de dados, Criar tabela, Usar e mysqldump

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


Obviamente, como muitas das respostas mencionadas aqui, é mais fácil se o backup do mysqldump não contiver uma linha CREATE DATABASE e uma linha USE. Significado das opções --all-databases, --databasesou suas versões curtas -Aou -Bnão foram utilizados.


No MySQL 5.7, o mysqldump inclui o nome do banco de dados em triggers e views, mesmo com --no-create-dbe sem --databaseou --databases.
Jonathan

2

Se você fizer um dump usando as duas regras a seguir:

  1. Não use opções, tais como --databases, --databasee simplesmente basta colocar o nome da base ao final do comando sem estas opções.
  2. Inclua a opção --no-create-db

Se você fizer o seguinte, o mysqldump criará o SQL sem fazer referência ao banco de dados, e poderá usar o novo nome do banco de dados no final do seu comando mysql durante a importação!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

No MySQL 5.7, o mysqldump inclui o nome do banco de dados em triggers e views, mesmo com --no-create-dbe sem --databaseou --databases.
Jonathan

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.