MySQL道普請便り

第98回 MySQL8.0のperformance_schemaのレプリケーションテーブル

この記事を読むのに必要な時間:およそ 5 分

MySQL8.0のperformance_schemaから,取得できるレプリケーションの情報が増えました。MySQL5.7とそれ以前で取得できる情報は,第36回 performance_schemaのレプリケーションテーブルについてをご確認ください。

また,MySQL8.0から新規で追加されたperformance_schemaのレプリケーション関連のテーブルには,replication_applier_filtersreplication_applier_global_filtersがあります。これらのテーブルについては,第88回 スレーブのレプリケーションフィルターについて ですでに紹介していますのでご確認ください。

今回は,MySQL8.0でレプリケーション関連のテーブルに追加された,カラムの情報を中心に紹介したいと思います。

performance_schemaのレプリケーションテーブル

レプリケーションテーブルは,GTIDやMTS(マルチスレッドスレーブ)を有効にした場合に,従来のレプリケーションのステータスを確認するコマンドSHOW SLAVE STATUSでは表現しきれなかった項目を表示できるようになっています。

よって,バイナリーログのポジションであったり,Seconds_Behind_MasterRelay_Log_Spaceといった項目は表示されません。また,一般的なクエリを用いてアクセスできることから,スレーブ情報のアクセシビリティが向上します。

replication_connection_statusテーブル

このテーブルはマスターの接続状態(IOスレッド)の情報を提供します。

mysql >SELECT * FROM replication_connection_status\G
*************************** 1. row ***************************
                                      CHANNEL_NAME:
                                        GROUP_NAME:
                                       SOURCE_UUID: 9f46b8ef-8039-11e9-9958-fa163f770158
                                         THREAD_ID: 50
                                     SERVICE_STATE: ON
                         COUNT_RECEIVED_HEARTBEATS: 57
                          LAST_HEARTBEAT_TIMESTAMP: 2019-05-27 14:35:36.359708
                          RECEIVED_TRANSACTION_SET: 9f46b8ef-8039-11e9-9958-fa163f770158:1-1139998
                                 LAST_ERROR_NUMBER: 0
                                LAST_ERROR_MESSAGE:
                              LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
                           LAST_QUEUED_TRANSACTION: 9f46b8ef-8039-11e9-9958-fa163f770158:1139998
 LAST_QUEUED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 2019-05-27 14:36:46.967330
LAST_QUEUED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 2019-05-27 14:36:46.967330
     LAST_QUEUED_TRANSACTION_START_QUEUE_TIMESTAMP: 2019-05-27 14:36:46.968575
       LAST_QUEUED_TRANSACTION_END_QUEUE_TIMESTAMP: 2019-05-27 14:36:46.968611
                              QUEUEING_TRANSACTION: 9f46b8ef-8039-11e9-9958-fa163f770158:1139999
    QUEUEING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 2019-05-27 14:36:46.967335
   QUEUEING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 2019-05-27 14:36:46.967335
        QUEUEING_TRANSACTION_START_QUEUE_TIMESTAMP: 2019-05-27 14:36:46.968615

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スレッドとして話を進めます。

mysql >SELECT * FROM replication_applier_status_by_worker\G
*************************** 1. row ***************************
                                           CHANNEL_NAME:
                                              WORKER_ID: 0
                                              THREAD_ID: 47
                                          SERVICE_STATE: ON
                                      LAST_ERROR_NUMBER: 0
                                     LAST_ERROR_MESSAGE:
                                   LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
                               LAST_APPLIED_TRANSACTION: 9f46b8ef-8039-11e9-9958-fa163f770158:595021
     LAST_APPLIED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 2019-05-27 14:16:33.033826
    LAST_APPLIED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 2019-05-27 14:20:29.364112
         LAST_APPLIED_TRANSACTION_START_APPLY_TIMESTAMP: 2019-05-27 14:48:26.755794
           LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP: 2019-05-27 14:48:26.757305
                                   APPLYING_TRANSACTION: 9f46b8ef-8039-11e9-9958-fa163f770158:595022
         APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 2019-05-27 14:16:33.034271
        APPLYING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 2019-05-27 14:20:29.365344
             APPLYING_TRANSACTION_START_APPLY_TIMESTAMP: 2019-05-27 14:48:26.757314
                 LAST_APPLIED_TRANSACTION_RETRIES_COUNT: 0
   LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER: 0
  LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE:
LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
                     APPLYING_TRANSACTION_RETRIES_COUNT: 0
       APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER: 0
      APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE:
    APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000

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)を表示します。その他の情報は今まで紹介したものと同様の内容です。

まとめ

今回紹介した,追加されたカラムについてまとめると,以下のようになります。

  1. LAST_QUEUED_TRANSACTION(IOスレッドがリレーログに書いた最後のトランザクション)
  2. QUEUEING_TRANSACTION(IOスレッドがリレーログに現在書いているトランザクション)
  3. LAST_PROCESSED_TRANSACTION(MTSが有効な場合のみ,コーディネータスレッドが処理した最後のトランザクション)
  4. PROCESSING_TRANSACTION(MTSが有効な場合のみ,コーディネータスレッドが現在処理しているトランザクション)
  5. LAST_APPLIED_TRANSACTION(SQLスレッドが適用した最後のトランザクション)
  6. APPLYING_TRANSACTION(SQLスレッドが現在適用しているトランザクション)

スレーブ側でもマスターで実施されたコミット時間などを把握できるようになりました。

MTSが無効の場合は,replication_applier_status_by_workerテーブルのAPPLYING_TRANSACTIONを比較するようなSQLを末端のスレーブで実施することで,中間スレーブを挟んだマスターとスレーブ間や,中間スレーブとスレーブ間の遅延状態なども確認できるようになります。

中間スレーブを挟んだマスターとスレーブ間の遅延状態

mysql >SELECT TIMEDIFF(APPLYING_TRANSACTION_START_APPLY_TIMESTAMP,APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP) as DIFF_TIME  FROM replication_applier_status_by_worker ;
+-----------------+
| DIFF_TIME       |
+-----------------+
| 00:29:03.374953 |
+-----------------+

中間スレーブとスレーブ間の遅延状態

mysql >SELECT TIMEDIFF(APPLYING_TRANSACTION_START_APPLY_TIMESTAMP,APPLYING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP) as DIFF_TIME  FROM replication_applier_status_by_worker ;
+-----------------+
| DIFF_TIME       |
+-----------------+
| 00:10:01.124343 |
+-----------------+

また,今回紹介した内容について詳しく確認したい方は,以下のドキュメントをご参照ください。

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala