Comment puis-je déplacer des tables MySQL d'un serveur physique à un autre?
Tels que ce scénario exact: J'ai un serveur MySQL qui utilise la table innodb et est d'environ 20 Go.
Je souhaite le transférer sur un nouveau serveur, quel est le moyen le plus efficace de le faire?
Réponses:
Ma méthode préférée consiste à diriger une commande sqldump vers une commande sql. Vous pouvez faire toutes les bases de données ou une spécifique. Donc, par exemple,
Vous pouvez faire toutes les bases de données avec
Le seul problème est que la base de données est trop grosse et que le tuyau se ferme. Dans ce cas, vous pouvez utiliser table par table ou l’une des méthodes mentionnées ci-dessous.
la source
netcat
.J'ai récemment déplacé une base de données de 30 Go avec la stratégie suivante:
Ancien serveur
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)Nouveau serveur
tar -xzvf mysqldata.tar.gz
)la source
Selon le Guide d’étude de la certification MySQL 5.0 , chapitre 32, section 32.3.4, pages 456, 457 décrivent les conditions de la portabilité binaire, qui permettent de dégager les éléments suivants:
Il existe deux moyens principaux, basés sur le moteur de stockage, de déplacer des tables individuelles.
Pour l'exemple donné, supposons ce qui suit:
Tables MyISAM
Si mydb.mytable utilise le moteur de stockage MyISAM, la table sera matérialisée par trois fichiers distincts.
Le .frm contient la structure de la table
Le .MYD contient les données de la table
Le .MYI contient la page d'index de la table
Ces fichiers sont utilisés de manière interdépendante pour représenter la table d'un point de vue logique dans mysql. Étant donné que ces fichiers ne sont plus associés logiquement, vous pouvez migrer une table d'un serveur de base de données à un autre. Vous pouvez même y accéder depuis un serveur Windows vers un serveur Linux ou un MacOS. Bien sûr, vous pouvez éteindre mysql et copier les 3 fichiers de la table. Vous pouvez exécuter ce qui suit:
dans une session SSH de tenir la table en lecture seule et de la verrouiller pendant 24 heures. Une seconde plus tard, effectuez la copie dans une autre session ssh. Ensuite, tuez la session mysql avec le verrou 24 heures. Vous n'avez pas besoin d'attendre 24 heures.
Tables InnoDB
Sur la base de la citation susmentionnée du livre de certification, de nombreux facteurs régissent la sauvegarde d'une table InnoDB spécifique. Par souci de simplicité, de clarté et de brièveté, effectuez simplement un mysqldump de la table souhaitée en utilisant les paramètres --single-transaction pour obtenir un dump parfait de la table à un instant précis. Inutile de vous familiariser avec la sémantique InnoDB si vous voulez juste une table. Vous pouvez recharger ce fichier de dump sur n’importe quel serveur MySQL de votre choix.
Depuis que deux questions ont été fusionnées ici (jcolebrand): EDIT
Si vous êtes prêt à vivre avec des performances de base de données lentes, vous pouvez effectuer une série de rsyncs de l’ancien serveur (ServerA) sur le nouveau serveur (ServerB) même si mysql est toujours en cours d’exécution sur ServerA.
Étape 01) installez la même version de mysql sur ServerB que ServerA
Étape 02) Sur ServerA, exécutez à
SET GLOBAL innodb_max_dirty_pages_pct = 0;
partir de mysql et environ 10 minutes (ceci purge les pages encrassées du pool de mémoire tampon InnoDB. Cela permet également d’arrêter mysql plus rapidement) Si votre base de données est entièrement en MyISAM, vous pouvez ignorer cette étape.Étape 03)
rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
Étape 04) Répétez l’étape 03 jusqu’à ce que la synchronisation prenne moins de 1 minute.
Étape 05)
service mysql stop
sur ServerAÉtape 06) Effectuez un autre rsync
Étape 07)
scp ServerA:/etc/my.cnf ServerB:/etc/
Étape 08)
service mysql start
sur ServerBÉtape 08)
service mysql start
sur le serveur A (facultatif)Essaie !!!
CAVEAT
Vous pouvez créer un esclave de réplication comme celui-ci. Rappelez-vous simplement que l'identifiant du serveur est explicitement défini dans le /etc/my.cnf maître et un numéro différent pour l'identifiant du serveur dans l'esclave /etc/my.cnf
la source
Vous n'avez même pas besoin de mysqldump si vous déplacez un schéma de base de données complet, et vous êtes prêt à arrêter la première base de données (pour que ce soit cohérent lors du transfert)
Je ne me souviens pas si mysqldump gère les utilisateurs et les permissions, ou juste les données ... mais même si c'est le cas, c'est beaucoup plus rapide que de faire un dump et de l'exécuter. Je ne l’utiliserais que si j’avais besoin de vider une base de données mysql pour la réinsérer dans un autre SGBDR, si je devais changer les options de stockage (innodb vs myisam), ou peut-être si je changeais les versions majeures de mysql (mais Je pense l'avoir fait entre 4 et 5 ans)
la source
--all-databases
dumps le schéma mysql. Le démarrage de mysql sur la machine suivante ouvre les autorisations à condition que vous ayez transféré le dossier de données vers une autre machine avec la même version majeure de MySQL. (MySQL 5.5.x à MySQL 5.5.x, MySQL 5.1.x à MySQL 5.1.x, MySQL 5.0.x à MySQL 5.0.x)mysqldump
gère les utilisateurs et les autorisations, car celles-ci sont stockées dans lemysql
schéma.Si vous voulez juste déplacer une table spécifique, essayez:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
Vous pouvez spécifier plusieurs noms de table ci-dessus, dans la même commande. Une fois la commande terminée, déplacez le fichier databasename.tablename.sql vers l'autre serveur, puis effectuez la restauration à l'aide de:
Notez que le fichier .sql précédent est créé à l'aide du programme mysqldump et que la restauration est effectuée directement dans mysql .
la source
Il se peut que vous puissiez déplacer les fichiers de base de données eux-mêmes (pour mon installation, ils se trouvent dans / var / lib / mysql), mais je ne suis pas vraiment sûr de la manière dont cela fonctionnera.
la source
Vous allez avoir besoin de prendre un temps d'arrêt. Cela va prendre un certain temps en fonction de la vitesse de votre réseau. Je vais supposer que vous utilisez MySQL sous Linux / Unix. Voici le processus que j'utilise:
Procédez ensuite comme d'habitude à la configuration de MySQL locale.
* Remarque: vous pouvez également utiliser le paramètre -c avec rsync pour ajouter une somme de contrôle au transfert. Toutefois, cette opération sera lente en fonction de la vitesse du processeur.
la source
Je peux confirmer que la méthode de DTest fonctionne également pour la copie entre Ubuntu et OSX.
Pour copier toutes les bases de données sans avoir à effectuer de dumping ou similaire:
Assurez-vous que vous avez un mysql propre de mysql (installé le fichier dmg téléchargé depuis mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), que (VERY IMPORTANT) n'a jamais été exécuté.
Copiez le contenu du dossier / var / lib / mysql / de la machine Ubuntu au-dessus de / usr / local / mysql / data / contents sur le mac. Pour avoir accès à un dossier sur la machine Ubuntu, je devais utiliser sudo, à savoir:
J'ai copié le dossier en utilisant scp.
Avant de commencer, prenez une copie du dossier mysql sur le mac pour vous assurer de ne rien gâcher.
Après avoir copié le dossier, procédez comme suit sur la machine Mac:
Démarrez le serveur mysql pour la première fois (à partir du volet des préférences sous Préférences Système-> mysql). Tous les utilisateurs et bases de données doivent maintenant être configurés correctement.
Cela a fonctionné avec mysql 5.1.61 sur Ubuntu 64 bit 11.10 et mysql 5.1.63 sur osx lion (macbook pro).
la source
Je pense que toutes les réponses précédentes fonctionnent probablement bien, mais n'abordent pas vraiment la question de la définition d'un nom de base de données pendant le transfert.
Voici comment je l'ai fait avec bash:
Vous feriez peut-être mieux d’utiliser
rsync
que descp
ne pas compresser le fichier si vous le faites souvent.Sur mon serveur source:
Sur mon serveur de destination:
Sur chaque machine pour voir les progrès:
Tout ceci suppose que vous ayez un fichier de configuration MySQL dans votre répertoire personnel sur les deux machines et définissez les permissions:
la source
le déplacez-vous vers une autre base de données serveur mysql? si c'est le cas, effectuez une exportation dessus
la source
Méthode linux générique:
éditez le datadir (et le socket) pour que mysqld et mysqld_safe (si applicable) pointent vers le nouvel emplacement, puis
J'ai posté ceci parce que personne ne semblait simplement énumérer le moins d'étapes pour le faire et je pense que c'est la manière la plus simple personnellement.
la source
Peut-être que c'est une meilleure façon de le faire:
Version 1 : copie des fichiers de données (MYISAM uniquement)
Version 2 : mysqldump
Version 3 : maître / esclave + mysqldump / copie de fichier
scénario:
PS:
pour copier de petites tables, utilisez:
la source
Je suggérerais les deux étapes simples pour transférer la base de données entière d'un serveur à un autre.
Étape 1 : Effectuez une sauvegarde complète des bases de données sur le serveur source à l'aide de mysqldump .
Étape 2 : Vous pouvez utiliser la commande rsync pour transférer l'intégralité des bases de données sur le serveur de destination.
la source