记一次数据库死锁问题

  • A+
所属分类:DB 原创 工具&方法
记一次数据库死锁问题

最近清理公司测试环境数据库垃圾数据,在某一张表中使用了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
我的微信公众号
微信扫一扫关注公众号,不定时更新
Thinkin

发表评论

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

目前评论:1   其中:访客  0   博主  0

    • avatar doi 1

      订阅