使用 Navicat 等客戶工具連接遠程 MySQL 時,常遇到 Lost connection to MySQL server at 'reading initial communication packet' 或 Can't connect to MySQL server on 'localhost'。本文記錄真實排查過程,從網絡層、配置層、客戶端層三維度給出解決路徑。
systemctl status mysqld 顯示 active)mysql -u root -p 可正常登錄Lost connection ... reading initial communication packet檢查 /etc/hosts.allow 與 /etc/hosts.deny(TCP Wrappers):
vi /etc/hosts.allow
# 添加以下兩行,允許所有IP訪問 mysqld
mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW
結果:錯誤變為 Can't connect to MySQL server on 'localhost',說明網絡層通了,進入 MySQL 協議握手階段失敗。
尋找 my.cnf(或 my.ini),檢查 bind-address:
# 常見位置
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/my.cnf
若配置為 bind-address = 127.0.0.1,MySQL 僅監聽本地回環,拒絕遠程連接。需修改為:
bind-address = 0.0.0.0 # 監聽所有網卡
# 或具體內網IP
bind-address = 192.168.1.100
本案例陷阱:服務器上找不到 my.cnf!
tail -f /var/log/mysqld.log
# 或
journalctl -u mysqld -f
日志關鍵輸出:
151213 17:05:35 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
151213 17:05:35 [Note] - '0.0.0.0' resolves to '0.0.0.0'
151213 17:05:35 [Note] Server socket created on IP: '0.0.0.0'.
關鍵發現:MySQL 實際綁定 0.0.0.0(全網卡),並非 127.0.0.1。配置文件雖無 bind-address,但默認行為即為全監聽。
Navicat 連接設置中,Host 填寫服務器公網/內網 IP,而非 localhost:
192.168.x.x 或公網 IP3306
原理:客戶端填 localhost 會解析為 127.0.0.1,嘗試連接本機 3306,而非遠程服務器。填寫服務器真實 IP,TCP 握手直達 0.0.0.0:3306,連接成功。
| 層級 | 檢查項 | 命令/操作 | 預期結果 |
|---|---|---|---|
| 網絡 | 端口通達性 | telnet server_ip 3306 / nc -zv server_ip 3306 | 連接成功 |
| 網絡 | 防火牆/安全組 | 阿里云/騰訊云控制台放行 3306;iptables -L -n | grep 3306 | 允許入站 |
| 系統 | TCP Wrappers | /etc/hosts.allow 添加 mysqld : ALL : ALLOW | 無拒絕規則 |
| MySQL | 服務狀態 | systemctl status mysqld | active (running) |
| MySQL | 監聽地址 | 錯誤日志確認 bind-address 實際值 | 0.0.0.0 或 具體IP |
| MySQL | 用戶宿主 | SELECT user, host FROM mysql.user; | 存在 user@% 或 user@client_ip |
| MySQL | 權限 | SHOW GRANTS FOR 'user'@'%'; | 具有目標庫權限 |
| 客戶端 | Host填寫 | Navicat/WorkBench Host欄填 服務器IP | 非 localhost/127.0.0.1 |
| 客戶端 | SSL/SSH | 非必要關閉 SSL;SSH隧道配置正確 | 按需啟用 |
user@%) 與防火牆是基礎前提按清單逐項排查,90% 遠程連接問題可在 10 分鐘內解決。