记一次数据库死锁问题

itlao6 DB 原创 工具&方法1 762字数 681阅读2分16秒阅读模式
记一次数据库死锁问题

最近清理公司测试环境数据库垃圾数据,在某一张表中使用了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

weinxin
我的微信公众号
微信扫一扫关注公众号,不定时更新
itlao6
  • 本文由 发表于 2022年 8月 23日 09:00:00
  • 转载请务必保留本文链接:https://wp.itlao6.com/9197.html
评论  1  访客  1
    • doi
      doi 0

      订阅

    匿名

    发表评论

    匿名网友

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    确定