報錯資訊MySQL server has gone away!引數設定過小導致記錄寫入失敗!(解決辦法)
報錯資訊: Warning: PDO::exec(): MySQL server has gone away
原因是:mysql max_allowed_packet 設定過小導致記錄寫入失敗!
mysql根據配置檔案會限制server接受的資料包大小。
有時候大的插入和更新會受max_allowed_packet 引數限制,導致寫入或者更新失敗。
檢視目前配置
show VARIABLES like '%max_allowed_packet%';
顯示的結果為:
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
以上說明目前的配置是:1M
修改方法
1、修改配置檔案
可以編輯my.cnf來修改(windows下my.ini),在[mysqld]段或者mysql的server配置段進行修改。
max_allowed_packet = 20M如果找不到my.cnf可以通過
mysql --help | grep my.cnf去尋找my.cnf檔案。
linux下該檔案在/etc/下。
2、在mysql命令列中修改
在mysql 命令列中執行
set global max_allowed_packet = 2*1024*1024*10然後退出命令列,重啟mysql服務,再進入。(這裡設定的是20M大小)
show VARIABLES like '%max_allowed_packet%';檢視下max_allowed_packet是否編輯成功
注意:該值設定過小將導致單個記錄超過限制後寫入資料庫失敗,且後續記錄寫入也將失敗。
mysql的max_allowed_packet屬性修改後無效-解決思路
找到mysqld.cof將裡面設定為max_allowed_packet=10M;mysql啟動後通過show VARIABLES like ‘%max_allowed_packet%’;值是20971520;生效。
但是,過了一段時間後,依然提示上面的異常;檢視mysql配置依然是10M;
後來看了一篇部落格,他用command設定set global max_allowed_packet = 16M無效,但是通過set global max_allowed_packet = 210241024*10設定卻生效了。
於是就值修改為:max_allowed_packet=20971520,儲存重啟mysql ,OK了
結論:有些伺服器下的mysql由於某些原因可能無法將M轉為k。
另外,如果使用docker 容器的mysql ,並且把mysql容器的配置檔案目錄對映到宿主機本地目錄,也會報以上異常;
主要原因為:宿主機的本地目錄許可權不夠;
用命令:chmod * 777 -R ;修改宿主機目錄許可權後,此問題不在出現。
能看到這裡,請領取我的最後乾貨!!!
經過幾番測試,得出如下結論
show global VARIABLES like '%max_allowed_packet%'; (注意:mysql 系統引數分為session和global 之分, session只當前連線生效,global 全域性連線生效)
通過mysql客戶端,set global max_allowed_packet = 2*1024*1024*10; (修改後,重啟資料庫會恢復為預設)注意
修改my.cnf 在[mysqld]段或者mysql的server配置段進行修改。(終極修改, 修改後重啟資料庫,永久生效)