Golang-mysql设置max_allowed_packet

某天业务系统上线第二天突然发现部分功能不能正常运转,分析系统的日志发现里面出现很多错误信息不停在重试,通过关键词定位后,去掉过大的无用信息发现是数据过大insert到mysql过程中出错,报错信息如下:”packet for query is too large. try adjusting the ‘max_allowed_packet’ variable on the server”; 根据错误信息寻找dba帮忙设置mysql的max_allowed_packet,执行语句后重启服务依然不能解决; #查询最大允许包 SELECT @@max_allowed_packet;

set global max_allowed_packet=1000000000;

因为不知道默认大小限制因此写了端测试代码,确定了一个区间 最后发现默认插入长度在4M左右(4194170),超过这个值后就会出错,突然又翻到DBA开始聊天时候的提示可能是client的限制导致;

经过分析,错误是导入的包返回的,因此找到对应的package,对应的错误来自”https://pkg.go.dev/github.com/go-sql-driver/mysql"中的 ErrPktTooLarge, 这个错误和mysqlConn.maxAllowedPacket 判断产生的,初始化的过程如果没有设置的话默认就是4M的大小 defaultMaxAllowedPacket = 4 << 20 // 4 MiB 查询文档go-myql驱动发现 maxAllowedPacket参数需要设置在dsn中,如果设置为0,每次会查询mysql设置的大小,如果不设置的话限制发送最大包为4M,可以直接设置为1000000000(1G),问题得到解决;官方文档的解释如下:

Max packet size allowed in bytes. The default value is 4 MiB and should be adjusted to match the server settings. maxAllowedPacket=0 can be used to automatically fetch the max_allowed_packet variable from server on every connection.

启示: 问题虽然解决了,但是由于开始遇到问题时候使用搜索引擎直接搜错误信息,没加 go mysql 关键字导致并没有很快解决; 后来发现原本一位gopher同行遇到并mark过,链接在这里; 因此遇到问题的时候还是要先从源码入手,查看官方文档,不能乱了阵脚,不然没了思路会耽误更多;

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 1142 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments