MySQL8.0のperformance_schemaから、取得できるレプリケーションの情報が増えました。MySQL5.7とそれ以前で取得できる情報は、第36回 performance_schemaのレプリケーションテーブルについてをご確認ください。
また、MySQL8.0から新規で追加されたperformance_schemaのレプリケーション関連のテーブルには、replication_applier_filters
とreplication_applier_global_filters
があります。これらのテーブルについては、第88回 スレーブのレプリケーションフィルターについて ですでに紹介していますのでご確認ください。
今回は、MySQL8.0でレプリケーション関連のテーブルに追加された、カラムの情報を中心に紹介したいと思います。
performance_schemaのレプリケーションテーブル
レプリケーションテーブルは、GTIDやMTS(マルチスレッドスレーブ)を有効にした場合に、従来のレプリケーションのステータスを確認するコマンドSHOW SLAVE STATUS
では表現しきれなかった項目を表示できるようになっています。
よって、バイナリーログのポジションであったり、Seconds_Behind_Master
やRelay_Log_Space
といった項目は表示されません。また、一般的なクエリを用いてアクセスできることから、スレーブ情報のアクセシビリティが向上します。
replication_connection_statusテーブル
このテーブルはマスターの接続状態(IOスレッド)の情報を提供します。
MySQL8.0からは以下のカラムが追加となっています。
- LAST_QUEUED_TRANSACTION
- LAST_QUEUED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
- LAST_QUEUED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP
- LAST_QUEUED_TRANSACTION_START_QUEUE_TIMESTAMP
- LAST_QUEUED_TRANSACTION_END_QUEUE_TIMESTAMP
LAST_QUEUED_TRANSACTIONは、IOスレッドがリレーログに書き込んだ最後のトランザクション(GTID)を表示します。ORIGINAL_COMMIT_TIMESTAMPは、そのトランザクションが最初のマスターでコミットされた時間を表示します。IMMEDIATE_COMMIT_TIMESTAMPはカスケードレプリケーション(マスター->中間スレーブ->スレーブのような構成)の場合に、中間スレーブでコミットされた時間を表示します。
START_QUEUE_TIMESTAMPとEND_QUEUE_TIMESTAMPは、IOスレッドがそのトランザクションをリレーログに書き込んだ開始時間と終了時間を表示します。
- QUEUEING_TRANSACTION
- QUEUEING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
- QUEUEING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP
- QUEUEING_TRANSACTION_START_QUEUE_TIMESTAMP
QUEUEING_TRANSACTIONは、IOスレッドがリレーログに現在書き込んでいるトランザクション(GTID)を表示します。START_QUEUE_TIMESTAMPは、IOスレッドがそのトランザクションをリレーログに書き始めた開始時間です。その他項目は、LAST_QUEUED_TRANSACTIONの値と同様の意味です。
replication_applier_status_by_workerテーブル
このテーブルはMTSが無効な場合はSQLスレッドの情報を提供します。MTSが有効な場合、はワーカースレッドまたはアプライアースレッドの情報が行単位で表示されます。ここではMTSが無効な環境なので、SQLスレッドとして話を進めます。
MySQL8.0からは以下のカラムが追加となっています。
- LAST_APPLIED_TRANSACTION
- LAST_APPLIED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
- LAST_APPLIED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP
- LAST_APPLIED_TRANSACTION_START_APPLY_TIMESTAMP
- LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP
- LAST_APPLIED_TRANSACTION_RETRIES_COUNT
- LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER
- LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE
- LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP
LAST_APPLIED_TRANSACTIONは、SQLスレッドが適用した最後のトランザクション(GTID)を表示します。ORIGINAL_COMMIT_TIMESTAMPとIMMEDIATE_COMMIT_TIMESTAMPは、前述のreplication_connection_statusテーブルの内容と同様で元のマスター、または中間スレーブでコミットされた時間を表示します。START_APPLY_TIMESTAMPとEND_APPLY_TIMESTAMPは、SQLスレッドが適用したそのトランザクションの開始時間と終了時間を表示します。
その他のRETRIES_COUNTやLAST_TRANSIENT_ERROR_NUMBERなどは、そのトランザクション実行時のエラーであったり、エラーのためにリトライした回数など表示します。
- APPLYING_TRANSACTION
- APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
- APPLYING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP
- APPLYING_TRANSACTION_START_APPLY_TIMESTAMP
- APPLYING_TRANSACTION_RETRIES_COUNT
- APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER
- APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE
- APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP
APPLYING_TRANSACTIONは、SQLスレッドが現在適用しているトランザクション(GTID)を表示します。START_APPLY_TIMESTAMPは、SQLスレッドが適用しているトランザクションの開始時間です。その他の項目は、LAST_APPLIED_TRANSACTIONの値と同様の意味です。
replication_applier_status_by_coordinatorテーブル
このテーブルはコーディネータスレッドの情報を提供します。MTSが無効の場合はこのテーブルは空です。MySQL8.0からは、以下のカラムが追加となっています。
- LAST_PROCESSED_TRANSACTION
- LAST_PROCESSED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
- LAST_PROCESSED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP
- LAST_PROCESSED_TRANSACTION_START_BUFFER_TIMESTAMP
- LAST_PROCESSED_TRANSACTION_END_BUFFER_TIMESTAMP
- PROCESSING_TRANSACTION
- PROCESSING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
- PROCESSING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP
- PROCESSING_TRANSACTION_START_BUFFER_TIMESTAMP
LAST_PROCESSED_TRANSACTIONは、そのコーディネーターによって処理された最後のトランザクション(GTID)を表示します。PROCESSING_TRANSACTIONはそのコーディネーターが処理しているトランザクション(GTID)を表示します。その他の情報は今まで紹介したものと同様の内容です。
まとめ
今回紹介した、追加されたカラムについてまとめると、以下のようになります。
- LAST_QUEUED_TRANSACTION(IOスレッドがリレーログに書いた最後のトランザクション)
- QUEUEING_TRANSACTION(IOスレッドがリレーログに現在書いているトランザクション)
- LAST_PROCESSED_TRANSACTION(MTSが有効な場合のみ、コーディネータスレッドが処理した最後のトランザクション)
- PROCESSING_TRANSACTION(MTSが有効な場合のみ、コーディネータスレッドが現在処理しているトランザクション)
- LAST_APPLIED_TRANSACTION(SQLスレッドが適用した最後のトランザクション)
- APPLYING_TRANSACTION(SQLスレッドが現在適用しているトランザクション)
スレーブ側でもマスターで実施されたコミット時間などを把握できるようになりました。
MTSが無効の場合は、replication_applier_status_by_workerテーブルのAPPLYING_TRANSACTIONを比較するようなSQLを末端のスレーブで実施することで、中間スレーブを挟んだマスターとスレーブ間や、中間スレーブとスレーブ間の遅延状態なども確認できるようになります。
また、今回紹介した内容について詳しく確認したい方は、以下のドキュメントをご参照ください。