环境:linux centOS6.5 数据库:mysql 5.1.73,在/etc/my.cnf中设置max_allowed_packet = 4M(重启数据库),但是一段时间后max_allowed_packet会重置为1024,这样导致在做查询或插入操作时,项目出现无法访问数据库的情况,报如下错误:
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4357 > 1024). You can change this value on theserver by setting the max_allowed_packet' variable.
这个问题我在网上也看了好多解决办法,大多数都是以在/etc/my.cnf中 set global max_allowed_packet = 2*1024*1024*10(需要重启数据库); 但是这样设置之后也重样会出现之前出现的问题。最后在网上看了很多有关mysql的文档,了解到mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。
我的解决方法如下:
1、 开启定时器
(1) 查看是否开启定时器 --->SHOW VARIABLES LIKE'event_scheduler';
(2)开启定时器 0:off 1:on SET GLOBAL event_scheduler =1;
2、在数据库创建一个过程setMaxAllowedPacket()
BEGIN
set global max_allowed_packet= 1024*1024*20*3;
END
3、创建事件--->在数据库中执行该事件--->执行完成之后在mysql中的event表中会出现一条记录
CREATE EVENT IF NOTEXISTSe_maxallowedpacket
ON SCHEDULE EVERY 10 SECOND
ON COMPLETION PRESERVE
DO CALLsetMaxAllowedPacket();
4、上面开启的定时任务,在重启数据库之后,定时任务就是关闭又要重新启动。为了每次重新启动,在/etc/my.cnf中设置一下:event_scheduler = 1
这样在每次重启linux服务的时候,会自动执行my.cnf文件