レプリケーションプロセスを管理するときにもっとも一般的なタスクは、レプリケーションが実行中であること、およびスレーブとマスターとの間でエラーがないことを確認することです。このための主要なステートメントは SHOW SLAVE STATUS
で、各スレーブで実行する必要があります。
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 931
Relay_Log_File: slave1-relay-bin.000056
Relay_Log_Pos: 950
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 931
Relay_Log_Space: 1365
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:
Replicate_Ignore_Server_Ids: 0
ステータスレポートの中で調査すべき主要フィールドは、次のとおりです。
Slave_IO_State
: スレーブの現在のステータス。詳しくは、セクション8.12.5.6「レプリケーションスレーブの I/O スレッド状態」およびセクション8.12.5.7「レプリケーションスレーブ SQL スレッドの状態」を参照してください。Slave_IO_Running
: マスターのバイナリログを読み取るための I/O スレッドが実行中かどうか。レプリケーションをまだ起動していないかSTOP SLAVE
で明示的に停止した場合を除き、通常はこれをYes
にすることをお勧めします。Slave_SQL_Running
: リレーログでイベントを実行するための SQL スレッドが実行中かどうか。I/O スレッドと同様、これは通常はYes
にすることをお勧めします。Last_IO_Error
、Last_SQL_Error
: リレーログを処理するときに I/O および SQL スレッドによって登録された最後のエラー。理想的には、これらはエラーがないことを示すブランクであるべきです。-
Seconds_Behind_Master
: スレーブ SQL スレッドがマスターバイナリログの処理より何秒遅れているか。高い (または増加する) 数値は、スレーブがマスターからのイベントを適時に処理できないことを示している可能性があります。Seconds_Behind_Master
が値 0 の場合は通常、スレーブがマスターに追い付いたことを意味すると解釈できますが、これが厳密には正しくない場合がいくつかあります。たとえば、マスターとスレーブの間のネットワーク接続が切断されたけれども、スレーブ I/O スレッドがまだこれを通知されていない場合、つまりslave_net_timeout
がまだ経過していない場合に、これが発生する可能性があります。Seconds_Behind_Master
の過渡値が状況を正確に反映しない場合もあります。スレーブ SQL スレッドが I/O に追い付くと、Seconds_Behind_Master
は 0 を表示しますが、スレーブ I/O スレッドがまだ新しいイベントをキューに入れているときは、Seconds_Behind_Master
は SQL スレッドが新しいイベントの実行を終了するまで大きな値を示す場合があります。これは特に、イベントのタイムスタンプが古い場合に発生する可能性があります。そのような場合、比較的短い期間に数回SHOW SLAVE STATUS
実行すると、この値が 0 と比較的大きな値との間を前後に繰り返し変化するのが見える可能性があります。
フィールドのいくつかのペアは、スレーブがマスターバイナリログからイベントを読み取り、リレーログでそれらを処理するときの進捗状況に関する情報を提供します。
(
Master_Log_file
、Read_Master_Log_Pos
): スレーブ I/O スレッドがマスターバイナリログからどのくらい離れてイベントを読み取ったかを示す、ログ内の座標。(
Relay_Master_Log_File
、Exec_Master_Log_Pos
): スレーブ SQL スレッドがマスターバイナリログから受け取ったイベントをどのくらい離れて実行したかを示す、ログ内の座標。(
Relay_Log_File
、Relay_Log_Pos
): スレーブ SQL スレッドがスレーブリレーログをどのくらい離れて実行したかを示す、リレーログ内の座標。これらは前述の座標に対応しますが、マスターバイナリログ座標ではなく、スレーブリレーログ座標で表現されます。
マスターでは、接続されたスレーブのステータスを SHOW PROCESSLIST
を使用して確認することで、実行中プロセスのリストを確認できます。スレーブ接続では、Command
フィールドに Binlog Dump
があります。
mysql> SHOW PROCESSLIST \G;
*************************** 4. row ***************************
Id: 10
User: root
Host: slave1:58371
db: NULL
Command: Binlog Dump
Time: 777
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
レプリケーションプロセスを実行するのはスレーブであるため、このレポートで入手できる情報はほとんどありません。
--report-host
オプションで起動されて、マスターに接続されているスレーブの場合は、マスターでの SHOW SLAVE HOSTS
ステートメントはスレーブに関する基本情報を示します。出力には、スレーブサーバーの ID、--report-host
オプションの値、接続中のポート、マスター ID が含まれます。
mysql> SHOW SLAVE HOSTS;
+-----------+--------+------+-------------------+-----------+
| Server_id | Host | Port | Rpl_recovery_rank | Master_id |
+-----------+--------+------+-------------------+-----------+
| 10 | slave1 | 3306 | 0 | 1 |
+-----------+--------+------+-------------------+-----------+
1 row in set (0.00 sec)