1. 程式人生 > >報錯資訊MySQL server has gone away!引數設定過小導致記錄寫入失敗!(解決辦法)

報錯資訊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配置段進行修改。(終極修改, 修改後重啟資料庫,永久生效