Como podemos restaurar o banco de dados mysql com nome diferente do arquivo mysqldump. Não quero abrir o arquivo de despejo e editá-lo. Algum outro método melhor?
Como podemos restaurar o banco de dados mysql com nome diferente do arquivo mysqldump. Não quero abrir o arquivo de despejo e editá-lo. Algum outro método melhor?
Respostas:
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 !!!
ALTER DATABASE ... CHARACTER SET ...
nele, o que está interrompendo minha importação. Edit: Oracle está basicamente ignorando o bug .
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.
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.
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.
Se o arquivo é o que você tem na mão e você está manipulando-o a partir de um shell / console, eu usaria sed
para fazer substituições de corda em linhas começando com CREATE DABATASE
, CREATE TABLE
, USE
e 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
, --databases
ou suas versões curtas -A
ou -B
não foram utilizados.
--no-create-db
e sem --database
ou --databases
.
Se você fizer um dump usando as duas regras a seguir:
--databases
, --database
e simplesmente basta colocar o nome da base ao final do comando sem estas opções.--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-create-db
e sem --database
ou --databases
.
Aqui está o script de shell que permitirá adicionar sufixo / afixo a todos os nomes de esquema em tempo real.
-Ddb2
não deve ter um hífen na frente. Pelo menos, recebi um erro de sintaxe do MySQL quando o incluí.