记一次数据库死锁问题

  • 1,643 views
  • 阅读模式
记一次数据库死锁问题

最近清理公司测试环境数据库垃圾数据,在某一张表中使用了delete根据条件删除数据,却没有意识到where条件中没有建立索引,而该表数据量已经较大了,因为delete语句执行很长时间还是没有释放;强制中断链接,为该表字段建立索引,因此进入了死锁状态。

问题排查:

1、通过 show full processlist语句,查询数据库当前连接及连接状态等;发现delete语句处于locked状态;

2、我们使用kill指令终止delete语句;然后具体使用show processlist查询,发现delete语句变成了killed状态,而且该状态在很长时间仍然未发生变化;

3、对于killed状态我们只有等待了(本人新手,有其他办法的希望告知)。

原因分析:

(非专业DB,如有错误请指正,谢谢!)locked状态是因为delete语句会锁定表的写入,我们使用kill指令会杀死该进程,从而让delete进入了killed状态;而delete条件删除带有事务,终止后需要进行事务回滚,因为killed状态会长时间停留,此时我们也只能等待。

总结:

1、show full processlist 先查询是否有锁表情况

2、kill 进程id 杀死锁表进程

3、如果有事务,需要一定时间进行回滚,会处于killed状态,等待即可(等待时长与你之前的语句执行时间长短有关)

注意:

1、当数据表数据量大,执行条件操作时,注意条件是否带有索引,且在该条件语句执行时索引是否生效

2、生产数据量太大时,不要轻易给数据库建立索引,因为建立索引的过程也会锁表,数据量太大,锁表时间较长,生产环境会导致出现排队情况

weinxin
扫码关注微信公众号--IT老五
微信扫一扫关注公众号,获取更多实用app,订阅地址不定时更新
IT老五
  • 本文由 发表于 2022-08-23 09:00:00
  • 转载请务必保留本文链接:https://itlao5.com/9197.html
评论  1  访客  1
    • doi
      doi 1

      订阅

    匿名

    发表评论

    匿名网友 填写信息

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

    确定