我最近發(fā)現(xiàn),早先運(yùn)行良好的SQL查詢現(xiàn)在在60秒后超時(shí)并引發(fā)錯(cuò)誤。該查詢速度很慢,但是作為日常工作的一部分運(yùn)行,因此它本身不是問題(因此請(qǐng)不要建議我對(duì)其進(jìn)行優(yōu)化)。通過運(yùn)行“ select SLEEP(120);”,我能夠一致地重現(xiàn)該錯(cuò)誤。從PHP如下所示。但是,從MySQL客戶端運(yùn)行相同的語句成功(返回0)。我試過調(diào)整wait_timeout(設(shè)置為28800),但是沒有運(yùn)氣。我還重新啟動(dòng)了數(shù)據(jù)庫(kù)服務(wù)器和計(jì)算機(jī)本身。它總是總是在60秒后超時(shí)的事實(shí)向我表明,這很可能是一種設(shè)置,而不是有限的資源問題。我正在運(yùn)行:Windows Server 2003MySql 5.1.36-社區(qū)PHP 5.3以下是我的測(cè)試代碼,SHOW VARIABLES的輸出和結(jié)果謝謝!碼: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貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
當(dāng)我遇到此問題時(shí),它不是由wait_timeout(設(shè)置為默認(rèn)的8小時(shí))引起的,而是由具有大型INSERT語句的max_allowed_packet引起的。從PHP更改max_allowed_packet無效,但是當(dāng)我在/etc/my.cnf的mysqld部分中更改它并重新啟動(dòng)MySQL服務(wù)器時(shí),問題消失了。
添加回答
舉報(bào)
0/150
提交
取消