【MySql】存储过程执行失败--The total number of locks exceeds the lock table size
阅读数:
最近发现如果业务到达高峰期,凌晨执行的某项Job就会不执行;但是如果我手动去跑的话,发现又是正常的。后来通过google和stackoverflow找到了解决问题的办法,特此记录一下。
查找问题
出了问题,那自然是要找问题出在哪里。google上找一下mysql的log在什么地方:
读懂了上面说的关于mysql的几种错误日志,我们看下我们自己的mysql已经配置了什么吧。
1 | $ vim /etc/my.cnf |
然后我们看到:
我们的 error log日志,均存储在/var/log/mysqld.log
中
然后我们就到指定的目录下看一看到底存储过程的执行过程中发生了什么情况吧。
1 | $ vim /etc/mysqld.log |
图中可以很清楚的看到,最近2天凌晨的任务,都出现的错误导致失败,错误内容是:
The total number of locks exceeds the lock table size
解决问题
问题找到了,我们就继续google解决办法吧
解决步骤说的很清楚了,在mysql的配置文件中,修改一下Innodb buffer pool size
的值就好了,默认的值是8M,这个我们从上面的错误日志中也能看到相关的信息,我们可以先在mysql中查一下这个buffer的值,
1 | mysql > show variables like '%buffer%'; |
果然innodb_buffer_pool_size
的值是8M,那我们就按照帖子里面说的步骤操作下吧:
- 找到mysql的配置文件中(Linux 在
/etc/my.cnf
) - 在
[mysqld]
配置项中添加进innodb_buffer_pool_size=64MB
这行值, 当然如果机器内存足够大,可以按照自己需求设置 - 重启mysql(
service mysqld restart
)
重启之后,可以到mysql下面再次执行show variables like '%buffer%';
命令,看看是不是相应的buffer值已经被改变了。
补充
有同学可能要问了,这里我们是把缓冲区设置成了64M
,但是你如何确定这个64M到底够不够用呢?? 如果不够用怎么办呢??
下面的方法可以帮助你判断自己到底要设置多大的缓冲区。
- 先将缓冲区设置成尽量大一点的,比如内存的25%或者更多,然后让你的MySql正常跑一段时间(1周或者1个月)
- 在mysql中查看下面的内容:
1 | SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM |
得到的结果就是你的存储过程在过去的一段时间使用到的缓冲区的峰值大小,单位是GB
;然后你可以根据这个大小来决定你到底要分配多少内存过去了~: