Dupliquer toute la base de données MySQL

88

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

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

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

Adam Dempsey
la source

Réponses:

172

Créez d'abord la base de données dupliquée:

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; 
Vincent Ramdhanie
la source
28
Je ne pense pas qu'il devrait y avoir un espace entre "-p" et "password" dans la 2ème partie de votre 2ème ligne de commande
16
non l'espace ne doit pas être là! La réponse est correcte comme ça. La page de manuel mysql disait: --password [= mot de passe], -p [mot de passe] Le mot de passe à utiliser lors de la connexion au serveur. Si vous utilisez la forme d'option courte (-p), vous ne pouvez pas avoir d'espace entre l'option et le mot de passe. Si vous omettez la valeur du mot de passe après l'option --password ou -p sur la ligne de commande, mysql en demande une. La spécification d'un mot de passe sur la ligne de commande doit être considérée comme non sécurisée. See Section 6.1.2.1, «End-User Guidelines for P ...
nils petersohn
2
Notez que mysqldump sauvegarde par défaut les déclencheurs mais pas les procédures stockées, ajoutez --routinesen option pour ce cas.
LinuxDevOps
1
Si vous le faites comme ça et que vous ne voulez pas que le mot de passe MySQL de cet utilisateur soit disponible dans l'historique bash, modifiez-le hors de votre ~/.bash_historyfichier après l'avoir exécuté. Ou vous pouvez également afficher le résultat de la première commande dans un fichier temporaire et exécuter ce qui suit après (ce qui vous demandera le mot de passe) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike
1
Cette réponse fonctionne certainement, mais la question indique "Je sais que je peux utiliser l'exportation et l'importation, mais la base de données d'origine est> 25 Mo donc ce n'est pas idéal" et ce que cette réponse suggère est essentiellement l'exportation et l'importation.
el.pescado
17

Vers le serveur distant

mysqldump mydbname | ssh host2 "mysql mydbcopy"

Vers le serveur local

mysqldump mydbname | mysql mydbcopy
Peter Lindqvist
la source
ERREUR 1064 (42000): Vous avez une erreur dans votre syntaxe SQL ;, salut montrant une erreur lors de l'utilisation de la commande sur le serveur local, veuillez aider
amit_game
5

Je fais parfois un mysqldump et dirige la sortie dans 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
Paul Tomblin
la source
J'obtiens une erreur indiquant que la base de données dest n'existe pas lorsque j'utilise ceci. Vous avez donc également besoin d'une ligne CREATE DATABASE.
blak3r
3

Créez un fichier mysqldump dans le système qui contient les données et utilisez pipe pour donner ce fichier mysqldump comme entrée au nouveau système. Le nouveau système peut être connecté à l'aide de 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]

TheNormalGuy
la source
1
Pourriez-vous ajouter une description de la façon dont cela fonctionne, par exemple l'utilisation du tuyau?
kalyfe
1

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

Modifiez simplement les variables en haut pour définir les chemins appropriés vers 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!!!
blak3r
la source
1

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 mise en pause 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 via SSH (scp) et, éventuellement, directement dans le répertoire de la base de données dupliquée.

Par exemple

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

Faire une copie d'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
Maulik Patel
la source
0

Cela a fonctionné pour moi avec l'invite de commande, de l'extérieur du 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

Cela me semble le meilleur moyen. Si vous zippez "dump.sql", vous pouvez le stocker sous forme de 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 le nouveau DB db2.

Copier directement le répertoire de la base de données de trou (mysql / data / db1) ne fonctionnait pas pour moi, je suppose à cause des tables InnoDB.

Drone
la source
-2

Il était une fois dans MySQL, vous pouviez simplement copier tous les fichiers de la table dans un autre répertoire de l'arborescence mysql

mysql cli - créer la base de données db2

linux cli - cp db1 db2

DM
la source
Cela ne fonctionne qu'avec MyISAM, non? Bon, ces mauvais vieux jours sont partis.
Laurenz Albe
Bon pour les livres d'histoire, mais plus très utile.
JJJ