436 votes

Copier/dupliquer une base de données sans utiliser mysqldump

Sans accès local au serveur, existe-t-il un moyen de dupliquer/cloner une base de données MySQL (avec et sans contenu) dans une autre sans utiliser la fonction mysqldump ?

J'utilise actuellement MySQL 4.0.

1 votes

Y a-t-il une raison à l'obligation de ne pas utiliser mysqldump ? Il peut être utilisé pour se connecter à des serveurs distants si je me souviens bien.

0 votes

Si vous êtes sous Windows et que vous vous connectez à votre base de données depuis votre machine Windows, vous pouvez utiliser un outil tel que SQLyog Community (gratuit) pour faire un dump de votre table. Il fera le format mysqldump ou CSV et il peut faire la structure+données ou juste la structure.

13 votes

Quel est le problème avec mysqldump ?

689voto

Rafe Points 4602

Je peux voir que vous avez dit que vous ne vouliez pas utiliser mysqldump mais j'ai trouvé cette page en cherchant une solution similaire et d'autres pourraient la trouver aussi. Dans cette optique, voici un moyen simple de dupliquer une base de données à partir de la ligne de commande d'un serveur Windows :

  1. Créez la base de données cible en utilisant MySQLAdmin ou votre méthode préférée. Dans cet exemple, db2 est la base de données cible, où la base de données source db1 sera copié.
  2. Exécutez l'instruction suivante sur une ligne de commande :

mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2

Note : Il n'y a PAS d'espace entre -p et [password]

0 votes

Mysqldump : Got error : 1449 : L'utilisateur spécifié comme définisseur ('Root'@'127.0.0.1') n'existe pas lors de l'utilisation de LOCK TABLES

114 votes

L'affaire contre mysqldump c'est qu'il doit y avoir un moyen plus rapide que de sérialiser les données en requêtes, de transmettre les requêtes en dehors du processus et par le biais du tty pour les renvoyer dans le système de gestion des données. exactement le même processus les requêtes sont réparties et exécutées sous forme d'instructions. Cela semble horriblement inefficace et inutile . Nous ne parlons pas de passer d'un maître MySQL à l'autre ou de changer de moteur de stockage. Il est choquant qu'il n'y ait pas de transfert binaire intra-processus efficace.

43 votes

Si vous ne voulez pas enregistrer le mot de passe en clair dans l'historique de vos terminaux, vous devez scinder la commande : mysqldump -h [server] -u [user] -p db1 > db1 , mysql -h [server] -u [user] -p db2 < db1 Sinon, la demande de mot de passe fait tout foirer, du moins pour moi lorsque j'utilise Putty.

137voto

Gary Richardson Points 7371

Vous pouvez dupliquer une table sans données en exécutant :

CREATE TABLE x LIKE y;

(Voir le MySQL CREATE TABLE Docs)

Vous pourriez écrire un script qui prend la sortie de SHOW TABLES d'une base de données et copie le schéma dans une autre. Vous devriez être en mesure de référencer les noms de schémas et de tables comme suit :

CREATE TABLE x LIKE other_db.y;

En ce qui concerne les données, vous pouvez aussi le faire dans MySQL, mais ce n'est pas forcément rapide. Après avoir créé les références, vous pouvez exécuter la commande suivante pour copier les données :

INSERT INTO x SELECT * FROM other_db.y;

Si vous utilisez MyISAM, il est préférable de copier les fichiers de table ; ce sera beaucoup plus rapide. Vous devriez être en mesure de faire la même chose si vous utilisez INNODB avec par table par table par table par table .

Si vous finissez par faire un INSERT INTO SELECT , assurez-vous de temporairement désactiver les index avec ALTER TABLE x DISABLE KEYS !

EDIT Maatkit propose également quelques scripts qui peuvent être utiles pour la synchronisation des données. Ce n'est peut-être pas plus rapide, mais vous pourriez probablement exécuter leurs scripts de synchronisation sur des données en direct sans trop de blocage.

1 votes

Est-ce que cela fonctionne pour une table dupliquée ? Puisque je vois que la commande est CREATE TABLE

5 votes

Vous pouvez faire CREATE TABLE ... SELECT .

3 votes

J'ai essayé une fois de copier les fichiers de table d'une base de données MyISAM, mais cela a tout simplement corrompu la nouvelle base de données. C'est probablement ma faute, mais ce n'est certainement pas une opération aussi triviale que certains le disent.

60voto

jozjan Points 509

Si vous utilisez Linux, vous pouvez utiliser ce bash script : (il a peut-être besoin d'un nettoyage de code supplémentaire mais il fonctionne ... et il est beaucoup plus rapide que mysqldump|mysql)

#!/bin/bash

DBUSER=user
DBPASSWORD=pwd
DBSNAME=sourceDb
DBNAME=destinationDb
DBSERVER=db.example.com

fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
        createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
        fCreateTable="${fCreateTable} ; ${createTable}"
        insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
        fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME

7 votes

Si vous utilisez le script ci-dessus avec des tables InnoDB et que vous avez des clés étrangères, changez la dernière ligne par la suivante : echo "set foreign_key_checks = 0; $fCreateTable ; $fInsertData ; set foreign_key_checks = 1;" | mysql $DBCONN $DBNAME

0 votes

Cela permet-il également de copier les données des contraintes et d'autres propriétés des tables ?

1 votes

Il semble que oui, car il utilise une instruction "SHOW CREATE TABLE" qui génère une CREATE TABLE avec toutes les propriétés de l'original.

12voto

mr_app Points 470

En PHP :

function cloneDatabase($dbName, $newDbName){
    global $admin;
    $db_check = @mysql_select_db ( $dbName );
    $getTables  =   $admin->query("SHOW TABLES");   
    $tables =   array();
    while($row = mysql_fetch_row($getTables)){
        $tables[]   =   $row[0];
    }
    $createTable    =   mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error());
    foreach($tables as $cTable){
        $db_check   =   @mysql_select_db ( $newDbName );
        $create     =   $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable);
        if(!$create) {
            $error  =   true;
        }
        $insert     =   $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable);
    }
    return !isset($error);
}

// usage
$clone  = cloneDatabase('dbname','newdbname');  // first: toCopy, second: new database

0 votes

Si vous travaillez sur une machine Windows. Alors, utilisez ceci au lieu de trouver de longs moyens d'exécuter la commande.

0 votes

Ce script ne prend pas les vues en compte

4voto

furicle Points 787

Notez qu'il existe une commande mysqldbcopy faisant partie de l'add on mysql utilities..... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html

0 votes

Mais il nécessite l'installation d'un paquet supplémentaire : apt install mysql-utilities

3 votes

Mais il n'y avait pas de restriction disant que ce n'était pas possible.... et c'est une chose couramment installée (mais optionnelle comme vous le dites) S'il n'est pas installé, beaucoup trouveraient l'installation de ce paquet plus facile que la configuration et l'exécution d'un script Bash de 60 lignes, etc.....

0 votes

Votre message a probablement été rejeté parce que vous n'avez pas inclus d'autres informations qu'un lien. Les réponses sont censées être plus complètes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X