Mysql 5.7 버전 이상 부터는 performance_schema를 이용하여 메타데이타 락을 유발하는 쿼리를 쉽게 찾을 수 있으나
Maria DB에서는 현재까지 metadata plugin 을 이용하여 조회하는 information_schema.metadata_lock_info , processlist를 조회하여
metadata 유발 쿼리를 조회합니다. 이 경우 , MDL 관련 thread 가 많아지면 어떤 쿼리가 유발 쿼리인지 찾기 힘든 점이 있어
MDL 유발 thread 를 쉽게 찾는 쿼리를 공유드립니다.
-1. SESSION A ( DML - HOLDER 1)
MariaDB [(none)]> SELECT * FROM TEST.MDL_TEST; +------+ | NUM | +------+ | 1 | | 2 | | 3 | | 4 | +------+ 4 rows in set (0.00 sec) MariaDB [(none)]> UPDATE TEST.MDL_TEST SET NUM=5 WHERE NUM=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
-2. SESSION B ( DML - HOLDER 2)
MariaDB [(none)]> UPDATE TEST.MDL_TEST SET NUM=6 WHERE NUM=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
-3. SESSION C ( DML - HOLDER 3)
MariaDB [(none)]> UPDATE TEST.MDL_TEST SET NUM=7 WHERE NUM=3; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
-4. SESSION D ( DDL - WAITING )
MariaDB [(none)]> DROP TABLE TEST.MDL_TEST;
=> MDL 대기중
-. MDL 유발 쿼리 조회
MariaDB [(none)]> SELECT DISTINCT
-> CONCAT('THREAD ',PL.ID,' SQL "',PL.INFO,'" IS LOCKED BY THREAD ',MDL.THREAD_ID)
-> FROM INFORMATION_SCHEMA.PROCESSLIST PL,
-> INFORMATION_SCHEMA.METADATA_LOCK_INFO MDL
-> WHERE LOCATE(lcase(MDL.LOCK_TYPE), lcase(PL.STATE))>0
-> AND LOCATE(LCASE(MDL.TABLE_NAME),LCASE(PL.INFO))>0;
+---------------------------------------------------------------------------------+
| CONCAT('THREAD ',PL.ID,' SQL "',PL.INFO,'" IS LOCKED BY THREAD ',MDL.THREAD_ID) |
+---------------------------------------------------------------------------------+
| THREAD 2849 SQL "DROP TABLE TEST.MDL_TEST" IS LOCKED BY THREAD 2799 |
| THREAD 2849 SQL "DROP TABLE TEST.MDL_TEST" IS LOCKED BY THREAD 2800 |
| THREAD 2849 SQL "DROP TABLE TEST.MDL_TEST" IS LOCKED BY THREAD 2810 |
+---------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
=> MDL 대기중인 Thread ID 와 해당 쿼리 및 홀더 쓰레드를 한번에 보여줌