Loading

mysql锁表处理

背景:
需要删除一个表,但是发现执行删除以后,整个mysql被卡住,疑似锁库了。

场景一、

一般情况,长时间执行语句锁表(修改表结构等操作),出现Waiting for table metadata lock

#检查有锁表的session,或者长时间执行的慢查询
show full processlist;

#查询表是否在使用
show open tables where in_use >0;

#查看锁表,mysql8可能不一样
#mysql8
select * from sys.innodb_lock_waits;
select * from performance_schema.data_locks;
select * from performance_schema.data_lock_waits;
#mysql5
SELECT * FROM information_schema.INNODB_LOCKs;
SELECT * FROM information_schema.INNODB_LOCK_waits;

#找到指定session,确认以后杀掉异常id
select * from performance_schema.processlist  where id = 42007;
kill 42007

场景二、

事务异常致使锁表

#查看正在运行、未提交的事务,获取session id  ,字段为 trx_mysql_thread_id
select * from information_schema.INNODB_TRX;

#找到指定session,确认以后杀掉异常id
select * from performance_schema.processlist where ID  ='62648'
kill 62648

场景三、

异常查询致使锁表
对Table进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效,没有释放

#当processlist以及INNODB_TRX都查不到结果时,检查查询失败的sql语句,存在错误字段查询也可能会导致锁表,找到异常thread_id
select * from performance_schema.events_statements_current;

#找到指定session,确认以后杀掉异常id
select * from performance_schema.processlist where ID  ='62648'
kill 62648

#扩展:查看历史事务
select * from performance_schema.events_statements_history;

https://www.cnblogs.com/digdeep/p/4892953.html
https://www.cnblogs.com/gered/p/12769367.html

posted @ 2022-09-27 17:20  萝卜青菜~  阅读(484)  评论(0编辑  收藏  举报