7
votes

Comment rédiger la position du journal binaire MySQL de Master lorsque vous faites un mysqldump de l'esclave?

J'exécute actuellement MySqldump sur un esclave MySQL pour sauvegarder notre base de données. Cela a fonctionné bien pour sauvegarder nos données elles-mêmes, mais ce que je voudrais compléter avec la position de journalisation binaire du maître correspondant aux données générées par le mysqldump.

Faire cela permettrait de restaurer notre esclave (ou d'installer de nouveaux esclaves) sans avoir à faire une mysqldump distincte sur la base de données principale où nous saisissons la position du journal binaire du maître. Nous allions prendre les données générées par le mysqldump, combinez-la avec les informations de journal binaires que nous avons générées, et que vous soyez resynisés.

Jusqu'à présent, mes recherches me sont très proches de pouvoir accomplir cet objectif, mais je ne peux pas sembler comprendre une manière automatisée de le retirer. Voici les "presque" que j'ai découverts:

  • Si nous exécutions MySqldump de la base de données principale, nous pourrions utiliser le paramètre "-Master-Data" avec MySqLDump pour enregistrer la position binaire de la maîtrise avec les données de vidage (je présume que cela fonctionnerait probablement aussi si nous avons commencé à générer Des bûches binaires de notre esclave, mais cela ressemble à une overkill pour ce que nous voulons accomplir)
  • Si nous voulions faire cela de manière non automatisée, nous pourrions nous connecter à la base de données de l'esclave et exécuter "arrêter esclave sql_thread;" suivi de "Simple Statut des esclaves;" ( http://dev.mysql.com/doc/refman/5.0/ fr / mysqldump.html ). Mais cela ne va-t-il pas faire de bien à moins que nous sachions à l'avance, nous voulons retourner quelque chose du SALVE.
  • Si nous avions 500 $ / an pour souffler, nous pourrions utiliser le plug-in InnoDB Hot Backup et il suffit d'exécuter nos mysqLdumps de la DB principale. Mais nous n'avons pas cet argent, et je ne veux pas ajouter d'E / S supplément sur notre DB principale de toute façon.

    Cela semble être assez commun que quelqu'un ait dû comprendre auparavant, espérons que quelqu'un utilise un débordement de pile?


0 commentaires

5 Réponses :


9
votes

Le script de shell suivant s'exécutera en cron ou périodique, remplacez les variables si nécessaire (les paramètres par défaut sont écrits pour FreeBSD):

# MySQL executable location
mysql=/usr/local/bin/mysql

# MySQLDump location
mysqldump=/usr/local/bin/mysqldump

# MySQL Username and password
userpassword=" --user=<username> --password=<password>"

# MySQL dump options
dumpoptions=" --quick --add-drop-table --add-locks --extended-insert"

# Databases
databases="db1 db2 db3"

# Backup Directory
backupdir=/usr/backups

# Flush and Lock
mysql $userpassword -e 'STOP SLAVE SQL_THREAD;'

set `date +'%Y %m %d'`

# Binary Log Positions
masterlogfile=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep '[^_]Master_Log_File'`
masterlogpos=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep 'Read_Master_Log_Pos'`

# Write Binlog Info
echo $masterlogfile >> ${backupdir}/info-$1-$2-$3.txt
echo $masterlogpos >> ${backupdir}/info-$1-$2-$3.txt

# Dump all of our databases
echo "Dumping MySQL Databases"
for database in $databases
do
$mysqldump $userpassword $dumpoptions $database | gzip - > ${backupdir}/${database}-$1-$2-$3.sql.gz
done

# Unlock
$mysql $userpassword -e 'START SLAVE'

echo "Dump Complete!"

exit 0


9 commentaires

Yup, c'est semblable à mon deuxième scénario ci-dessus. Si les documents MySQL doivent être croyants, vous pouvez obtenir la position binaire du maître de l'esclave en arrêtant le fil esclave et montrant le statut de l'esclave. Cela ne nécessite pas de verrouillage du maître. Mais j'espère trouver une solution automatisée qui stockera automatiquement la position du journal des bacs au cours de la gestion de notre sauvegarde quotidienne.


Hé, avait totalement oublié que le statut de maître peut être récupéré de l'esclave! Acclamations pour le rappel. J'ai ajouté les informations au shellscript qui effectue des sauvegardes quotidiennes, nous devrions donc disposer d'informations de journal binaire écrites maintenant aux côtés des sauvegardes. J'ajouterai les informations à ma réponse, ne sera applicable directement si vous utilisez un système * NIX, mais je suis sûr que si vous travaillez sur un système Windows, vous avez votre propre façon de le faire :)


Le OP ne veut vraiment pas faire des tables de verrouillage avec une serrure de lecture sur le maître. Personne, personne, vraiment.


Ce n'est pas un verrou de lecture sur le maître, c'est une serrure de lecture sur l'esclave.


