本節也涵蓋相關的 查詢期間與伺服器的連線中斷
錯誤。
MySQL 伺服器已消失
錯誤最常見的原因是伺服器逾時並關閉連線。在這種情況下,您通常會收到以下其中一個錯誤碼(您收到的錯誤碼取決於作業系統)。
錯誤碼 | 描述 |
---|---|
CR_SERVER_GONE_ERROR |
用戶端無法傳送問題給伺服器。 |
CR_SERVER_LOST |
用戶端在寫入伺服器時沒有收到錯誤,但沒有收到問題的完整答案(或任何答案)。 |
預設情況下,如果沒有任何動作發生,伺服器會在八小時後關閉連線。您可以藉由在啟動 mysqld 時設定 wait_timeout
變數來變更時間限制。請參閱第 7.1.8 節「伺服器系統變數」。
如果您有腳本,您只需要再次發出查詢,讓用戶端進行自動重新連線。這假設您已在用戶端中啟用自動重新連線(這是 mysql
命令列用戶端的預設設定)。
MySQL 伺服器已消失
錯誤的一些其他常見原因包括
您(或資料庫管理員)已使用
KILL
陳述式或 mysqladmin kill 命令終止了正在執行的執行緒。您嘗試在關閉與伺服器的連線後執行查詢。這表示應用程式中存在應該修正的邏輯錯誤。
在不同主機上執行的用戶端應用程式沒有從該主機連線至 MySQL 伺服器的必要權限。
您在用戶端收到 TCP/IP 連線逾時。如果您一直在使用以下命令,可能會發生這種情況:
mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)
或mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)
。在這種情況下,增加逾時時間可能有助於解決問題。您在伺服器端遇到了逾時,且用戶端中的自動重新連線已停用(
MYSQL
結構中的reconnect
旗標等於 0)。您使用的是 Windows 用戶端,且伺服器已中斷連線(可能是因為
wait_timeout
過期)在發出命令之前。Windows 上的問題在於,在某些情況下,當寫入到伺服器的 TCP/IP 連線時,MySQL 不會從作業系統收到錯誤,而是在嘗試從連線讀取答案時才會收到錯誤。
解決方案是在上次查詢後經過很長時間時對連線執行
mysql_ping()
(這是 Connector/ODBC 的作法),或將wait_timeout
設定在 mysqld 伺服器上,使其實際上永不逾時。如果您傳送給伺服器的查詢不正確或太大,也可能會收到這些錯誤。如果 mysqld 收到過大或順序錯誤的封包,它會假設用戶端發生問題並關閉連線。如果您需要大型查詢(例如,如果您正在使用大型
BLOB
資料行),您可以藉由設定伺服器的max_allowed_packet
變數來增加查詢限制,其預設值為 64MB。您可能還需要在用戶端增加最大封包大小。如需有關設定封包大小的詳細資訊,請參閱第 B.3.2.8 節「封包過大」。插入大量資料列的
INSERT
或REPLACE
陳述式也可能導致這類錯誤。這兩個陳述式都向伺服器傳送單一請求,而不考慮要插入的資料列數量;因此,您通常可以藉由減少每個INSERT
或REPLACE
所傳送的資料列數量來避免錯誤。如果主機名稱查閱失敗(例如,如果您的伺服器或網路所依賴的 DNS 伺服器當機),也可能會看到此錯誤。這是因為 MySQL 依賴主機系統進行名稱解析,但無法得知它是否正常運作—從 MySQL 的角度來看,問題與任何其他網路逾時沒有區別。
如果 MySQL 在啟用
skip_networking
系統變數的情況下啟動,您也可能會看到MySQL 伺服器已消失
錯誤。如果您的防火牆封鎖了 MySQL 連接埠(預設為 3306),導致無法連線至 MySQL 伺服器,則可能會發生另一個可能導致此錯誤的網路問題。
您也可能會在會 Fork 子處理序的應用程式中遇到此錯誤,這些子處理序都嘗試使用相同的連線連線至 MySQL 伺服器。藉由為每個子處理序使用單獨的連線,可以避免這種情況。
您遇到了在執行查詢時伺服器當機的錯誤。
您可以藉由執行 mysqladmin version 並檢查伺服器的運作時間來檢查 MySQL 伺服器是否當機並重新啟動。如果用戶端連線因 mysqld 崩潰並重新啟動而中斷,您應專注於找出崩潰的原因。首先檢查再次發出查詢是否再次導致伺服器當機。請參閱第 B.3.3.3 節「如果 MySQL 持續崩潰該怎麼辦」。
您可以藉由以設定為 3 的 log_error_verbosity
系統變數啟動 mysqld 來取得有關連線中斷的更多資訊。這會在 hostname.err
檔案中記錄一些連線中斷訊息。請參閱第 7.4.2 節「錯誤記錄」。
如果您想要建立關於此問題的錯誤報告,請務必包含以下資訊
指出 MySQL 伺服器是否當機。您可以在伺服器錯誤記錄中找到相關資訊。請參閱第 B.3.3.3 節「如果 MySQL 持續崩潰該怎麼辦」。
如果特定的查詢導致 mysqld 終止,且相關表格在執行查詢前已使用
CHECK TABLE
檢查過,您是否可以提供一個可重現的測試案例?請參閱 第 7.9 節,「除錯 MySQL」。MySQL 伺服器中
wait_timeout
系統變數的值是多少?(mysqladmin variables 可以提供此變數的值。)您是否嘗試啟用一般查詢日誌來執行 mysqld,以判斷有問題的查詢是否出現在日誌中?(請參閱第 7.4.3 節,「一般查詢日誌」。)