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

MySQL「Lost connection at reading authorization packet」錯誤排查全指南:connect_timeout、skip-name-resolve、網絡與大包配置

     編輯:MySQL 綜合教學

MySQL「Lost connection at reading authorization packet」錯誤排查全指南:connect_timeout、skip-name-resolve、網絡與大包配置

高並發場景下,應用頻繁報 Lost connection to MySQL server at 'reading authorization packet', system error: 0。本文系統分析根因,給出 5 級配置優化方案,從連接超時、DNS 解析、網絡帶寬、讀超時、大包限制層層遞進,並提供監控指標與驗證方法。

錯誤現象

Lost connection to MySQL server at 'reading authorization packet', system error: 0

客戶端在握手階段斷開,尚未進入 SQL 執行階段。

根因分析

  1. 連接建立耗時超過 connect_timeout(默認 5 秒):高負載下線程創建、SSL 握手、認證插件計算延遲
  2. DNS 反向解析卡頓:MySQL 默認對客戶端 IP 做 gethostbyaddr,DNS 故障/慢導致阻塞
  3. 網絡抖動/帶寬飽和:握手包丟失重傳超時
  4. 客戶端發送大包超過 max_allowed_packet:雖多見於查詢階段,但超大認證包(如超長密碼、插件數據)也可能觸發

5 級優化方案(按推薦順序)

Level 1:調大 connect_timeout(立竿見影)

-- 運行時動態調整(重啟失效)
SET GLOBAL connect_timeout = 60;

-- 配置文件持久化
# /etc/my.cnf
[mysqld]
connect_timeout = 60

監控指標:SHOW GLOBAL STATUS LIKE 'Aborted_connects'; 持續快速增長說明握手階段大量中斷,需調大。

Level 2:禁用 DNS 反解析(強烈建議)

# /etc/my.cnf
[mysqld]
skip-name-resolve
  • 效果:跳過 gethostbyaddr,連接建立直接用 IP,極大降低延遲
  • 副作用:權限表 Host 列只能用 IP/通配符,不能用主機名
  • 生產環境必開

Level 3:網絡層保障

  • 服務器間千兆/萬兆內網,禁用交換機流控
  • 檢查 net.core.somaxconn、tcp_max_syn_backlog 內核參數
  • 雲環境:同 VPC、同可用區、啟用增強網絡

Level 4:調大 net_read_timeout / net_write_timeout

# /etc/my.cnf
[mysqld]
net_read_timeout = 60
net_write_timeout = 60

適用於查詢階段大結果集傳輸慢導致斷開,握手階段較少見。

Level 5:調大 max_allowed_packet

# /etc/my.cnf
[mysqld]
max_allowed_packet = 256M

-- 客戶端也需同步設置
# mysql client
[client]
max_allowed_packet = 256M

防止超大 SQL/結果集/認證包被截斷。

完整配置模板

# /etc/my.cnf
[mysqld]
# 連接層
connect_timeout = 60
skip-name-resolve
max_connections = 5000
thread_cache_size = 100

# 網絡層
net_read_timeout = 60
net_write_timeout = 60
max_allowed_packet = 256M

# 緩衝區
net_buffer_length = 16K

驗證與監控

  1. 重啟後觀察 Aborted_connects 增長趨勢平緩
  2. 應用端錯誤日志無新增 reading authorization packet
  3. 壓測模擬高並發連接(sysbench --threads=500 --time=300),確認無握手失敗
  4. 監控 Threads_connected、Connection_errors_* 系列指標

排查清單(由簡入繁)

  1. [ ] MySQL 服務是否運行?systemctl status mysqld
  2. [ ] 端口 3306 是否監聽?ss -lntp | grep 3306
  3. [ ] 防火牆/安全組是否放行?
  4. [ ] skip-name-resolve 是否開啟?
  5. [ ] connect_timeout 是否 ≥ 30?
  6. [ ] 應用連接池配置:connectionTimeout、idleTimeout、maxPoolSize 合理?
  7. [ ] 抓包 tcpdump -i eth0 port 3306 -w mysql.pcap 分析握手階段 RST/FIN

相關異常對照

錯誤信息階段主要原因
reading authorization packet握手認證connect_timeout、DNS、網絡
reading initial communication packet握手初始化服務未啟動、防火牆、bind-address
Lost connection during query查詢執行net_read_timeout、大包、KILL、OOM
MySQL server has gone away任意wait_timeout、大包、服務重啟、OOM
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved