Duplicar banco de dados MySQL inteiro

88

É possível duplicar um banco de dados MySQL inteiro em um servidor Linux?

Eu sei que posso usar a exportação e importação, mas o banco de dados original é> 25 MB, então não é o ideal.

É possível usar o mysqldump ou duplicar diretamente os arquivos do banco de dados?

Adam Dempsey
fonte

Respostas:

172

Primeiro crie o banco de dados duplicado:

CREATE DATABASE duplicateddb;

Certifique-se de que o usuário e as permissões estejam corretos e:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 
Vincent Ramdhanie
fonte
28
Eu não acho que deveria haver um espaço entre "-p" e "senha" na 2ª parte da sua 2ª linha de comando
16
não, o espaço não deveria estar lá! A resposta está correta assim. A página de manual do mysql disse: --password [= senha], -p [senha] A senha a ser usada ao conectar ao servidor. Se você usar a forma de opção abreviada (-p), não poderá haver um espaço entre a opção e a senha. Se você omitir o valor da senha após a opção --password ou -p na linha de comando, o mysql solicitará um. Especificar uma senha na linha de comando deve ser considerado inseguro. Consulte a Seção 6.1.2.1, "Diretrizes do usuário final para P ...
nils petersohn
2
Observe que o mysqldump faz backup por padrão dos gatilhos, mas não dos procedimentos armazenados, adicione --routinescomo uma opção para este caso.
LinuxDevOps
1
Se você estiver fazendo assim e não quiser que a senha do MySQL desse usuário esteja disponível no histórico do bash, edite-a do ~/.bash_historyarquivo após executá-la. Ou você também pode produzir o resultado do primeiro comando em um arquivo temporário e executar o seguinte depois dele (que solicitará a senha) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike
1
Essa resposta certamente funciona, mas a pergunta afirma "Eu sei que posso usar a exportação e importação, mas o banco de dados original é> 25 MB, então não é o ideal" e o que essa resposta sugere é basicamente exportar e importar.
el.pescado
17

Para servidor remoto

mysqldump mydbname | ssh host2 "mysql mydbcopy"

Para o servidor local

mysqldump mydbname | mysql mydbcopy
Peter Lindqvist
fonte
ERROR 1064 (42000): Você tem um erro em sua sintaxe SQL ;, oi mostrando erro ao usar o comando no servidor local, por favor ajude
amit_game
5

Às vezes, faço um mysqldump e canalizo a saída para outro comando mysql para importá-lo para um banco de dados diferente.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
Paul Tomblin
fonte
Recebo um erro informando que o banco de dados dest não existe quando eu uso isso. Portanto, você também precisa de uma linha CREATE DATABASE.
blak3r
3

Crie um arquivo mysqldump no sistema que possui os dados e use o pipe para fornecer este arquivo mysqldump como uma entrada para o novo sistema. O novo sistema pode ser conectado usando o comando ssh.

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

sem espaço entre -p [senha]

TheNormalGuy
fonte
1
Você poderia adicionar uma descrição de como isso funciona, por exemplo, o uso do tubo?
Kalyfe
1

Aqui está um arquivo Windows Bat que escrevi que combina as sugestões de Vincent e Pauls. Ele solicita ao usuário os nomes de origem e destino.

Basta modificar as variáveis ​​na parte superior para definir os caminhos adequados para seus executáveis ​​/ portas de banco de dados.

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

Saída de amostra:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!
blak3r
fonte
1

Isso não funcionará para InnoDB. Use esta solução alternativa apenas se estiver tentando copiar bancos de dados MyISAM.

Se bloquear as tabelas durante o backup e, possivelmente, pausar o MySQL durante a importação do banco de dados for aceitável, mysqlhotcopy pode funcionar mais rápido.

Por exemplo

Cópia de segurança:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

Restaurar:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy também pode transferir arquivos por SSH (scp) e, possivelmente, direto para o diretório de banco de dados duplicado.

Por exemplo

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name
Pavel
fonte
1

Fazendo uma cópia de um banco de dados

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql
Maulik Patel
fonte
0

Isso funcionou para mim com prompt de comando, de OUTSIDE mysql shell:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

Isso me parece a melhor maneira. Se compactar "dump.sql", você pode armazená-lo simplesmente como um backup compactado. Legal! Para um banco de dados de 1 GB com tabelas Innodb, cerca de um minuto para criar "dump.sql" e cerca de três minutos para despejar dados no novo DB db2.

Copiar diretamente o diretório db (mysql / data / db1) não funcionou para mim, eu acho que por causa das tabelas InnoDB.

DrOne
fonte
-2

Era uma vez no MySQL você poderia simplesmente copiar todos os arquivos da tabela para outro diretório na árvore mysql

mysql cli - criar banco de dados db2

linux cli - cp db1 db2

DM
fonte
Isso só funciona com MyISAM, certo? Bons velhos tempos se foram.
Laurenz Albe
Bom para os livros de história, mas não muito útil mais.
JJJ