web-dev-qa-db-fra.com

Essayer de comprendre SHOW SLAVE STATUS dans MySQL

J'ai une configuration de réplication maître-esclave et il semble que cela fonctionne bien. Ci-dessous est le résultat de SHOW SLAVE STATUS commande:

show slave STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: *.*.*.*
                  Master_User: repliV1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 10726644
               Relay_Log_File: mysqld-relay-bin.000056
                Relay_Log_Pos: 231871
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: data1
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 10726644
              Relay_Log_Space: 232172
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:

Je voudrais mieux comprendre le Relay_Log_File, Relay_Log_Pos et Relay_Master_Log_File.

Mes questions sont:

  • Est-il vrai que le fichier journal de relais est un fichier qui est lu et stocké localement pour que la réplication s'exécute?

  • Que dire de la relay_master_log_file puis; en quoi est-ce différent du Master_Log_File?

  • Quelles sont ces deux valeurs, à savoir, Read_Master_Log_Pos et Relay_Log_Pos? Pourquoi apparaissent-ils alors que la réplication est terminée et synchronisée?

  • Est-il vrai que ces fichiers sont au format binaire et que je ne peux donc pas les visualiser?

11
newbie14

Je veux comprendre plus en détail est le Relay_Log_File, Relay_Log_Pos et Relay_Master_Log_File.

De SHOW SLAVE STATUS\G, obtenez deux valeurs

  • Relay_Log_File: Journal de relais actuel acceptant de nouvelles entrées pendant la réplication
  • Relay_Log_Pos: Position actuelle du journal de relais actuel acceptant de nouvelles entrées pendant la réplication
  • Relay_Master_Log_File: Fichier journal de relais contenant la dernière instruction SQL exécutée avec succès sur le maître qui a été exécutée sur l'esclave.
  • Master_Log_File: journal sur le maître qui correspond au fichier journal de relais actuel et à la position du journal de relais actuel

Les fichiers sont en binaire donc pas en mesure de les visualiser correctement

Oui, vous pouvez afficher les journaux de relais. Puisqu'ils ont la même structure qu'un journal binaire normal, il suffit d'exécuter le programme mysqlbinlog . Par exemple, pour afficher le SQL dans l'un de vos journaux de relais, comme le dernier, procédez comme suit:

mysqlbinlog mysqld-relay-bin.000056 > /root/SQLForCurrentRelayLog.txt
less /root/SQLForCurrentRelayLog.txt
8
RolandoMySQLDBA

Relay_Master_Log_File est en fait le nom du binlog sur le maître contenant la dernière instruction SQL exécutée avec succès sur l'esclave. Ce n'est pas le nom d'un journal de relais sur l'esclave. Voir: http://dev.mysql.com/doc/refman/5.5/en/show-slave-status.html

Exec_Master_Log_Pos est la position dans le fichier relay_master_log_file que le thread SQL esclave a exécuté jusqu'à. Donc, dans votre exemple, la base de données esclave a exécuté toutes les instructions jusqu'à binlog mysql-bin.000001 pos 10726644 sur la base de données master.

until_log_pos n'est vraiment utilisé que si vous démarrez votre esclave avec la syntaxe START SLAVE UNTIL master_log_pos = $integer. Cette syntaxe se répliquera jusqu'à cette position (ce sera le exec_master_log_pos) puis arrêtez. Vous ne feriez normalement cela que si vous vouliez répliquer vers un point spécifique, mais pas plus loin (comme si la prochaine instruction est une chute accidentelle de la table ou quelque chose). La valeur de until_log_pos est 0 lorsqu'il n'est pas spécifié, donc dans votre cas, cela signifie que la réplication continuera à avancer.

8
drogart