Shelly
2024-09-11
来自广东
确定元数据锁阻塞源,根据相关表关联查询: mysql> SELECT -> p.id AS ID, -> p.user as USER, -> t.PROCESSLIST_DB AS DB_NAME, -> m.OBJECT_NAME AS TABLE_NAME, -> t.PROCESSLIST_TIME AS SPEND_TIME, -> t.PROCESSLIST_INFO AS SQL_TEXT, -> m.LOCK_TYPE AS LOCK_TYPE, -> m.LOCK_STATUS as LOCK_STATUS -> FROM -> information_schema.processlist p -> JOIN -> performance_schema.threads t -> ON -> p.id=t.PROCESSLIST_ID -> JOIN -> performance_schema.metadata_locks m -> ON -> m.OWNER_THREAD_ID=t.THREAD_ID -> WHERE -> m.OBJECT_SCHEMA='test1' and m.OBJECT_NAME='t_ddl'\G *************************** 1. row *************************** ID: 52 USER: root DB_NAME: test1 TABLE_NAME: t_ddl SPEND_TIME: 1176 SQL_TEXT: alter table t_ddl add c int, algorithm=instant LOCK_TYPE: SHARED_UPGRADABLE LOCK_STATUS: GRANTED *************************** 2. row *************************** ID: 52 USER: root DB_NAME: test1 TABLE_NAME: t_ddl SPEND_TIME: 1176 SQL_TEXT: alter table t_ddl add c int, algorithm=instant LOCK_TYPE: EXCLUSIVE LOCK_STATUS: PENDING *************************** 3. row *************************** ID: 54 USER: root DB_NAME: test1 TABLE_NAME: t_ddl SPEND_TIME: 1146 SQL_TEXT: select * from t_ddl limit 1 LOCK_TYPE: SHARED_READ LOCK_STATUS: PENDING *************************** 4. row *************************** ID: 55 USER: root DB_NAME: test1 TABLE_NAME: t_ddl SPEND_TIME: 1187 SQL_TEXT: select * from t_ddl limit 1 for update LOCK_TYPE: SHARED_WRITE LOCK_STATUS: GRANTED 4 rows in set (0.02 sec) 可以查看到阻塞源是select * from t_ddl limit 1 for update,kill 55杀掉阻塞源。
展开
作者回复: 对的,可以通过metadata_locks来查。👍
Geek_0126
2024-09-11
来自浙江
有慢查询或者其他事务占用此表时,会导致DDL无法获取元数据锁。一般可以通过查看活跃链接及事务列表来确定阻塞源。
作者回复: 是的。慢查询和未提交的事务,都是metadata lock的阻塞源。👍
binzhang
2024-09-12
来自美国
is it a best practice to execute "SET innodb_lock_wait_timeout = 1;" before execute any DDL?