Reconstruire l'esclave avec LVM
Voici la méthode que nous utilisons pour reconstruire les esclaves MySQL à l'aide de Linux LVM. Cela garantit un instantané cohérent tout en nécessitant un temps d'arrêt très minimal sur votre maître.
Définissez le pourcentage de pages sales innodb max sur zéro sur le serveur MySQL maître. Cela forcera MySQL à écrire toutes les pages sur le disque, ce qui accélérera considérablement le redémarrage.
set global innodb_max_dirty_pages_pct = 0;
Pour surveiller le nombre de pages modifiées, exécutez la commande
mysqladmin ext -i10 | grep dirty
Une fois que le nombre cesse de diminuer, vous avez atteint le point de continuer. Ensuite, réinitialisez le maître pour effacer les anciens journaux de bac / journaux de relais:
RESET MASTER;
Exécutez lvdisplay pour obtenir le chemin LV
lvdisplay
La sortie ressemblera à ceci
--- Logical volume ---
LV Path /dev/vg_mysql/lv_data
LV Name lv_data
VG Name vg_mysql
Arrêtez la base de données master avec la commande
service mysql stop
Ensuite, prenez un instantané, mysql_snapshot sera le nouveau nom de volume logique. Si des binlogs sont placés sur le lecteur du système d'exploitation, ils doivent également être instantanés.
lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data
Redémarrez le maître avec la commande
service mysql start
Restaurer le paramètre de pages sales à la valeur par défaut
set global innodb_max_dirty_pages_pct = 75;
Exécutez à nouveau lvdisplay pour vous assurer que l'instantané est présent et visible
lvdisplay
Production:
--- Logical volume ---
LV Path /dev/vg_mysql/mysql_snapshot
LV Name mysql_snapshot
VG Name vg_mysql
Monter l'instantané
mkdir /mnt/mysql_snapshot
mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot
Si vous avez un esclave MySQL existant en cours d'exécution, vous devez l'arrêter
service mysql stop
Ensuite, vous devez effacer le dossier de données MySQL
cd /var/lib/mysql
rm -fr *
De retour au maître. Maintenant, resynchronisez l'instantané sur l'esclave MySQL
rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/
Une fois rsync terminé, vous pouvez démonter et supprimer l'instantané
umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot
Créer un utilisateur de réplication sur le maître si l'ancien utilisateur de réplication n'existe pas ou si le mot de passe est inconnu
GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';
Vérifiez que les fichiers de données / var / lib / mysql appartiennent à l'utilisateur mysql, si c'est le cas, vous pouvez omettre la commande suivante:
chown -R mysql:mysql /var/lib/mysql
Enregistrez ensuite la position du binlog
ls -laF | grep mysql-bin
Vous verrez quelque chose comme
..
-rw-rw---- 1 mysql mysql 1073750329 Aug 28 03:33 mysql-bin.000017
-rw-rw---- 1 mysql mysql 1073741932 Aug 28 08:32 mysql-bin.000018
-rw-rw---- 1 mysql mysql 963333441 Aug 28 15:37 mysql-bin.000019
-rw-rw---- 1 mysql mysql 65657162 Aug 28 16:44 mysql-bin.000020
Ici, le fichier journal principal est le numéro de fichier le plus élevé dans la séquence et la position du journal du bac est la taille du fichier. Enregistrez ces valeurs:
master_log_file=mysql-bin.000020
master_log_post=65657162
Ensuite, démarrez l'esclave MySQL
service mysql start
Exécutez la commande change master sur l'esclave en exécutant ce qui suit:
CHANGE MASTER TO
master_host="10.0.0.12",
master_user="replication",
master_password="YourPass",
master_log_file="mysql-bin.000020",
master_log_pos=65657162;
Enfin démarrer l'esclave
SLAVE START;
Vérifier l'état de l'esclave:
SHOW SLAVE STATUS;
Assurez-vous que Slave IO est en cours d'exécution et qu'il n'y a pas d'erreurs de connexion. Bonne chance!
BR, Juha Vehnia
J'ai récemment écrit ceci sur mon blog qui se trouve ici ... Il y a quelques détails supplémentaires mais l'histoire est la même.
http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html
--opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases