web-dev-qa-db-fra.com

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 en utilisant un outil comme "MySQL Migration Toolkit". Le moyen le plus simple que je connaisse est d'ouvrir une connexion (à l'aide de connecteurs MySQL) à DB1 et de lire ses données. Ouvrez la connexion à DB2 et écrivez-lui les données. Y a-t-il un moyen meilleur/plus simple?

21
Morano88

Tout d'abord, je vais supposer que vous n'êtes pas en mesure de copier simplement le répertoire data /, car si vous utilisez alors votre capture instantanée/sauvegarde/restauration existante, cela suffira probablement (et testez vos procédures de sauvegarde/restauration dans le marché). .

Dans ce cas, si les deux tables ont la même structure, généralement la plus rapide et, paradoxalement, la plus simple, consiste à utiliser SELECT ... INTO OUTFILE ... à une extrémité et LOAD DATA INFILE ... à l'autre.

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

Pour les tables triviales, ce qui suit 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é la FIFO à bon escient pour éviter les frais généraux liés à l'écriture sur le disque, ou, si nous avons besoin d'écrire sur le disque pour une raison quelconque, de la rediriger vers gzip.

c'est à dire.

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

Fondamentalement, si vous dirigez les données de la table vers un FIFO, vous pouvez les compresser, les transférer ou les transférer sur un réseau à votre guise.

20
Recurse

Le moteur de stockage FEDERATED? Pas le plus rapide du groupe, mais pour une seule fois, occasionnel ou de petites quantités de données. C'est en supposant que vous parlez de 2 serveurs. Avec 2 bases de données sur un même serveur, ce sera tout simplement:

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

Vous pouvez utiliser mysqldump et 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 (même en les exécutant à partir de votre code) est le moyen le plus simple. mysqldump résout beaucoup de problèmes.

Vous pouvez créer selects 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 base de données (create tables, etc.), cela devient un peu plus compliqué, raison pour laquelle je recommande mysqldump. Mais de nombreux outils PHP-MySQL-admin le font également, vous pouvez donc les utiliser ou consulter leur code.

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

1
Messa

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;
1
ErichBSchulz

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

0
desertwebdesigns