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.
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.
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 :
db2
est la base de données cible, où la base de données source db1
sera copié.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]
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
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.
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.
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.
Est-ce que cela fonctionne pour une table dupliquée ? Puisque je vois que la commande est CREATE TABLE
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.
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
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
Cela permet-il également de copier les données des contraintes et d'autres propriétés des tables ?
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.
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
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
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.....
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.
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
?49 votes
Assurez-vous que vous Ne le fais pas. faites-le :
CREATE TABLE t2 SELECT * FROM t1;
car vous perdrez les informations de l'index, tout ce qui est spécial comme l'auto-incrément etc de nombreuses recherches sur google pour ce genre de copie de table vous conduiront à faire cela et cela aura des résultats non désirés.2 votes
J'utilise MySQL Workbench. Dans les Utilitaires MySQL, il y a une commande mysqldbcopy qui a fonctionné pour moi.
4 votes
@MichaelMior mysqldump est très bien pour les petites bases de données mais un vidage récent d'une base de données hautement indexée me prendra plus de 40 heures à récupérer à partir d'un vidage. C'est pourquoi MySQL enterprise dispose d'une sauvegarde d'entreprise, dont le prix est de 5 000 $. PS : Je vais fournir une réponse qui conserve l'intégrité référentielle en nous permettant d'utiliser InnoDB et d'effectuer des sauvegardes et des restaurations rapides.
0 votes
J'ajouterai également que si vous essayez de vider une grande table et que vous obtenez des erreurs de perte de connexion, vous devrez peut-être définir les variables globales de timeout sur votre base de données : set variable net_read_timeout = (secondes, la valeur par défaut est 30) set variable net_write_timeout = (secondes, la valeur par défaut est 60) essayez également d'ajouter les paramètres --single-transaction et --quick à votre commande mysqldump. Voir : dev.mysql.com/doc/refman/5.5/fr/mysqldump.html
0 votes
@JohnHunt Ces choses peuvent être ajoutées plus tard...