ping()這個函數先檢測資料連接配接是否正常,如果被關閉,整個把目前腳本的MYSQL執行個體關閉,再重新連接配接。
經 過這樣處理後,可以非常有效的解決MySQL server has gone away這樣的問題,而且不會對系統造成額外的開銷。
今天遇到類似的情景,MySQL隻是冷冷的說:MySQL server has gone away。
大概浏覽了一下,主要可能是因為以下幾種原因:
一種可能是發送的SQL語句太長,以緻超過了max_allowed_packet的大小,如果是這種原因,你隻要修改my.cnf,加大max_allowed_packet的值即可。
還有一種可能是因為某些原因導緻逾時,比如說程式中擷取資料庫連接配接時采用了Singleton的做法,雖然多次連接配接資料庫,但其實使用的都是同一個連接配接,而且程式中某兩次操作資料庫的間隔時間超過了wait_timeout(SHOW STATUS能看到此設定),那麼就可能出現問題。最簡單的處理方式就是把wait_timeout改大,當然你也可以在程式裡時不時順手mysql_ping()一下,這樣MySQL就知道它不是一個人在戰鬥。
解決MySQL server has gone away
1、應用程式(比如PHP)長時間的執行批量的MYSQL語句。最常見的就是采集或者新舊資料轉化。
解決方案:
在my.cnf檔案中添加或者修改以下兩個變量:
wait_timeout=2880000
interactive_timeout = 2880000
關于兩個變量的具體說明可以google或者看官方手冊。如果不能修改my.cnf,則可以在連接配接資料庫的時候設定CLIENT_INTERACTIVE,比如:
sql = “set interactive_timeout=24*3600”;
mysql_real_query(...)
2、執行一個SQL,但SQL語句過大或者語句中含有BLOB或者longblob字段。比如,圖檔資料的處理
解決方案:
在my.cnf檔案中添加或者修改以下變量:
max_allowed_packet = 10M(也可以設定自己需要的大小)
max_allowed_packet參數的作用是,用來控制其通信緩沖區的最大長度
22/2<12