最近清理公司测试环境数据库垃圾数据,在某一张表中使用了delete根据条件删除数据,却没有意识到where条件中没有建立索引,而该表数据量已经较大了,因为delete语句执行很长时间还是没有释放;强制中断链接,为该表字段建立索引,因此进入了死锁状态。
问题排查:文章源自IT老刘-https://wp.itlao6.com/9197.html
1、通过 show full processlist语句,查询数据库当前连接及连接状态等;发现delete语句处于locked状态;文章源自IT老刘-https://wp.itlao6.com/9197.html
2、我们使用kill指令终止delete语句;然后具体使用show processlist查询,发现delete语句变成了killed状态,而且该状态在很长时间仍然未发生变化;文章源自IT老刘-https://wp.itlao6.com/9197.html
3、对于killed状态我们只有等待了(本人新手,有其他办法的希望告知)。文章源自IT老刘-https://wp.itlao6.com/9197.html
原因分析:文章源自IT老刘-https://wp.itlao6.com/9197.html
(非专业DB,如有错误请指正,谢谢!)locked状态是因为delete语句会锁定表的写入,我们使用kill指令会杀死该进程,从而让delete进入了killed状态;而delete条件删除带有事务,终止后需要进行事务回滚,因为killed状态会长时间停留,此时我们也只能等待。文章源自IT老刘-https://wp.itlao6.com/9197.html
总结:文章源自IT老刘-https://wp.itlao6.com/9197.html
1、show full processlist 先查询是否有锁表情况文章源自IT老刘-https://wp.itlao6.com/9197.html
2、kill 进程id 杀死锁表进程文章源自IT老刘-https://wp.itlao6.com/9197.html
3、如果有事务,需要一定时间进行回滚,会处于killed状态,等待即可(等待时长与你之前的语句执行时间长短有关)文章源自IT老刘-https://wp.itlao6.com/9197.html
注意:文章源自IT老刘-https://wp.itlao6.com/9197.html
1、当数据表数据量大,执行条件操作时,注意条件是否带有索引,且在该条件语句执行时索引是否生效文章源自IT老刘-https://wp.itlao6.com/9197.html
2、生产数据量太大时,不要轻易给数据库建立索引,因为建立索引的过程也会锁表,数据量太大,锁表时间较长,生产环境会导致出现排队情况文章源自IT老刘-https://wp.itlao6.com/9197.html 文章源自IT老刘-https://wp.itlao6.com/9197.html
河南省驻马店市 1F
订阅