Ma question est la suivante: comment corriger la réplication MySQL cassée sur le serveur esclave (erreur 1236)?
serveur 1 (192.168.1.105) Serveur 2 (192.168.1.106)
J'ai couru ces étapes pour relancer:
Au Master - Server 1 (192.168.1.105):
mysql -u root -p
mysqldump -uroot -p --events --ignore-table=mysql.events --all-databases > /var/backups/mysqldump.sql
scp -p /var/backups/mysqldump.sql [email protected]:/tmp
)Sur le serveur esclave 1 (192.168.1.106):
mysql -uroot -p < /tmp/mysqldump.sql
J'ai toujours reçu cette erreur sur le serveur 1
Last_IO_ERNO: 1236 Last_IO_Error: a obtenu une erreur fatale 1236 de Master lors de la lecture de données de journal binaire: "Impossible de trouver le premier nom de fichier journal dans le fichier d'index de journal binaire"
Je crois que le fichier journal et la position doivent être spécifiés avec l'hôte.
Essayer:
CHANGE MASTER TO MASTER_Host='192.168.1.105', MASTER_USER='slaveuser', MASTER_PASSWORD='mypassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;
J'avais besoin de réparer un esclave existant qui avait été aussi éloigné de synchronisation qu'un simple redémarrage n'était pas possible "1236 'n'a pas pu trouver le premier nom de fichier journal dans le fichier d'index de journal binaire" "Type Problème. Après avoir lu la documentation MySQL, j'ai simplifié le processus de ce type de problème. Encore une fois, cela suppose que la configuration existante fonctionnait avant, de restaurer la copie de l'esclave de la DB, tous les anciens fichiers mysql_bin.xxxxxxxxxx copiés et que la synchronise a démarré à nouveau.
Créez une sauvegarde du maître (et de toutes les bases de données dans mon cas):
master# mysqldump --master-data --all-databases > mydump.db
Puis sur l'esclave:
1) Arrêtez MySQL et redémarrez-le sans esclave en cours d'exécution:
slave# service mysqld stop
slave# service mysqld start --skip-slave-start
2) faire que certains esclaves sont arrêtés:
slave# mysql -u root -p
mysql> stop slave;
mysql> exit;
3) Restaurer la configuration de Master sur esclave, avec Master Statut Magic déjà cuit dans:
slave# MySQL < mydump.db
slave# mysql
mysql> START SLAVE;
4) Confirmer la synchronisation a au moins commencé (donnez-lui 30-90 secondes):
mysql> SHOW SLAVE STATUS;
Si la restauration de la base de données sur l'esclave prend trop de temps, le fichier journal MySQL-Bin.000001 peut être purgé à partir du maître au moment où vous commencez à esclave. Lorsque vous obtenez l'erreur sur l'esclave, courez SHOW BINARY LOGS
sur le maître et voir si mysql-bin.000001 est parti.
Vous devriez également regarder le réglage de expire_logs_days
Pour que les fichiers binlog ne soient pas expirés trop rapidement.
Une autre chose que vous pourriez faire pour compenser est ce qui suit, sur l'esclave, dès que vous déverrouillez les tables sur le maître:
- Arrêter l'esclave;
- Réinitialiser l'esclave;
- Modifier le maître en maître_host = '192.168.1.105', master_user = 'slaveuser', master_password = 'mypassword';
- Modifier le maître en maître_log_file = 'mysql-bin.000001', master_log_pos = 107;
- Commencer l'esclave io_thread;
- copier MySQL Dump de Master
- mysql -uroot -p </tmp/mysqldump.sql
- Commencer l'esclave sql_thread;
Cela devrait commencer le téléchargement de journaux binaires pendant que vous faites la restauration, de sorte que vous ne manquez aucune.
J'ai rencontré la même erreur. Dans mon cas, la cause du problème était de l'espace blanc à la fin du nom du fichier. Donc, au cas où vous avez fait des modifications de la réplication, vous devriez vérifier les caractères blanches possibles (Nom master_log_file);
Reproduire le problème:
# white space after the name of file.
mysql>change master to master_log_file='archive.000006 ';
# how to check
cat /var/lib/mysql/master.info | sed 's/^/START--/g' | sed 's/$/--END/g'
START--archive.000006 --END
Solution:
mysql>change master to master_log_file='archive.000006';
cat /var/lib/mysql/master.info | sed 's/^/START--/g' | sed 's/$/--END/g'
START--archive.000006--END
Si vous avez besoin de le faire avec un minimum de temps d'arrêt et que vous avez 100% de confiance que vous avez une esclave cohérente ici, faites étape par étape Comment reconstruire l'esclave à l'aide de Linux LVM.
Préparation
Définissez InnoDB Max Pages sales pour cent pour zéro sur le maître. Cela obligera MySQL à écrire toutes les pages sur le disque qui accélérera de manière significative le redémarrage.
set global innodb_max_dirty_pages_pct = 0;
Pour surveiller le nombre de pages sales exécutent la commande
mysqladmin ext -i10 | grep dirty
Une fois que le numéro a diminué, vous avez atteint le point de continuer. Suivant Réinitialisez le maître pour effacer les journaux de bosses anciennes/relais:
RESET MASTER;
Reconstruire l'esclave en utilisant lvm
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 principale avec commande
service mysql stop
Suivant prendre un snaphot, mysql_snapshot sera le nouveau nom de volume logique.
lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data
Démarrer Master à nouveau avec commande
service mysql start
Restaurer les 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 là 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 *
Retour au maître. Maintenant rsync l'instantané à l'esclave MySQL
rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/
Une fois que RSYNC a terminé, vous pouvez démonter et supprimer l'instantané.
umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot
Créez un utilisateur de réplication sur le maître si l'ancien utilisateur de réplication n'existe pas ou 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, le cas échéant, vous pouvez omettre la commande suivante:
chown -R mysql:mysql /var/lib/mysql
Enregistrez ensuite la position 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é en séquence et la position du journal des bacs est la taille du fichier. Enregistrez ces valeurs:
master_log_file=mysql-bin.000020
master_log_post=65657162
Ensuite, commencez l'esclave mysql
service mysql start
Exécutez la commande maître de changement 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 commencer l'esclave
SLAVE START;
Vérifier le statut esclave:
SHOW SLAVE STATUS\G
Assurez-vous que Slave IO est en cours d'exécution et il n'y a pas d'erreur de connexion. Bonne chance!
Mon blog a des informations supplémentaires sur ce sujet, mais l'histoire principale est la même!
http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-utilisateur-linux-lvm.html