Salut Ross, bon travail, que presque travaille pour moi. Si vous pouviez faire les modifications suivantes, je l'accepterai comme la réponse: * Tous les bits «-U -p » doivent être remplacés par la variable $ userpassword que vous avez déclaré * chemin d'accès à MySQL et mysqldump devrait être déclaré comme variables dans la zone supérieure, aux côtés d'un nom d'utilisateur et de tels. À Debian (ce que je suis en cours d'exécution), ils sont dans un endroit différent. Outre cela, ce script a rejeté la position de la position + de la base de données dans mon test. Aller au test de la ré-importer un peu plus tard pour vérifier que c'est tout casher, mais semble très prometteur.


De plus, il serait probablement préférable de supprimer simplement le sommet du maître de verrouillage. Votre deuxième solution esclave est exactement ce que la question appelle.


Hey, merci pour les conseils de nettoyage, devrait être bon maintenant! Heureux cela aidé.


Une chose à noter, exécution MySQL $ userpassword -e 'Flush Tables avec Lire Lock' ne conservera pas la serrure! La serrure sera libérée dès que cette commande est terminée. Ne pas maintenir la serrure entraînera des données qui ne sont pas synchronisées avec d'autres tables. Étant donné que le verrouillage est sorti immédiatement après la fin de la commande exécutée, la commande de suivi des tables de déverrouillage est inutile. De plus, plusieurs des options mysqldump ne sont pas nécessaires non plus, car elles sont actives par défaut à l'aide de la commande --OPT. Vérifiez la page MySqldump Man.


mysqldump --user = *** - mot de passe = *** -lock-all-tables --Dump-esclave = 2 Base de données> /backup.sql Il ajoutera la position principale et le fichier journal dans Dump



0
votes

Votre deuxième option ressemble à la bonne voie.

Je devais comprendre un moyen de faire des sauvegardes différentielles à l'aide de MySqldump. J'ai fini par écrire un script qui a choisi les bases de données à sauvegarder puis exécuté mysqldump. Impossible de créer un script qui a suivi les étapes mentionnées dans http://dev.mysql.com/doc/refman/5.1/fr/mysqldump.htm#option_mysqldump_master-data et appelez-le d'un travail cron?

  1. Connectez-vous à MySQL et "Arrêtez l'esclave"
  2. EXECUTE SHOW STATUS SLAVE
  3. Nom de fichier en magasin, File_POS in Variables
  4. Déclipser et redémarrer l'esclave.

    Juste une pensée, mais je suppose que vous pouvez ajouter le "changement de maître à" à la dumpfile et il serait exécuté lorsque vous avez restauré / configurer le nouvel esclave.


0 commentaires

1
votes

Bien que le script de Ross soit sur la bonne voie, @JoAtis a raison quand il dit d'arrêter l'esclave avant de vérifier la position du journal principal. La raison étant est la verrouillage de lecture ne préservera pas le read_master_log_pos esclave et exécution: xxx

notez le read_master_log_pos

Attendez quelques secondes et encore une fois exécuté: < Pré> xxx

Vous devez remarquer que le lis_master_log_pos a changé.

Étant donné que la sauvegarde est initiée rapidement après avoir vérifié l'état, la position du journal enregistré par Le script peut être précis. Cependant, c'est préférable de suivre la procédure ici: http://dev.mysql.com/doc /refman/5.0/fr/Replication-Solutions-Backups-mysqldump.html

et exécuté stop esclave sql_thread; au lieu de tables de rinçage avec verrouillage de lecture pendant la durée de la sauvegarde.

Lorsque vous avez terminé, lancez la réplication à nouveau avec Démarrer esclave

aussi, si vous souhaitez sauvegarder le bac -Logs pour des sauvegardes incrémentielles ou comme une mesure de sécurité supplémentaire, il est utile d'ajouter des journaux -Flush à la variable $ DumpOptions ci-dessus


0 commentaires

0
votes

Utilisation de read_master_log_pos comme position pour continuer à partir du Master signifie que vous pouvez vous retrouver avec des données manquantes.

La variable Lecture_MAST_LOG_POS est la position dans le fichier journal binaire principal que le fil Slave IO est à la hauteur.

Le problème ici est que même dans la petite quantité de temps entre arrêter le fil SQL esclave et récupérer le thread IO peut avoir reçu plus de données de la maîtrise qui n'a pas été appliquée par le fil SQL ayant été arrêté.

Il en résulte dans la lecture_master_log_pos étant plus en avant que les données renvoyées dans la MySqldump, laissant une lacune dans les données lorsqu'elles sont importées et poursuivies sur un autre esclave.

la valeur correcte à utiliser sur L'esclave est EXEC_MASTER_LOG_POS, qui est la position dans le fichier journal principal binaire que le fil SQL SLAVE est exécuté, ce qui signifie qu'il n'y a pas de déficit de données entre le mysqldump et l'exécutant_mogog_pos.

Utilisation du script de Ross au-dessus de l'utilisation correcte. serait: xxx


0 commentaires

0
votes

mysqldump (sur 5.6) semble avoir une option -dump-esclave que lorsqu'il est exécuté sur un esclave enregistre les co-commandes binaires du maître que le nœud était un esclave de. L'intention d'un tel député est exactement ce que vous décrivez.

(Je suis en retard, je sais)


0 commentaires