MySQL max_allowed_packet設置及問題
場景:
當日志中出現了諸如:“Package for query is too large (xxxxxxxx > 4194304). You can change this value on the server by setting the max_allowed_package variable”或者本地執行SQL文件出現了“Got a packet bigger than 'max_allowed_packet' bytes”提示,錯誤的本身就清楚的提示了對應的方式。
原因分析:
mysql根據配置文件會限制server接受的數據包大小。有時候大的插入和更新會受max_allowed_packet 參數限制,導致寫入或者更新失敗,導致項目訪問異常。
解決過程:
1. 進入mysql
mysql -hlocalhost -uroot -p 回車進行mysql數據庫。
2. 查看max_allowed_packet最大允許包
輸入命令 show VARIABLES like '%max_allowed_packet%';
顯示如下
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 4194304 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
2 rows in set, 1 warning (0.01 sec)
可以從返回結果看出max_allowed_packet當前為4M,顯然小了。
3. 更改max_allowed_packet包大小
方案一,臨時修改:輸入命令 set global max_allowed_packet = 2*1024*1024*10; (注意,這里的大小只能填寫字節。重啟mysql服務后,配置將會失效!)然后關閉掉這此mysql server鏈接,再進入查看。
方案二,修改my.ini文件,在[mysqld]部分加入 max_allowed_packet=大小
(注意,這里可以寫XXM,但后面不用加";"號。如果存在max_allowed_packet,直接調整其值。重啟mysql服務后,將永久生效)
mysql --help | grep my.cnf
去尋找my.cnf文件。linux下該文件在/etc/下。
方案三,官網給出的解決辦法是加啟動參數,找到mysql的啟動腳本,把啟動參數貼上
說明
包或任何生成的/中間字符串的最大大小。這個過程大部分發生在load data file中,有時也發生在update,insert中。
包消息緩沖區初始化為net_buffer_length字節,但需要時可以增長到max_allowed_packet字節。該值默認很小,以捕獲大的(可能是錯誤的)數據包。
如果你使用大的BLOB 列或長字符串,你必須增加該值。應同你想要使用的最大的BLOB一樣大。max_allowed_packet的協議限制為1GB。這個值必須是1024的倍數;如果不是1024倍數的值,mysql就會自動四舍五入為最接近的1024的倍數。
當你改變max_allowed_packet的值,你就改變了消息緩沖區的大小,你也應該在客戶端允許的范圍內修改客戶端的buffer大小。在客戶端,max_allowed_packet默認值是1GB。你可以通過命令行或者配置文件,改變客戶端的max_allowed_packet值。
在MySQL5.0.84版本中,會話max_allowed_packet值,還只是只讀的。在5.0.84之前的版本,設置會話中可以設置max_allowed_packet的值,但是沒什么作用。
參考文檔: