正常运行很久的代码,昨天发现有个数据表居然没有统计出来数据,后来看日志发现报错:
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)日后仅保留一个月历史数据。