24 votes

Comment puis-je transférer des données entre 2 bases de données MySQL ?

Je veux le faire en utilisant un code et non un outil comme "MySQL Migration Toolkit". La méthode la plus simple que je connaisse est d'ouvrir une connexion (en utilisant les connecteurs MySQL) à DB1 et de lire ses données. Ouvrir une connexion à DB2 et y écrire les données. Existe-t-il un moyen plus efficace/plus simple ?

22voto

Recurse Points 2019

Tout d'abord, je vais supposer que vous n'êtes pas en mesure de simplement copier les données/répertoire, car si c'est le cas, l'utilisation de votre snapshot/sauvegarde/restauration existant suffira probablement (et vous pourrez tester vos procédures de sauvegarde/restauration en même temps).

Dans ce cas, si les deux tables ont la même structure, l'approche la plus rapide, et ironiquement la plus facile, sera d'utiliser SELECT...INTO OUTFILE... d'un côté, et LOAD DATA INFILE... de l'autre.

Voir http://dev.mysql.com/doc/refman/5.1/en/load-data.html et .../select.html pour des détails définitifs.

Pour les tableaux triviaux, la méthode suivante fonctionnera :

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '\\\\' 
  LINES TERMINATED BY '\\n' ;

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '\\\\' 
  LINES TERMINATED BY '\\n' ;

Nous avons également utilisé les FIFO avec beaucoup d'efficacité pour éviter la surcharge de l'écriture sur le disque, ou si nous devons écrire sur le disque pour une raison quelconque, pour le faire passer par gzip.

ie.

mkfifo /tmp/myfifo
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz &
... SEL

ECT... INTO OUTFILE '/tmp/myfifo' .....
wait

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo &
... LOAD DATA INFILE /tmp/myfifo .....
wait

En gros, une fois que vous avez dirigé les données de la table vers une FIFO, vous pouvez les compresser, les condenser ou les faire transiter par un réseau à votre guise.

13voto

Wrikken Points 37727

Le moteur de stockage FEDERATED ? Ce n'est pas le plus rapide du lot, mais pour une utilisation ponctuelle, occasionnelle ou pour de petites quantités de données, il fera l'affaire. En supposant que vous parliez de 2 SERVEURS. Avec 2 bases de données sur un seul et même serveur, ce sera simplement.. :

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;

1voto

Messa Points 5988

Vous pouvez utiliser mysqldump y mysql (le client en ligne de commande). Ce sont des outils en ligne de commande et dans la question que vous écrivez, vous ne voulez pas les utiliser, mais les utiliser quand même (même en les exécutant depuis votre code) est le moyen le plus simple ; mysqldump résout beaucoup de problèmes.

Vous pouvez faire select d'une base de données et insert à l'autre, ce qui est assez facile. Mais si vous devez également transférer le schéma de la base de données ( create table etc.), cela devient un peu plus compliqué, c'est la raison pour laquelle je recommande mysqldump . Mais beaucoup d'outils d'administration PHP-MySQL font aussi cela, vous pouvez donc les utiliser ou regarder leur code.

Ou peut-être pouvez-vous utiliser la réplication MySQL.

1voto

ErichBSchulz Points 1058

De http://dev.mysql.com/doc/refman/5.0/en/rename-table.html :

Tant que deux bases de données se trouvent sur le même système de fichiers, vous pouvez utiliser RENAME TABLE pour déplacer une table d'une base de données à une autre :

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

0voto

Ycon Points 111

Si vous avez activé la journalisation binaire sur votre serveur actuel (et que vous disposez de tous les journaux binaires), vous pouvez configurer la réplication pour le second serveur.

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