高並發場景下,應用頻繁報 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 執行階段。
connect_timeout(默認 5 秒):高負載下線程創建、SSL 握手、認證插件計算延遲gethostbyaddr,DNS 故障/慢導致阻塞max_allowed_packet:雖多見於查詢階段,但超大認證包(如超長密碼、插件數據)也可能觸發-- 運行時動態調整(重啟失效)
SET GLOBAL connect_timeout = 60;
-- 配置文件持久化
# /etc/my.cnf
[mysqld]
connect_timeout = 60
監控指標:SHOW GLOBAL STATUS LIKE 'Aborted_connects'; 持續快速增長說明握手階段大量中斷,需調大。
# /etc/my.cnf
[mysqld]
skip-name-resolve
gethostbyaddr,連接建立直接用 IP,極大降低延遲Host 列只能用 IP/通配符,不能用主機名net.core.somaxconn、tcp_max_syn_backlog 內核參數# /etc/my.cnf
[mysqld]
net_read_timeout = 60
net_write_timeout = 60
適用於查詢階段大結果集傳輸慢導致斷開,握手階段較少見。
# /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
Aborted_connects 增長趨勢平緩reading authorization packetsysbench --threads=500 --time=300),確認無握手失敗Threads_connected、Connection_errors_* 系列指標systemctl status mysqldss -lntp | grep 3306skip-name-resolve 是否開啟?connect_timeout 是否 ≥ 30?connectionTimeout、idleTimeout、maxPoolSize 合理?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 |