首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL ERROR 2013 (HY000) 連接中斷根因與解決方案

     編輯:MySQL 資料庫相關知識

錯誤現象

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104/111
ERROR 2013 (HY000): Lost connection to MySQL server during query

特徵:

  • Shell 直接 mysql 連接正常,查詢正常。
  • 執行 STOP SLAVE; 隨機中斷。
  • 腳本文件批量執行 必現 中斷。
  • 排查邏輯

    1. 防火牆/安全組:已放行 3306,且交互式正常,排除。
    2. 網絡抖動:同機房低延遲,排除。
    3. MySQL 配置:max_allowed_packet、wait_timeout、net_read_timeout 均正常。
    4. DNS 反向解析:關鍵突破口。

    根因:skip-name-resolve 缺失

    MySQL 預設啟用 基於主機名的權限驗證:

    1. 客戶端連接 → Server 獲取客戶端 IP。
    2. Server 執行 反向 DNS 查詢 (PTR 記錄) 解析 IP → 主機名。
    3. 拿解析出的主機名去 mysql.user 表匹配 Host 列。
    4. DNS 解析超時/失敗 → 連接阻塞/中斷 → ERROR 2013。

    交互式客戶端可能緩存了 DNS 結果,腳本批量執行並發觸發 DNS 超時,導致必現。

    解決方案

    方案一:禁用 DNS 反向解析 (推薦,即時生效)

    [mysqld]
    skip-name-resolve
    

    效果:權限匹配直接用 IP,跳過 DNS,連接建立延遲從秒級降至毫秒級。

    副作用:mysql.user 表 Host 列不能再用主機名 (如 'user'@'app-server'),必須改為 IP 或 %。

    方案二:修復 DNS 基礎設施 (治本)

    • 確保內網 DNS 服務器正常,PTR 記錄完整。
    • /etc/hosts 映射常用客戶端 IP。
    • resolv.conf 選項 options timeout:1 attempts:1 降低超時重試。

    方案三:調大網絡超時參數 (緩解)

    [mysqld]
    net_read_timeout = 60
    net_write_timeout = 60
    connect_timeout = 10
    

    僅緩解症狀,不解決 DNS 根因。

    驗證步驟

    # 1. 測試反向解析
    dig -x  @
    
    # 2. MySQL 內部狀態
    SHOW GLOBAL STATUS LIKE 'Aborted_connects';  -- 異常增長即為 DNS/網絡問題
    
    # 3. 慢查詢日誌無記錄,錯誤日誌出現 "Host name could not be resolved"
    

    總結

    ERROR 2013 高發於「交互式正常、腳本必現」場景,90% 為 DNS 反向解析超時。生產環境**強制開啟 skip-name-resolve**,同時清理 mysql.user 主機名賬號,是最高性價比的永久治愈方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved