web-dev-qa-db-fra.com

Réplication MySQL cassée sur le serveur esclave (erreur 1236)

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
  1. Réinitialiser le maître;
  2. Tables affleurantes avec verrouillage de lecture;
  3. Montrer le statut de maître;
  4. Remarque> Fichier: mysql-bin.000001 et position: 107
  5. mysqldump -uroot -p --events --ignore-table=mysql.events --all-databases > /var/backups/mysqldump.sql
  6. Déverrouillez des tables;
  7. Copier le fichier de vidage MySQL sur le serveur 2
    [.____] (scp -p /var/backups/mysqldump.sql [email protected]:/tmp)

Sur le serveur esclave 1 (192.168.1.106):

  1. Arrêter l'esclave;
  2. mysql -uroot -p < /tmp/mysqldump.sql
  3. Réinitialiser l'esclave;
  4. Modifier le maître en maître_host = '192.168.1.105', master_user = 'slaveuser', master_password = 'mypassword';
  5. Modifier le maître en maître_log_file = 'mysql-bin.000001', master_log_pos = 107;
  6. Commencer l'esclave;

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"

4
onastvar

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;
9
myninjaname

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;
4
Bee Kay

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:

  1. Arrêter l'esclave;
  2. Réinitialiser l'esclave;
  3. Modifier le maître en maître_host = '192.168.1.105', master_user = 'slaveuser', master_password = 'mypassword';
  4. Modifier le maître en maître_log_file = 'mysql-bin.000001', master_log_pos = 107;
  5. Commencer l'esclave io_thread;
  6. copier MySQL Dump de Master
  7. mysql -uroot -p </tmp/mysqldump.sql
  8. 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.

3
Bill Karwin

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
1
user113394

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

1
Juha Vehnia