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?
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.
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;
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 select
s 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 table
s, 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.
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;
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.