継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

MySQL 5.7 と 8.0 でのロック情報の確認テーブルについて

タダです.

Aurora MySQL 5.7 のサポート期限が迫っており,順次 MySQL 8.0 に移行中です.そんな折に 5.7 では使用できていたロック情報の確認テーブルが 8.0 で使用できなくなっていました.この記事ではどのテーブルが変更になっていたかをまとめていきます.

変更があったテーブルについて

テーブルのロック状態をチェックするモニターで MySQL 5.7 → 8.0 にバージョンアップしたら Error 1109(42S02): Unknown table 'INNODB_LOCK_WAIT' in information_schema というエラーが出るようになりました.確かに MySQL 8.0 で INNODB_LOCK_WAIT がなくなっていました.

MySQL 8.0 で 確認した結果

INNODB_BUFFER_PAGE
INNODB_BUFFER_PAGE_LRU
INNODB_BUFFER_POOL_STATS
INNODB_CACHED_INDEXES
INNODB_CMP
INNODB_CMPMEM
INNODB_CMPMEM_RESET
INNODB_CMP_PER_INDEX
INNODB_CMP_PER_INDEX_RESET
INNODB_CMP_RESET
INNODB_COLUMNS
INNODB_DATAFILES
INNODB_FIELDS
INNODB_FOREIGN
INNODB_FOREIGN_COLS
INNODB_FT_BEING_DELETED
INNODB_FT_CONFIG
INNODB_FT_DEFAULT_STOPWORD
INNODB_FT_DELETED
INNODB_FT_INDEX_CACHE
INNODB_FT_INDEX_TABLE
INNODB_INDEXES
INNODB_METRICS
INNODB_SESSION_TEMP_TABLESPACES
INNODB_TABLES
INNODB_TABLESPACES
INNODB_TABLESPACES_BRIEF
INNODB_TABLESTATS
INNODB_TEMP_TABLE_INFO
INNODB_TRX
INNODB_TRX_STATUS
INNODB_VIRTUAL

また,INNODB_LOCKSINNODB_LOCK_WAITS は 8.0 で削除されていることをドキュメントからも確認しました.

このテーブルは非推奨で、MySQL 8.0.1 の時点で削除されています。

関連情報

dev.mysql.com

dev.mysql.com

MySQL 8.0 ではどのテーブルを見ると良いか

ではどのテーブルを見るとよいかというと, performance_schema.data_locksperformance_schema.data_lock_waits になります.前者が行ロックを保持,もしくは行ロックを取得しようと待機している状態を確認できます.後者はスレッド間の行ロックの依存関係を把握することができます.試しにロック状態にしてテーブルにクエリしてみると以下のようにロック状態の確認ができます.

mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140387321745312:1063:140387841760192
ENGINE_TRANSACTION_ID: 1322
            THREAD_ID: 51
             EVENT_ID: 25
        OBJECT_SCHEMA: deadlock_test
          OBJECT_NAME: users
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140387841760192
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 2. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140387321745312:2:4:4:140387842858016
ENGINE_TRANSACTION_ID: 1322
            THREAD_ID: 51
             EVENT_ID: 25
        OBJECT_SCHEMA: deadlock_test
          OBJECT_NAME: users
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 140387842858016
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: WAITING
            LOCK_DATA: 20
*************************** 3. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140387321744520:1063:140387841759168
ENGINE_TRANSACTION_ID: 1321
            THREAD_ID: 50
             EVENT_ID: 33
        OBJECT_SCHEMA: deadlock_test
          OBJECT_NAME: users
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140387841759168
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 4. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140387321744520:2:4:4:140387842853408
ENGINE_TRANSACTION_ID: 1321
            THREAD_ID: 50
             EVENT_ID: 33
        OBJECT_SCHEMA: deadlock_test
          OBJECT_NAME: users
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 140387842853408
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: GRANTED
            LOCK_DATA: 20
*************************** 5. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140387321744520:2:4:5:140387842853752
ENGINE_TRANSACTION_ID: 1321
            THREAD_ID: 50
             EVENT_ID: 33
        OBJECT_SCHEMA: deadlock_test
          OBJECT_NAME: users
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 140387842853752
            LOCK_TYPE: RECORD
            LOCK_MODE: X,GAP
          LOCK_STATUS: GRANTED
            LOCK_DATA: 25
5 rows in set (0.00 sec)
mysql> SELECT * FROM performance_schema.data_lock_waits\G
*************************** 1. row ***************************
                          ENGINE: INNODB
       REQUESTING_ENGINE_LOCK_ID: 140387321745312:2:4:4:140387842858016
REQUESTING_ENGINE_TRANSACTION_ID: 1322
            REQUESTING_THREAD_ID: 51
             REQUESTING_EVENT_ID: 25
REQUESTING_OBJECT_INSTANCE_BEGIN: 140387842858016
         BLOCKING_ENGINE_LOCK_ID: 140387321744520:2:4:4:140387842853408
  BLOCKING_ENGINE_TRANSACTION_ID: 1321
              BLOCKING_THREAD_ID: 50
               BLOCKING_EVENT_ID: 33
  BLOCKING_OBJECT_INSTANCE_BEGIN: 140387842853408

関連情報

gihyo.jp

まとめ

MySQL 5.7 と 8.0 でロック情報を確認するためのテーブルが変わっていたのでまとめました.