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?

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; 

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


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

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]


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!!!

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

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

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.


-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


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
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.