解決mysql_query()報錯的相關問題

MagicProgram發表於2011-04-12

今天在對自己程式進行測試時,發現剛開始正常,過段時間後會出現“MySQL server has gone away”的錯誤,定位後發現是由mysql_query()函式引起的。因此上網找到如下的解決方案,但是仔細分析後,發現自己的程式是不存在上述問題的。

所以,又進行了進一步的測試工作。發現程式仍是在執行mysql_query()函式時報錯,但報錯內容在開始階段會不一樣,有可能是“MySQL server has gone away”,也有可能是“the connection to the server was lost during the query”,當然也有可能是“commands out of sync; you can't run this command now”。在這種情況下,明確就不是由轉自文章上提到的問題。

那麼究竟是什麼問題呢?

對程式進行進一步的分析,發現是在建立一個新的程式後的一段時間後,容易報錯;而在新的程式中用到了資料庫連線資源,且與原程式使用同樣的連線。問題應該就在這裡。經查閱相關資料,發現“如果正在使用mysql_use_result()並且已經呼叫了mysql_free_result()之前試圖執行新查詢,即在兩者之間試圖執行返回資料的兩個查詢,mysql_query()可能會報錯”。

所以,在新程式中使用新的資料庫連線,可解決問題。



  (以下內容轉自http://www.phpq.net/mysql/mysql-server-has-gone-away.html)


應用程式(比如PHP)長時間的執行批量的MYSQL語句。執行一個SQL,但SQL語句過大或者語句中含有BLOB或者longblob欄位。比如,圖片資料的處理。都容易引起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 引數的作用是,用來控制其通訊緩衝區的最大長度。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25432352/viewspace-692272/,如需轉載,請註明出處,否則將追究法律責任。

相關文章