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