經典報錯 Host 'XXX' is not allowed to connect to this MySQL server 核心原因只有兩類:賬號無遠程授權、網絡層阻斷。本文提供標準化排查清單與修復腳本。
| 層面 | 檢查項 | 驗證命令 |
|---|---|---|
| 網絡層 | 防火牆/安全組放行 3306 | telnet ip 3306 / nc -zv ip 3306 |
| 網絡層 | MySQL 監聽非 127.0.0.1 | netstat -ltnp | grep 3306 / ss -ltnp |
| 權限層 | 用戶 Host 匹配來源 IP | SELECT user, host FROM mysql.user; |
| 權限層 | 密碼插件兼容性 | SELECT plugin FROM mysql.user WHERE user='xxx'; |
# Windows
mysql -u root -p123456
# Linux
/usr/local/mysql/bin/mysql -u root -p
-- 指定單一 IP(最安全)
GRANT ALL PRIVILEGES ON db_name.* TO 'app_user'@'192.168.1.100' IDENTIFIED BY 'strong_pass' WITH GRANT OPTION;
-- 指定網段
GRANT ALL PRIVILEGES ON db_name.* TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_pass';
-- 允許任意 IP(僅測試環境)
GRANT ALL PRIVILEGES ON db_name.* TO 'app_user'@'%' IDENTIFIED BY 'strong_pass';
FLUSH PRIVILEGES;
參數解析:
ALL PRIVILEGES → 可改為 SELECT,INSERT,UPDATE,DELETE,CREATE,DROP 等最小集db_name.* → *.* 全庫、db.tbl 單表@'ip' → 精確匹配客戶端來源 IP(含 NAT 後的公網/內網 IP)WITH GRANT OPTION → 允許該用戶再授權他人,業務賬號**不建議**開啟
# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
bind-address = 0.0.0.0 # 監聽所有網卡;或具體內網 IP 如 192.168.1.101
# skip-name-resolve # 建議開啟,避免 DNS 反解延遲
systemctl restart mysqld
# 或 service mysql restart
# CentOS 7 firewalld
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# Ubuntu ufw
ufw allow from 192.168.1.0/24 to any port 3306
# iptables
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
8.0 默認 caching_sha2_password,舊版驅動/客戶端(Navicat 12-、舊 JDBC、PHP mysqlnd 舊版)不支援。
-- 方案 1:改用 mysql_native_password
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'strong_pass';
FLUSH PRIVILEGES;
-- 方案 2:升級客戶端/驅動至支援 caching_sha2_password 版本
# 客戶端測試
mysql -u app_user -p -h 192.168.1.101 -P 3306
# 成功進入 mysql> 提示符即通