Je veux le faire en utilisant un code et en n'utilisant pas un outil comme "MySQL Migration Toolkit". Le moyen le plus simple que je connaisse est d'ouvrir une connexion (en utilisant des connecteurs MySQL) vers DB1 et de lire ses données. Ouvrez la connexion à DB2 et écrivez les données. Y a-t-il un moyen meilleur/plus facile?Comment puis-je transférer des données entre 2 bases de données MySQL?
Répondre
D'abord, je vais supposer que vous n'êtes pas en mesure de simplement copier le répertoire data /, car si vous utilisez votre snapshot/backup/restore existant, cela suffira probablement (et tester vos procédures de sauvegarde/restauration par-dessus le marché).
Dans ce cas, si les deux tables ont la même structure généralement la plus rapide, et ironiquement l'approche la plus simple sera d'utiliser SELECT ... INTO OUTFILE ... à une extrémité, et LOAD DATA INFILE ... on 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 suivantes 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é FIFO à grand effet pour éviter la surcharge de l'écriture en fait 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 fait, l'un de vous diriger les données de la table à une FIFO vous pouvez le comprimer, Munge, ou tunnel il à travers un réseau de contenu de votre cœur.
Merci, mais il est dans le manuel dev.mysql mais il ne fonctionne pas proberly. Il me donne cette erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '\ n' 'à la ligne 1) Il n'accepte pas' \ n '.. pourquoi? – Morano88
Stack Overflow a corrompu l'exemple de requête. Dans la source, la barre oblique dans la clause ESCAPED BY a été échappée, mais l'échappement a été perdu lors de la conversion en html. Désolé à ce sujet, je n'avais pas remarqué la corruption - je l'ai corrigé ci-dessus. – Recurse
C'est exactement ce dont j'ai besoin pour accélérer la sauvegarde d'une base de données assez volumineuse, mais je n'arrive pas à faire fonctionner votre exemple. Je peux créer le FIFO, et si je rejette sur le tuyau en utilisant mysqldump cela fonctionne très bien. Cependant, si j'essaie de vider le tube avec SELECT ... INTO OUTFILE, j'obtiens une erreur indiquant que "myfifo existe déjà". –
Le moteur de stockage FEDERATED? Pas le plus rapide dans le peloton, mais pour une fois, accessoire, ou de petites quantités de données qu'il fera. C'est en supposant que vous parlez de 2 SERVEURS. Avec 2 bases de données sur un seul et même serveur, il va être simplement:
INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
Merci beaucoup, je ne suis pas encore sûr Si les 2 bases de données sont sur le même serveur ou non. – Morano88
C'était fantastique pour ma situation. Salutations :) – Nick
A fonctionné très bien avec Amazon RDS où vous n'avez pas accès à la machine sous-jacente exécutant l'instance MySQL, excluant les solutions impliquant INFILE/OUTFILE. – Andz
Vous pouvez utiliser mysqldump
et mysql
(la ligne de commande client). Ce sont des outils de 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 faire select
s à partir d'une base de données et insert
à l'autre, ce qui est assez facile. Mais si vous avez également besoin de transférer le schéma de base de données (create table
s etc.), cela devient un peu plus compliqué, ce qui est la raison pour laquelle je recommande mysqldump
. Mais beaucoup d'outils PHP-MySQL-admin le font aussi, donc vous pouvez les utiliser ou regarder leur code. Ou peut-être que vous pouvez utiliser la réplication MySQL.
Est-ce que cela (sélectionne, insère) fonctionnera si les deux bases de données sont sur 2 serveurs différents? Non, je veux juste migrer des données, pas des créations de tables .. etc – Morano88
Oui, vous aurez deux connexions - pour chaque serveur - dans une connexion vous exécuterez SELECT, puis dans l'autre INSERT avec les données qui reviennent de ce SELECT . – Messa
Si vous avez activé l'enregistrement binaire sur votre serveur actuel (et ont tous les journaux de bin), vous pouvez la réplication de configuration pour le second serveur
de http://dev.mysql.com/doc/refman/5.0/en/rename-table.html:
Tant que deux bases de données sont sur le même système de fichiers, vous pouvez utiliser RENAME TABLE pour déplacer une table d'une base de données à l'autre:
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
deux bases de données sur le même serveur ou deux bases de données sur différents serveurs? –
@Itay: Je ne suis pas encore sûr qu'ils soient sur le même serveur ou pas? Je sais que cela fait une différence, mais je ne me suis pas posé la question.Je ferai demain. – Morano88