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
