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 ?
Réponses
Trop de publicités?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.
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;
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.
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;