文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
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 上的問題是,在某些情況下,MySQL 在寫入伺服器的 TCP/IP 連線時不會收到來自作業系統的錯誤,而是在嘗試從連線讀取答案時收到錯誤。

    解決方案是在上次查詢之後已經過了很長一段時間時,在連線上執行 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 伺服器的任何連線,則會發生另一個可能導致此錯誤的網路問題。

  • 如果應用程式產生子程序,且所有子程序都嘗試使用與 MySQL 伺服器的相同連線,您也可能會遇到此錯誤。 可以為每個子程序使用不同的連線來避免這種情況。

  • 您遇到了伺服器在執行查詢時當機的錯誤。

您可以執行 mysqladmin version 並檢查伺服器的執行時間,來檢查 MySQL 伺服器是否當機並重新啟動。 如果用戶端連線中斷是因為 mysqld 當機並重新啟動,您應該專注於尋找當機的原因。 首先,檢查再次發出查詢是否會再次造成伺服器當機。 請參閱 第 B.3.3.3 節,「如果 MySQL 持續崩潰該怎麼辦」

您可以透過啟動 mysqld 並將 log_error_verbosity 系統變數設定為 3,來取得有關連線中斷的更多資訊。 這會在 hostname.err 檔案中記錄一些斷線訊息。 請參閱 第 7.4.2 節,「錯誤日誌」

如果您想針對此問題建立錯誤報告,請務必包含以下資訊

另請參閱章節 B.3.2.9, “通訊錯誤和中止的連線”,以及章節 1.6, “如何回報錯誤或問題”