Duplicar toda la base de datos MySQL

92

¿Es posible duplicar una base de datos MySQL completa en un servidor linux?

Sé que puedo exportar e importar, pero la base de datos original es> 25 MB, por lo que no es ideal.

¿Es posible usar mysqldump o duplicar directamente los archivos de la base de datos?

Adam Dempsey
fuente

Respuestas:

177

Primero cree la base de datos duplicada:

CREATE DATABASE duplicateddb;

Asegúrese de que el usuario y los permisos estén en su lugar y:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 
Vincent Ramdhanie
fuente
29
No creo que deba haber un espacio entre "-p" y "contraseña" en la segunda parte de la segunda línea de comando
16
no, el espacio no debería estar ahí! La respuesta es correcta así. La página de manual de mysql decía: --password [= contraseña], -p [contraseña] La contraseña que se utilizará al conectarse al servidor. Si usa la forma de opción corta (-p), no puede tener un espacio entre la opción y la contraseña. Si omite el valor de la contraseña después de la opción --password o -p en la línea de comando, mysql solicita una. La especificación de una contraseña en la línea de comando debe considerarse insegura. Consulte la Sección 6.1.2.1, "Pautas para el usuario final de P ...
nils petersohn
2
Tenga en cuenta que mysqldump hace una copia de seguridad por defecto de los disparadores pero no de los procedimientos almacenados, agregue --routinescomo una opción para este caso.
LinuxDevOps
1
Si lo está haciendo así y no desea que la contraseña de MySQL de este usuario esté disponible en el historial de bash, edítela de su ~/.bash_historyarchivo después de ejecutarla. O también puede enviar el resultado del primer comando a un archivo temporal y ejecutar lo siguiente después (que le pedirá la contraseña) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike
1
Esta respuesta ciertamente funciona, pero la pregunta dice: "Sé que puedo usar la exportación e importación, pero la base de datos original es> 25 MB, por lo que no es ideal" y lo que sugiere esta respuesta es básicamente exportar e importar.
el.pescado
17

Al servidor remoto

mysqldump mydbname | ssh host2 "mysql mydbcopy"

Al servidor local

mysqldump mydbname | mysql mydbcopy
Peter Lindqvist
fuente
ERROR 1064 (42000): Tiene un error en su sintaxis SQL; Hola, muestra un error al usar el comando en el servidor local, por favor ayude
amit_game
5

A veces hago un mysqldump y canalizo la salida a otro comando mysql para importarlo a una base de datos diferente.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
Paul Tomblin
fuente
Recibo un error de que la base de datos dest no existe cuando uso esto. Por lo tanto, también necesita una línea CREATE DATABASE.
blak3r
3

Cree un archivo mysqldump en el sistema que tenga los datos y use pipe para dar este archivo mysqldump como entrada al nuevo sistema. El nuevo sistema se puede conectar mediante el comando ssh.

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

sin espacio entre -p [contraseña]

TheNormalGuy
fuente
1
¿Podría agregar una descripción de cómo funciona esto, por ejemplo, el uso de la tubería?
Kalyfe
1

Aquí hay un archivo bat de Windows que escribí que combina las sugerencias de Vincent y Paul. Solicita al usuario los nombres de origen y destino.

Simplemente modifique las variables en la parte superior para establecer las rutas adecuadas a sus ejecutables / puertos de base de datos.

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

Salida de muestra:

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
fuente
1

Esto no funcionará para InnoDB. Utilice esta solución alternativa solo si está intentando copiar bases de datos MyISAM.

Si bloquear las tablas durante la copia de seguridad y, posiblemente, pausar MySQL durante la importación de la base de datos es aceptable, mysqlhotcopy puede funcionar más rápido.

P.ej

Apoyo:

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

Restaurar:

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

mysqlhotcopy también puede transferir archivos a través de SSH (scp) y, posiblemente, directamente al directorio de la base de datos duplicada.

P.ej

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

Hacer una copia de una base de datos

# 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
fuente
0

Esto funcionó para mí con el símbolo del sistema, desde FUERA del shell mysql:

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

Esto me busca de la mejor manera. Si comprime "dump.sql", simplemente puede almacenarlo como una copia de seguridad comprimida. ¡Frio! Para una base de datos de 1GB con tablas Innodb, alrededor de un minuto para crear "dump.sql" y alrededor de tres minutos para volcar datos en la nueva base de datos db2.

La copia directa del directorio db del agujero (mysql / data / db1) no funcionó para mí, supongo que debido a las tablas InnoDB.

Zumbido
fuente
-2

Érase una vez en MySQL, simplemente podía copiar todos los archivos de la tabla a otro directorio en el árbol de mysql

mysql cli - crear base de datos db2

linux cli - cp db1 db2

DM
fuente
Eso solo funciona con MyISAM, ¿verdad? Bueno, esos viejos tiempos se han ido.
Laurenz Albe
Buena para los libros de historia, pero ya no es muy útil.
JJJ