Eu gostaria de escrever um script que copie meu banco sitedb1
de dados atual para sitedb2
a mesma instância de banco de dados mysql. Eu sei que posso despejar o sitedb1 em um script sql:
mysqldump -u root -p sitedb1 >~/db_name.sql
e importe-o para sitedb2
. Existe uma maneira mais fácil, sem despejar o primeiro banco de dados em um arquivo sql?
Respostas:
Como o manual diz em Copiando Bancos de Dados, você pode canalizar o dump diretamente no cliente mysql:
Se você estiver usando o MyISAM, poderá copiar os arquivos, mas eu não o recomendaria. É um pouco desonesto.
Integrado a partir de várias outras boas respostas
Ambos os comandos
mysqldump
emysql
aceitam opções para definir detalhes da conexão (e muito mais), como:Além disso, se o novo banco de dados ainda não existir, você deverá criá-lo previamente (por exemplo, com
echo "create database new_db_name" | mysql -u <dbuser> -p
).fonte
mysqldump -uroot -p database1 | mysql -uroot -p database2
. Eu sou solicitado para ambos os pws, mas só pode colocar em um. Os olhares rápidos como este:Enter password: Enter password:
. Depois de dar a primeira senha, o processo espera para sempre.Usando utilitários MySQL
Os MySQL Utilities contêm a boa ferramenta
mysqldbcopy
que, por padrão, copia um banco de dados, incluindo todos os objetos relacionados ("tabelas, visualizações, gatilhos, eventos, procedimentos, funções e concessões no nível do banco de dados") e dados de um servidor de banco de dados para o mesmo ou para outro Servidor de banco de dados. Existem muitas opções disponíveis para personalizar o que é realmente copiado.Então, para responder à pergunta do OP:
fonte
mysqldump
solução baseada estava falhando.sudo apt-get install mysql-utilities
, mas isso é muito legal. Posso deixar de fora a senha e ser solicitado a digitá-la?mysqldbcopy
solicitar a senha; pelo menos não consegui encontrar nada parecido na documentação. Você mesmo pode criar essa funcionalidade. Em Bash que podem olhar um pouco como este:mysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)"@localhost --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)"@localhost sitedb1:sitedb2
--force
aomysqldbcopy
comando porque já havia criado o banco de dados de destino. Obrigado!fonte
Você precisa executar o comando no terminal / prompt de comando.
por exemplo:
mysqldump -u root test_db1 | mysql -u root test_db2
Isso copia test_db1 para test_db2 e concede o acesso ao 'root' @ 'localhost'
fonte
A maneira mais fácil e fácil é inserir esses comandos no seu terminal e definir permissões para o usuário root. Funciona para mim..!
fonte
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
pode ser problemática com bancos de dados grandes.Você pode usar (em pseudocódigo):
O motivo pelo qual não estou usando a sintaxe CREATE TABLE ... SELECT ... é preservar os índices. Claro que isso apenas copia tabelas. As visualizações e os procedimentos não são copiados, embora possam ser feitos da mesma maneira.
Consulte CRIAR TABELA .
fonte
Primeiro, crie o banco de dados duplicado:
Verifique se as permissões, etc., estão todas no lugar e:
fonte
Você pode fazer algo como o seguinte:
fonte
Esta declaração foi adicionada no MySQL 5.1.7, mas foi considerada perigosa e foi removida no MySQL 5.1.23. O objetivo era permitir que a atualização de bancos de dados anteriores à 5.1 usasse a codificação implementada na 5.1 para mapear nomes de banco de dados para nomes de diretório de banco de dados. No entanto, o uso dessa instrução pode resultar na perda do conteúdo do banco de dados, motivo pelo qual foi removida. Não use RENAME DATABASE em versões anteriores nas quais ele está presente.
Para executar a tarefa de atualizar nomes de banco de dados com a nova codificação, use ALTER DATABASE db_name ATUALIZAR NOME DO DIRETÓRIO DE DADOS: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html
fonte
Uma maneira simples de fazer isso se você instalou o phpmyadmin :
Vá para o seu banco de dados, selecione a guia "operação" e você pode ver o bloco "copiar banco de dados para". Use-o e você pode copiar o banco de dados.
fonte
Conforme mencionado na resposta de Greg ,
mysqldump db_name | mysql new_db_name
é a maneira gratuita, segura e fácil de transferir dados entre bancos de dados. No entanto, também é muito lento .Se você deseja fazer backup de dados, não pode perder dados (neste ou em outros bancos de dados) ou está usando tabelas diferentes
innodb
, então você deve usá-lomysqldump
.Se você estiver procurando por algo para desenvolvimento, faça backup de todos os seus bancos de dados em outros lugares e se sinta confortável em limpar e reinstalar
mysql
(possivelmente manualmente) quando tudo der errado, talvez eu tenha a solução para você.Como não consegui encontrar uma boa alternativa, construí um script para fazer isso sozinho. Eu gastei muito tempo fazendo com que isso funcionasse pela primeira vez e sinceramente me aterroriza um pouco para fazer alterações agora. Os bancos de dados Innodb não foram copiados e colados dessa maneira. Pequenas mudanças fazem com que isso falhe de maneiras magníficas. Não tive problemas desde que finalizei o código, mas isso não significa que você não terá.
Sistemas testados (mas ainda podem falhar):
O que faz
sudo
privilégio e verifica se você tem espaço de armazenamento suficiente para clonar o banco de dadosComo ele se compara com
mysqldump
Em um banco de dados de 3 GB, usar
mysqldump
emysql
levaria de 40 a 50 minutos na minha máquina. Usando esse método, o mesmo processo levaria apenas 8 minutos.Como usamos
Temos nossas alterações de SQL salvas junto com nosso código e o processo de atualização é automatizado tanto na produção quanto no desenvolvimento, com cada conjunto de alterações fazendo um backup do banco de dados para restaurar se houver erros. Um problema que encontramos foi quando estávamos trabalhando em um projeto de longo prazo com alterações no banco de dados e tivemos que trocar de ramificações no meio dele para corrigir um bug ou três.
No passado, usamos um único banco de dados para todas as filiais e precisávamos reconstruir o banco de dados sempre que passávamos para uma filial que não era compatível com as novas alterações no banco de dados. E quando voltamos, teríamos que executar as atualizações novamente.
Tentamos
mysqldump
duplicar o banco de dados para diferentes ramificações, mas o tempo de espera foi muito longo (40 a 50 minutos) e, enquanto isso, não podíamos fazer mais nada.Essa solução reduziu o tempo de clone do banco de dados para 1/5 do tempo (pense no café e no banheiro em vez de um almoço longo).
Tarefas comuns e seu tempo
A alternância entre ramificações com alterações incompatíveis no banco de dados leva mais de 50 minutos em um único banco de dados, mas não há tempo após o tempo de configuração inicial com
mysqldump
ou com esse código. Esse código é aproximadamente 5 vezes mais rápido quemysqldump
.Aqui estão algumas tarefas comuns e aproximadamente quanto tempo elas levariam com cada método:
Crie uma ramificação de recursos com alterações no banco de dados e mescle imediatamente:
mysqldump
: 50-60 minutosCrie uma ramificação de recurso com alterações no banco de dados, mude
master
para uma correção de bug, faça uma edição na ramificação de recurso e mescle:mysqldump
: 50-60 minutosCrie uma ramificação de recurso com alterações no banco de dados, alterne
master
para uma correção de bug 5 vezes enquanto faz edições na ramificação de recurso entre elas e mescle:mysqldump
: 50-60 minutosO código
Não use isso, a menos que você tenha lido e compreendido tudo acima.
Se tudo correr bem, você verá algo como:
fonte
Além da resposta de Greg , esta é a maneira mais fácil e rápida se
new_db_name
ainda não existir:fonte
Se você tiver gatilhos no banco de dados original, poderá evitar o erro "O gatilho já existe" canalizando uma substituição antes da importação:
fonte
Eu não acho que exista um método para fazer isso. Quando o PHPMyAdmin faz isso, ele despeja o banco de dados e o insere novamente com o novo nome.
fonte