タダです.
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_LOCKS
と INNODB_LOCK_WAITS
は 8.0 で削除されていることをドキュメントからも確認しました.
このテーブルは非推奨で、MySQL 8.0.1 の時点で削除されています。
関連情報
MySQL 8.0 ではどのテーブルを見ると良いか
ではどのテーブルを見るとよいかというと, performance_schema.data_locks
と performance_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
関連情報
まとめ
MySQL 5.7 と 8.0 でロック情報を確認するためのテーブルが変わっていたのでまとめました.