1. 问题背景
在一次新版本功能开发完毕,配合测试的过程中,测试反馈某个XxlJob定时任务一直执行失败,在分析了日志之后,找到了报错的原因:
Packet for query is too large (7251422 > 4194304). You can change this value
是因为在程序中做了批量INSERT,而一次插入的数据量太大,超过了MySQL服务器的配置,导致插入失败。所以,我们只需要将这个配置改大一点就行。
2. 解决方案确定
经过搜索,发现决定单次插入数据量的配置是配置文件中的max_allowed_packet
字段,我们使用的MySQL服务是用docker容器启动的。所以配置文件的位置为/etc/mysql/my.cnf
。
首先,查看当前的配置,可以使用SQL查询得知。
show VARIABLES like '%max_allowed_packet%';
查询结果max_allowed_packet=4194304,即:4M。
进入docker容器内查看配置文件,发现配置文件内没有什么配置。
-- 查看所有的docker容器
docker ps -a
-- 进入容器
docker exec -it 容器名or容器ID bash
-- 进入文件目录
cd /etc/mysql
-- 安装vim(有的话不用安装)
apt-get update
apt-get install vim
-- 修改配置为1G
[mysqld]
max_allowed_packet=1073741824
-- 重启MySQL服务(先退出来到linux)
docker restart 容器名or容器ID
3. 小插曲
最开始,使用的设置临时参数,但是没有起作用。
set global max_allowed_packet = 2*1024*1024*10
在首次修改配置文件的时候,没有加[mysqld]
这个分组,导致mysql重启失败,然后也没法进入容器了,只能采用把容器内的配置文件复制出来,修改完再覆盖回去的方法来修改配置。
-- 复制出来
docker cp 容器名or容器ID:/etc/mysql/my.cnf /home/my.cnf
-- 覆盖回去
docker cp /home/my.cnf 容器名or容器ID:/etc/mysql/my.cnf
这里有点奇怪,从容器中复制my.cnf出来显示没有这个文件,然后,用mysql.cnf是可以的,但其实复制的是my.cnf。
另外,查看docker启动日志可以使用
docker -f logs