現象:本機能連,遠程報 ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect。本質:MySQL 權限系統以 user@host 為唯一鍵,host 必須精確匹配客戶端來源 IP/主機名。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
| 子句 | 含義 |
|---|---|
ALL PRIVILEGES | 所有權限(除 GRANT OPTION) |
ON *.* | 所有庫所有表 |
TO 'myuser'@'%' | 用戶 myuser,允許任意主機(%)連接 |
IDENTIFIED BY 'mypassword' | 設置密碼 |
WITH GRANT OPTION | 允許該用戶再授權 |
| 授權 host | 允許連接來源 | 典型場景 |
|---|---|---|
localhost | Unix socket / 127.0.0.1 | 本機腳本、本地開發 |
127.0.0.1 | TCP 回環 | 本機應用走 TCP |
192.168.1.100 | 單一 IP | 固定應用服務器 |
192.168.1.% | 網段 | 內網應用集群 |
% | 任意 IP | 測試/多雲環境(生產慎用) |
%.example.com | 域名後綴(需 DNS 反解) | 動態 IP 機器 |
root@localhost 和 root@127.0.0.1,無 root@%。::ffff:192.168.1.1,需額外授權 user@'::1' 或啟用 bind-address=::。mysql.user 表結構變化(authentication_string 替代 password),直接 UPDATE 易導致權限表損壞,務必用 GRANT/CREATE USER/ALTER USER。
# 1. 確認 bind-address 已開放
grep bind-address /etc/my.cnf
netstat -ntlp | grep 3306
# 2. 確認賬號存在且 host 匹配
SELECT user, host, plugin FROM mysql.user WHERE user='myuser';
# 3. 確認權限
SHOW GRANTS FOR 'myuser'@'%';
# 4. 確認防火牆/安全組放行 3306
telnet 3306
# 5. 客戶端測試
mysql -h -u myuser -p'mypassword'
GRANT ... TO 'app'@'10.0.%'。REQUIRE SSL 強制加密傳輸。validate_password 強密碼策略 + 定期輪換。「權限按 host 精確匹配」是 MySQL 安全模型基石,授權時像配置防火牆規則一樣嚴謹,遠程登錄問題自然迎刃而解。