Mysql max_allowed_packet参数调整实例
max_allowed_packet为mysql限制server接受的数据包的大小值,如果写入或者更新的数据包大于配置文件my.cnf其值,则会报错。
某天试运行的某系统管理员和项目组反应他们应用报错了,看日志和数据库有关系,他们试着调整参数,但是没有起作用。
调整命令:
set global max_allowed_packet = 50 * 1024 * 1024;
但是应用还是报错
具体应用报错如下:
++### Eorror updating databases. Cause: com.mysql.jdbc,PacketTooBigException: Packet for query is too large.
You can change this value on the server by setting the ‘max_allowed_packet’ variable.
++### The error may involve com.xxxxxxxx.xxxx.mapper.SqliteMapper.updateData-Inline
==### SQL: REPLACE INTO t_xxx_xxxx_xxxxx(xxx,xxx,xxx,xxxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xx,xxx,xxx,xxx,xxx,xxx) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
…
经咨询此系统是和外部系统由数据交互,每天都有外部系统数据推送过来,然后在更新或者插入。
考虑其系统是数据类分析系统,只是动态调整如果重启就会失效。
由于是一主一从架构,主从分别调整my.cnf
vi my.cnf
[mysqld]
#max_allowed_packet = 16M
max_allowed_packet = 50M
wq!
主从分别重启数据库为了两边都加载新的值,应用重新连主库,再查看应用日志显示数据可以正常导入,没有报错。
注意点:
1、如果涉及主从,主库和从库分别调整,不能只改一边,如果主从切换则应用还会报错,调整配置文件以后,务必重启mysql服务。
2、根据官方文档此max_allowed_packet参数最大是1G,动态命令行调整只能使用字节数设置,而且必须是global,配置文件调整才允许设置M、G单位。
3、项目组先用命令行调整没有生效,是因为应用没有重新建链,所以还是识别之前的值,本次重启了数据库应用重新建链,外部数据可以正常导入。