MySQL max_allowed_packet設置及問題


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的值,但是沒什么作用。

參考文檔:

解決mysql執行SQL文件,報錯。

MySQL調整max_allowed_packet的大小。

記錄一次mysql 5.7 max_allowed_packet修改失敗的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM