web-dev-qa-db-fra.com

Dupliquer toute la base de données MySQL

Est-il possible de dupliquer une base de données MySQL entière sur un serveur linux?

Je sais que je peux utiliser les fonctions d'exportation et d'importation, mais la base de données d'origine est> 25 Mo, ce qui n'est pas idéal.

Est-il possible d'utiliser mysqldump ou de dupliquer directement les fichiers de base de données?

80
Adam Dempsey

Commencez par créer la base de données en double:

CREATE DATABASE duplicateddb;

Assurez-vous que l'utilisateur et les autorisations sont tous en place et:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 
160
Vincent Ramdhanie

Vers un serveur distant

mysqldump mydbname | ssh Host2 "mysql mydbcopy"

Vers le serveur local

mysqldump mydbname | mysql mydbcopy
16
Peter Lindqvist

Je fais parfois un mysqldump et dirige la sortie vers une autre commande mysql pour l'importer dans une autre base de données.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
5
Paul Tomblin

Créez un fichier mysqldump dans le système contenant les données et utilisez pipe pour donner ce fichier mysqldump en entrée au nouveau système. Le nouveau système peut être connecté en utilisant la commande ssh.

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

pas d'espace entre -p [mot de passe]

3
JintoThomas

Voici un fichier Windows bat que j'ai écrit qui combine les suggestions de Vincent et Paul. Il invite l'utilisateur à entrer les noms de source et de destination.

Il suffit de modifier les variables en haut pour définir les chemins d'accès appropriés à vos exécutables/ports de base de données.

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

Exemple de sortie:

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
blak3r

Copier une base de données

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

Cela ne fonctionnera pas pour InnoDB . Utilisez cette solution de contournement uniquement si vous essayez de copier des bases de données MyISAM.

Si le verrouillage des tables pendant la sauvegarde et, éventuellement, la suspension de MySQL pendant l'importation de la base de données est acceptable, mysqlhotcopy peut fonctionner plus rapidement.

Par exemple.

Sauvegarde:

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

Restaurer:

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

mysqlhotcopy peut également transférer des fichiers sur SSH (scp), et éventuellement directement dans le répertoire de la base de données dupliqué.

Par exemple.

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

Cela a fonctionné pour moi avec la commande Invite, 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

Cela me semble le meilleur moyen. Si vous compressez "dump.sql", vous pouvez simplement le stocker en tant que sauvegarde compressée. Cool! Pour une base de données de 1 Go avec des tables Innodb, environ une minute pour créer "dump.sql" et environ trois minutes pour vider les données dans la nouvelle base de données db2. 

Copier directement le répertoire hole db (mysql/data/db1) ne fonctionnait pas pour moi, je suppose à cause des tables InnoDB. 

0
DrOne