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

Windows Server MySQL "Can't connect to MySQL server on localhost (10048)" 徹底解決方案

     編輯:MySQL 資料庫相關知識

錯誤本質:TCP 端口耗盡

10048 = WSAEADDRINUSE (Address already in use)。Windows 應用程序快速建立/釋放大量短連接,導致大量連接進入 TIME_WAIT 狀態 (預設 240 秒),佔用所有可用臨時端口 (預設 1024-5000),新連接無端口可用。

核心註冊表調優 (需重啟 OS 生效)

路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

值名稱類型推薦值 (十進制)說明
TcpTimedWaitDelayREG_DWORD30TIME_WAIT 等待秒數,預設 240 (0xF0)。降至 30 秒加速端口回收。最小 30,不可更低 (RFC 1122)。
MaxUserPortREG_DWORD65534最大用戶端口範圍上限。預設 5000。擴至 65534 (最大) 大幅增加可用端口池。最小 32768。

操作步驟

  1. 打開 regedit。
  2. 定位上述路徑,若無兩個值則右鍵新建 DWORD (32-bit) Value。
  3. 修改數值 (選十進制) 為推薦值。
  4. 重啟 Windows Server 使內核網絡棧生效。

應用層優化 (同等重要)

  1. 連接池複用:嚴禁每請求新建連接。Java (HikariCP/Druid)、Go (sql.DB)、Python (SQLAlchemy pool)、PHP (持久連接/pconnect) 必須配置合理連接池。
  2. 啟用 TCP Keepalive:防止中間設備靜默斷開導致連接泄漏。JDBC: tcpKeepAlive=true;Go: SetConnMaxLifetime。
  3. 避免短連接風暴:批量操作合併事務、異步寫入、引入中間件 (ProxySQL/MaxScale) 連接多路複用。
  4. 調整 MySQL 端:
    [mysqld]
    max_connections = 2000          # 擴大上限
    wait_timeout = 60               # 縮短空閒斷開
    interactive_timeout = 60
    net_read_timeout = 30
    net_write_timeout = 30
    

驗證指標

# PowerShell / CMD
netstat -an | find /c "TIME_WAIT"   # 應大幅下降
netstat -an | find /c "ESTABLISHED" # 正常業務連接數

避坑提醒

  • 不要將 TcpTimedWaitDelay 設為 0:違反 TCP 協議,導致舊連接殘留數據干擾新連接,極難排查。
  • MaxUserPort 過大 (如 65535) 可能導致系統不穩定:保留 1 個端口給系統,設 65534 即可。
  • 註冊表修改必須重啟 OS:服務重啟無效,必須重啟內核網絡棧。
  • 雲服務器 (阿里云/騰訊云/AWS) 安全組/防火牆也可能攔截:確保 3306 入站規則放行,且無連接數限制規則。

總結

「10048」是**高併發短連接場景下 Windows TCP/IP 栈默認參數不足**的典型表現。**OS 級調優 (註冊表) + 應用層連接池複用** 雙管齊下,才能徹底根治。長期建議:核心業務遷移至 Linux 環境,內核參數調優更靈活、生態更成熟。

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