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

MySQL 遠端連線錯誤「Lost connection during query」根因分析與解決:glibc gethostbyaddr 緩衝區溢位

     編輯:MySQL 資料庫相關知識

錯誤現象

mysql -h mysql.test.com -u beginner -p
ERROR 2013: Lost connection to MySQL server during query

甚至 mysql -h mysql.test.com 即報錯,**尚未進入密碼驗證階段**即中斷連線。

根本原因

glibc 特定版本的 gethostbyaddr (內部 _nss_dns_gethostbyaddr_r) 存在緩衝區溢位 Bug。

觸發鏈路

  1. 客戶端發起 TCP 連線。
  2. MySQL 伺服器 mysqld 接受連線,呼叫 ip_to_hostname() 解析客戶端 IP 對應主機名 (用於權限表 Host 欄位匹配)。
  3. ip_to_hostname() → gethostbyaddr() → _nss_dns_gethostbyaddr_r()。
  4. 處理大量 DNS 回應資料時緩衝區溢位,導致 **Segmentation Fault**,mysqld 子進程崩潰。
  5. 客戶端收到連線重置,顯示 "Lost connection during query"。

受影響環境

  • RedHat 8.0 等搭配特定 glibc 版本 (如 glibc 2.2.x 早期版本) 的系統。
  • MySQL 版本不限,屬系統庫問題。

解決方案

根治:升級 glibc

# RedHat 系統
rpm -Uvh glibc-2.3.x-xx.i386.rpm glibc-common-... glibc-devel-...
# 或使用 up2date / yum 更新

升級後重啟 MySQL 服務即可恢復正常。

臨時規避 (不升級 glibc)

  1. 授權表使用 IP 而非主機名: GRANT ... TO 'user'@'192.168.1.%',避免反向 DNS 解析。
  2. 啟動 mysqld 加入 --skip-name-resolve: 完全跳過主機名解析,**所有授權必須用 IP 或 localhost**。
  3. /etc/hosts 預設解析: 將常用客戶端 IP 對應主機名寫入 /etc/hosts,減少 DNS 查詢。

驗證修復

mysql -h mysql.test.com -u beginner -p
Enter password: ********
Welcome to the MySQL monitor...

補充說明

此問題為經典案例:**資料庫服務異常中斷不一定是資料庫本身的 Bug,底層系統庫 (glibc)、核心參數、檔案系統、網路子系統皆可能為禍首**。排查時應關注錯誤日誌、系統日誌 (/var/log/messages)、strace 輸出。

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