在使用 MySQL 時,經常會遇到 Lost connection to MySQL server during query(錯誤代碼 2013)的問題。這通常發生在查詢大量數據、修改大表或網路延遲較高的情況下。以下整理了從代碼層、配置層、表維護等多個維度的解決思路,幫助你快速定位並修復問題。
在 PHP 等應用程式的資料庫連接邏輯中,加入錯誤碼判斷與重連邏輯,可有效緩解斷線導致的業務中斷。
if (in_array(mysql_errno(), [2006, 2013])) {
mysql_close();
mysql_connect(...); // 重新建立連接
mysql_query(...); // 重試查詢
}
核心邏輯:捕捉 2006(MySQL server has gone away)與 2013 錯誤,主動關閉舊連接並重新連線後重試 SQL。
編輯配置文件(Linux 為 my.cnf,Windows 為 my.ini),在 [mysqld] 區段調整關鍵參數:
wait_timeout = 600:將非互動式連接的超時時間延長至 600 秒(預設 28800 秒),減少長連接被斷開的機率。max_allowed_packet = 500M:大幅提升單次數據包的最大允許大小(預設僅 16M),解決大字段寫入或大結果集傳輸導致的 Got a packet bigger than 'max_allowed_packet' bytes 錯誤。修改後需重啟 MySQL 服務生效。Windows 系統下配置文件常見路徑:D:\MySQL_Data\MySQL Server 5.5\my.ini 或安裝目錄下的 my-huge.ini。
登入 MySQL 後執行以下命令即時生效,適合臨時應急:
SET GLOBAL wait_timeout = 60000; SET GLOBAL max_allowed_packet = 1073741824; -- 1GB,按需調整
可先用 SHOW VARIABLES LIKE '%timeout%'; 及 SHOW VARIABLES LIKE 'max_allowed_packet'; 確認當前值。
若僅特定表出現 2013 錯誤,多半是表損壞導致。執行修復命令:
REPAIR TABLE `your_table_name`;
或使用 myisamchk -r(MyISAM 引擎)離線修復,通常能徹底解決該表引發的連接中斷。
錯誤訊息 Lost connection to MySQL server at 'reading initial communication packet' 並伴隨 system error 104/111,常為 DNS 反向解析超時。解決方法:
[mysqld] 添加 skip-name-resolve,禁止 MySQL 對客戶端 IP 做主機名解析(需重啟)。hosts 文件添加 IP 與主機名映射(如 127.0.0.1 localhost),無需重啟服務。若 MySQL 服務啟動直接報 1067,常見原因及對策:
mysqladmin -u root -p shutdown 正常關閉後再 net start mysql。basedir/datadir 路徑錯誤:確保 my.ini 中路徑指向實際安裝目錄與數據目錄,且使用正斜線 /。SYSTEM 用戶完全控制權限。%WINDIR%\my.ini 及 C:\my.cnf 等多餘配置文件。