首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

解決 MySQL 大量「unauthenticated user」導致假死問題

     編輯:MySQL 綜合教學

解決 MySQL 大量「unauthenticated user」導致假死問題

現象:數據庫極慢、連接數飆升、SHOW PROCESSLIST 顯示大量 unauthenticated user、線程狀態為 Reading from net 或 Connecting。根因:DNS 反向解析超時。

根因分析

  1. 客戶端發起 TCP 連接
  2. MySQL 為了記錄「主機名」,對客戶端 IP 執行 PTR 反向查詢(IP → 主機名)
  3. DNS 服務器響應慢或失敗 → MySQL 線程阻塞等待
  4. 連接堆積,線程池耗盡,新連接無法建立,「假死」

無論客戶端用 IP 還是主機名連接,MySQL 默認都會做反解析(除非跳過)。

一鍵解決:禁用 DNS 反解析

編輯 /etc/my.cnf(Windows 為 my.ini),[mysqld] 區塊添加:

[mysqld]
skip-name-resolve

重啟 MySQL:systemctl restart mysqld 或服務管理器重啟。

副作用與應對

影響說明應對
主機名顯示為 IPSHOW PROCESSLIST、performance_schema 的 HOST 列顯示 IP運維監控按 IP 識別,無業務影響
mysql.user Host 列需用 IP授權語句 user@'host' 的 host 必須填 IP 或 %,不能用主機名規範化授權腳本,統一用 IP/通配符
日誌無主機名錯誤日誌、慢查詢日誌記錄客戶端 IP結合應用層日誌(含主機名)關聯分析

驗證生效

mysql> SHOW VARIABLES LIKE 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+

mysql> SHOW PROCESSLIST;
-- Host 列應顯示 IP 地址,無 unauthenticated user 堆積

進階優化:調大連接緩衝

若並發極高,配合調整:

[mysqld]
skip-name-resolve
max_connections = 2000
back_log = 500
thread_cache_size = 100

排查清單(若問題依舊)

  1. 確認 skip-name-resolve 生效(大小寫無關,建議小寫)
  2. 檢查 /etc/hosts 是否有錯誤映射導致本地解析卡頓
  3. 客戶端驅動版本過舊(如 JDBC 5.x)導致握手協議異常,升級驅動
  4. 應用層連接池配置錯誤(如未關閉連接、泄漏),檢查 HikariCP/Druid 參數
  5. 網絡層:TCP 半連接隊列溢出,調大 somaxconn、tcp_max_syn_backlog

總結

skip-name-resolve 是解決「unauthenticated user 堆積」的銀彈。生產環境 MySQL 強烈建議默認開啟,以 IP 管理權限,避免 DNS 依賴導致的不可用風險。

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