mysql ERROR 1206 (HY000)

正常运行很久的代码,昨天发现有个数据表居然没有统计出来数据,后来看日志发现报错:

ERROR 1206 (HY000) at line 1: The total number of locks exceeds the lock table size


后来简单上网查了一下,大部分文章将到的是innodb_buffer_pool_size设置过小了,可是我查看了一下我用的mysql

buffersize是100M,感觉够用了,况且这么多数据表,单单这个表出问题,应该不是缓冲大小的问题。


查看表的结构信息,发现数据量比较大(13.5G),于是想清掉较早的历史数据来减少表的负担。


于是: delete from XXX where XXX;

结果:运行了一段时间,报出上述错误。


仔细观察,这个表的建表语句,发现没有建索引,而这个错误直接关系到mysql缓冲区大小问题。

如果类似delete这种操作,如果没有索引,势必要扫描全表,如果数据量到达一定规模,则会对缓冲区造成压力,

超过一定阈值,就引发上述的ERROR。


测试:delete from XXX where XXX limit 10;

结果:运行成功。


----

针对此次问题的解决办法:

1. 将buffersize增大再重启mysql服务;

2. 减少表的数据量,保证不会对缓冲区造成过度压力。

综合考虑维持线上服务的稳定性,认为重启服务并不是此次解决问题的明智选择,

出问题的表属于中转表,通常中转表不会留存太久的数据,因为以及有备份库存储了。

最后决定,1)将整个表truncate掉,为防止没有索引造成的问题,在truncate之后,对主要关键字段进行索引的构建。

2)日后仅保留一个月历史数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值