mysql 存储过程 lock table_【MySql】存储过程执行失败

2ff34e647e2e3cdfd8dca593e17d9b0a.png

文章目录

最近发现如果业务到达高峰期,凌晨执行的某项Job就会不执行;但是如果我手动去跑的话,发现又是正常的。后来通过google和stackoverflow找到了解决问题的办法,特此记录一下。

出了问题,那自然是要找问题出在哪里。google上找一下mysql的log在什么地方:

dd8f430dc33d6ed36c69176813564b2c.png

读懂了上面说的关于mysql的几种错误日志,我们看下我们自己的mysql已经配置了什么吧。1$ vim /etc/my.cnf

然后我们看到:

71d616d21d049a4156242d9198c0c310.png

我们的 error log日志,均存储在/var/log/mysqld.log中

然后我们就到指定的目录下看一看到底存储过程的执行过程中发生了什么情况吧。1$ vim /etc/mysqld.log

6dbe134947efd647e46edbb1c2b7d422.png

图中可以很清楚的看到,最近2天凌晨的任务,都出现的错误导致失败,错误内容是:The total number of locks exceeds the lock table size

解决问题

问题找到了,我们就继续google解决办法吧

54b52028572969d8b3e932100f323459.png

解决步骤说的很清楚了,在mysql的配置文件中,修改一下Innodb buffer pool size的值就好了,默认的值是8M,这个我们从上面的错误日志中也能看到相关的信息,我们可以先在mysql中查一下这个buffer的值,1mysql > show variables like '%buffer%';

5a8a251789e8fb6f70c6f48adc5e6281.png

果然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

2

3

4

5

6

7SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM

(SELECT variable_value PagesData

FROM information_schema.global_status

WHERE variable_name='Innodb_buffer_pool_pages_data') A,

(SELECT variable_value PageSize

FROM information_schema.global_status

WHERE variable_name='Innodb_page_size') B;

得到的结果就是你的存储过程在过去的一段时间使用到的缓冲区的峰值大小,单位是GB;然后你可以根据这个大小来决定你到底要分配多少内存过去了~:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值