Comment écrire le Mysql log binaire position de maître lorsque l'on fait un dump de l'esclave?
Je suis en train d'exécuter la commande mysqldump sur une base de données Mysql esclave pour la sauvegarde de notre base de données. Cela a bien fonctionné pour la sauvegarde de nos données elle-même, mais ce que je voudrais compléter avec est le log binaire de la position du maître qui correspond avec les données générées par la commande mysqldump.
Faisant cela nous permettrait de restaurer notre esclave (ou d'installation de nouveaux esclaves) sans avoir à effectuer une commande mysqldump sur la base de données principale, où nous récupérons le log binaire de la position du maître. Nous prendrions les données générées par la commande mysqldump, de le combiner avec le log binaire de l'information, nous avons généré, et le tour est joué... être resynced.
Jusqu'à présent, mes recherches je me suis retrouvée très PRÈS d'être en mesure d'atteindre cet objectif, mais je n'arrive pas à trouver un moyen automatisé pour le retirer. Voici les "almosts" j'ai découvert:
- Si nous prenions le dump de la base de données principale, on peut utiliser le "--master-data" paramètre avec la commande mysqldump pour le journal du maître binaire de la position le long avec le dump de données (je présume que ce serait probablement aussi fonctionner si nous avons commencé à générer des binaires journaux de nos esclaves, mais qui semble exagéré pour ce que nous voulons accomplir)
- Si nous voulions pour ce faire, dans un non-automatisée, nous pouvions nous connecter à l'esclave de la base de données et exécuter "arrête de bosser SQL_THREAD;" suivi de "SHOW SLAVE STATUS;" (http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html). Mais cela ne va pas nous faire du tout bon, à moins que nous savons à l'avance que nous voulons quelque chose en retour de la salve.
- Si nous avons eu de 500 $/année à coup, nous pourrions utiliser la InnoDb hot backup plugin et il suffit d'exécuter notre mysqldumps de la principale DB. Mais nous n'avons pas cet argent, et je ne veux pas de place supplémentaire I/O sur notre principale DB de toute façon.
Cela semble être quelque chose d'assez courant que quelqu'un doit l'avoir compris avant, j'espère que quelqu'un l'aide d'un Débordement de Pile?
OriginalL'auteur wbharding | 2009-10-05
Vous devez vous connecter pour publier un commentaire.
Le script suivant sera exécuté dans cron ou périodique, de remplacer les variables que nécessaire (par défaut sont écrites pour FreeBSD):
Hey, avait totalement oublié que le maître de l'état, peuvent être récupérées à partir de l'esclave! Bravo pour le rappel. J'ai ajouté les informations pour le shell script qui effectue des sauvegardes quotidiennes, de sorte que nous devrions avoir le log binaire de l'information écrite maintenant à côté des sauvegardes. Je vais ajouter l'info à ma réponse, ne seront directement applicables si vous utilisez un *nix système, mais je suis sûr que si vous travaillez sur un système Windows, vous avez votre propre façon de faire 🙂
L'OP n'a pas vraiment envie de faire un LOCK TABLES AVEC VERROU en LECTURE sur le maître. Ni quelqu'un, vraiment.
Ce n'est pas un verrou en lecture sur le maître, c'est un verrou en lecture sur l'esclave.
Une chose à noter, l'exécution de mysql $motdepasse -e 'FLUSH TABLES AVEC VERROU en LECTURE" ne sera PAS maintenir le verrou! Le verrou est libéré dès que la commande est terminée en cours d'exécution. Ne pas maintenir le verrou va aboutir à des données qui n'est pas en synchronisation avec d'autres tables. Depuis le verrou est libéré immédiatement après la commande est terminée le suivi de commande de DÉVERROUILLAGE de TABLES est inutile. Aussi, plusieurs de la commande mysqldump options ne sont pas nécessaires, puisqu'elles sont, par défaut, à l'aide de l' --opt commande. Vérifier la commande mysqldump page de man.
OriginalL'auteur Ross Duggan
Bien que Ross script est sur la bonne voie, @joatis est juste quand il a dit d'arrêter l'esclave avant de vérifier la maîtrise de la position du journal. La raison d'être est le VERROU en LECTURE ne permet pas de conserver la
Read_Master_Log_Pos
qui est récupéré avecSHOW SLAVE STATUS
.De voir que c'est le cas, connectez-vous à MySQL sur votre esclave et de l'exécution:
Note le
Read_Master_Log_Pos
Attendez quelques secondes et une fois de plus de lancer:
Vous devriez noter que les
Read_Master_Log_Pos
a changé.Depuis la sauvegarde est lancée rapidement après que nous avons vérifier le statut, la position du journal enregistrées par le script peut être exacte. Cependant, son prefereable au lieu de suivre la procédure ici:
http://dev.mysql.com/doc/refman/5.0/en/replication-solutions-backups-mysqldump.html
Et exécuter
STOP SLAVE SQL_THREAD;
au lieu deFLUSH TABLES WITH READ LOCK
pour la durée de la sauvegarde.Une fois terminé, redémarrez à nouveau la réplication avec
START SLAVE
Aussi, si vous souhaitez sauvegarder l'emplacement des journaux pour des sauvegardes incrémentielles ou comme une mesure de sécurité supplémentaire, il est utile d'ajouter --flush-logs à l' $dumpoptions variable au-dessus de
OriginalL'auteur Evan Muehlhausen
Vous êtes à la seconde option semble que le droit de la piste.
Je devais trouver un moyen de faire des sauvegardes différentielles à l'aide de la commande mysqldump. J'ai fini par écrire un script qui a choisi ce qu'bases de données à sauvegarder, puis exécuté la commande mysqldump.
Ne pourrait-on pas créer un script qui a suivi les étapes mentionnées dans http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_master-data et l'appeler à partir d'une tâche cron?
Juste une pensée, mais je devine que vous pourriez ajouter le "CHANGEMENT de MAÎTRE DE la" ligne du fichier de vidage et elle était exécutée lorsque vous avez restauré/installation de la nouvelle esclave.
OriginalL'auteur joatis
À l'aide de Read_Master_Log_Pos que la position pour continuer à partir de le maître, vous pouvez vous retrouver avec des données manquantes.
La Read_Master_Log_Pos variable est la position du maître binaire du fichier journal de l'esclave " IO fil.
Le problème ici est que, même dans la petite quantité de temps entre l'arrêt de l'esclave thread SQL et de récupération de la Read_Master_Log_Pos le IO thread peut avoir reçu plus de données à partir de le maître, qui n'a pas été appliquée par le thread SQL après avoir été arrêté.
Cette résultats dans la Read_Master_Log_Pos être en avance sur les données retournées dans le mysqldump, laissant un écart dans les données lors de l'importation et a continué sur un autre esclave.
La valeur correcte à utiliser sur l'esclave est Exec_Master_Log_Pos, ce qui est le maître binaire du fichier journal de l'esclave " thread SQL exécutée dernière, il n'y a pas de lacune dans les données entre la commande mysqldump et la Exec_Master_Log_Pos.
À l'aide de Ross script ci-dessus l'utilisation correcte serait:
OriginalL'auteur Andy Burton
mysqldump (5.6) semble avoir une option --dump-esclave qui lorsqu'il est exécuté sur un esclave enregistre le log binaire co-ords du maître que le nœud était un esclave. Le but d'une telle décharge, c'est exactement ce que vous décrivez.
(Je suis en retard, je sais )
OriginalL'auteur abhayAndPoorvisDad