我最近發現,早先運行良好的SQL查詢現在在60秒后超時并引發錯誤。該查詢速度很慢,但是作為日常工作的一部分運行,因此它本身不是問題(因此請不要建議我對其進行優化)。通過運行“ select SLEEP(120);”,我能夠一致地重現該錯誤。從PHP如下所示。但是,從MySQL客戶端運行相同的語句成功(返回0)。我試過調整wait_timeout(設置為28800),但是沒有運氣。我還重新啟動了數據庫服務器和計算機本身。它總是總是在60秒后超時的事實向我表明,這很可能是一種設置,而不是有限的資源問題。我正在運行:Windows Server 2003MySql 5.1.36-社區PHP 5.3以下是我的測試代碼,SHOW VARIABLES的輸出和結果謝謝!碼:set_error_handler("sqlErrorHandler");set_time_limit(12000);$link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass");mysql_select_db($MYSQL_db, $link);echo "mysql_ping = " . (mysql_ping($link) ? "LIVE" : "DEAD") . "<br /><br />"; $sql = "SELECT SLEEP(120);";$start = microtime(true);mysql_query($sql, $link);echo "**query done**<br />";allDone();function allDone(){ global $start, $sql; $end = microtime(true); echo "sql : $sql<br />"; echo "elapsed : " . ($end - $start) . "<br />"; echo "<br />";}function sqlErrorHandler($errno, $errstr, $errfile, $errline){ global $link; echo "Error : $errno<br />$errstr<br />"; echo "mysql_ping : " . (mysql_ping($link) ? "LIVE" : "DEAD") . "<br />"; echo "<br />"; allDone();}輸出:mysql_ping = LIVEError : 2mysql_query() [function.mysql-query]: MySQL server has gone awaymysql_ping : DEADsql : SELECT SLEEP(120);elapsed : 60.051116943359Error : 2mysql_query() [function.mysql-query]: Error reading result set's headermysql_ping : DEADsql : SELECT SLEEP(120);elapsed : 60.0511469841**query done**sql : SELECT SLEEP(120);elapsed : 60.051155090332
3 回答

回首憶惘然
TA貢獻1847條經驗 獲得超11個贊
當我遇到此問題時,它不是由wait_timeout(設置為默認的8小時)引起的,而是由具有大型INSERT語句的max_allowed_packet引起的。從PHP更改max_allowed_packet無效,但是當我在/etc/my.cnf的mysqld部分中更改它并重新啟動MySQL服務器時,問題消失了。
添加回答
舉報
0/150
提交
取消