某計費系統服務器突然負載飆升,CPU 被 mysqld 進程佔滿,僅 50 並發呼叫卻出現大量僵屍進程,AGI 程序響應極慢。重啟服務器無效。登入 MySQL 執行 SHOW PROCESSLIST 發現異常進程:
+----+-----------------------+-----------+------+---------+------+-----------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------------+-----------+------+---------+------+-----------------------+------------------+
| 123| unauthenticated user | localhost | NULL | Connect | 15 | reading from net | NULL |
+----+-----------------------+-----------+------+---------+------+-----------------------+------------------+
關鍵特徵:User="unauthenticated user"、Command="Connect"、State="reading from net"、Host="localhost"。
reading from net 狀態,用戶顯示為 unauthenticated userMySQL 判斷客戶端主機名的邏輯:
mysql.user 表的 Host 列即使是 127.0.0.1,若 /etc/hosts 無 localhost 記錄或 DNS 服務異常,同樣會觸發解析超時。
修改 /etc/my.cnf(Windows 為 my.ini),[mysqld] 區塊添加:
[mysqld]
skip-name-resolve
重啟 MySQL:systemctl restart mysqld
| 影響 | 說明 | 應對措施 |
|---|---|---|
| 授權表 Host 列 | 不能再使用主機名(如 'user'@'localhost') | 統一改用 IP:'user'@'127.0.0.1'、'user'@'192.168.1.%' |
| 現有賬號失效 | 原 localhost 賬號無法登入 | 執行 RENAME USER 'user'@'localhost' TO 'user'@'127.0.0.1'; 或重新授權 |
| 複製/集群配置 | CHANGE MASTER TO MASTER_HOST='master-host' 需用 IP | 全鏈路統一使用 IP 地址 |
127.0.0.1 localhost、::1 localhost、服務器真實 IP 對應主機名dig -x 127.0.0.1、nslookup localhost 應秒級返回timeout:1 attempts:1FLUSH HOSTS; 清理緩存的解析失敗記錄[mysqld]
connect_timeout=10 # 默認 10 秒,TCP 握手後等待認證包超時
wait_timeout=30 # 非交互式連接空閒斷開
interactive_timeout=300 # 交互式連接空閒斷開
可減少阻塞線程堆積,但無法解決根因。
-- 確認參數生效
SHOW VARIABLES LIKE 'skip_name_resolve';
-- 監視連接狀態
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Aborted_connects';
-- 定期清理緩存
FLUSH HOSTS;
::1 解析失敗同樣導致阻塞,/etc/hosts 必須雙棧配置skip-name-resolveAborted_connects 突增 + unauthenticated user 出現 = DNS 解析故障特徵unauthenticated user 並非入侵攻擊,而是 MySQL 反向 DNS 解析阻塞 的標誌性癥狀。生產環境強烈建議啟用 skip-name-resolve,以 IP 方式管理授權,徹底規避 DNS 不穩帶來的可用性風險。若業務強依賴主機名授權,則必須構建高可用、低延遲的內部 DNS 基礎設施,並配置完善的 /etc/hosts 兜底。