文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.2.7 MySQL 伺服器已消失

本節也涵蓋相關的 查詢期間與伺服器的連線中斷 錯誤。

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 節「封包過大」

    插入大量資料列的 INSERTREPLACE 陳述式也可能導致這類錯誤。這兩個陳述式都向伺服器傳送單一請求,而不考慮要插入的資料列數量;因此,您通常可以藉由減少每個 INSERTREPLACE 所傳送的資料列數量來避免錯誤。

  • 如果主機名稱查閱失敗(例如,如果您的伺服器或網路所依賴的 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 節「錯誤記錄」

如果您想要建立關於此問題的錯誤報告,請務必包含以下資訊

另請參閱 第 B.3.2.9 節,「通訊錯誤與中止連線」,以及 第 1.6 節,「如何回報錯誤或問題」