本節也涵蓋相關的 查詢期間連線至伺服器中斷
錯誤。
發生 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 節,「封包過大」。插入大量資料列的
INSERT
或REPLACE
語法也可能導致這類錯誤。 這兩個語法都會傳送單一請求至伺服器,而不論要插入的資料列數為何;因此,您通常可以透過減少每個INSERT
或REPLACE
所傳送的資料列數,來避免此錯誤。如果主機名稱查閱失敗(例如,您的伺服器或網路所依賴的 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 節,「錯誤日誌」。
如果您想針對此問題建立錯誤報告,請務必包含以下資訊
請指出 MySQL 伺服器是否當機。您可以在伺服器錯誤日誌中找到相關資訊。請參閱章節 B.3.3.3, “如果 MySQL 持續當機該怎麼辦”。
如果特定的查詢導致 mysqld 終止,且相關表格在執行查詢前已使用
CHECK TABLE
檢查過,您是否可以提供可重現的測試案例?請參閱章節 7.9, “偵錯 MySQL”。MySQL 伺服器中
wait_timeout
系統變數的值是多少?(mysqladmin variables 會顯示此變數的值。)您是否嘗試啟用一般查詢日誌來執行 mysqld,以判斷問題查詢是否出現在日誌中?(請參閱章節 7.4.3, “一般查詢日誌”。)