MySQL 遠程訪問授權三種方式:GRANT、UPDATE host、CREATE USER 完整指南
MySQL 預設僅允許本地連線,遠程訪問需顯式授權。本文整理三種主流授權方式,適用不同版本與場景。
核心概念:用戶@主機 模型
'user'@'%':任意 IP 遠程連線
'user'@'192.168.1.%':特定網段
'user'@'localhost':本機 Unix Socket
'user'@'127.0.0.1':本機 TCP
⚠️ %' 不包含 localhost,需單獨授權。
方式一:GRANT 隱式建用戶 + 授權(5.7 及舊版通用)
-- 登入 root
mysql -u root -p
-- 授權所有庫所有表,任意遠程 IP
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' IDENTIFIED BY 'StrongPass123!';
-- 僅授權特定庫
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
-- 僅授權特定 IP
GRANT SELECT, INSERT, UPDATE ON app_db.* TO 'app_user'@'192.168.1.100' IDENTIFIED BY 'StrongPass123!';
-- 刷新權限生效
FLUSH PRIVILEGES;
方式二:CREATE USER + GRANT(8.0 標準,推薦)
-- 1. 建立用戶(支援密碼策略、過期、鎖定等)
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPass123!'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 2;
-- 2. 授權
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 或精細授權
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'remote_user'@'%';
-- 3. 刷新
FLUSH PRIVILEGES;
方式三:直接修改 mysql.user 表 host 欄位(不推薦,僅緊急修復)
USE mysql;
-- 查看現狀
SELECT Host, User FROM user WHERE User='app_user';
-- 修改 host 從 localhost 改為 %(允許遠程)
UPDATE user SET Host='%' WHERE User='app_user' AND Host='localhost';
FLUSH PRIVILEGES;
⚠️ 直接操作系統表風險高:可能破壞權限一致性、跳過密碼驗證邏輯、升級不兼容。僅在無法正常登入時緊急使用,事後必須用標準 GRANT 重建。
網路層配置(必檢項)
| 層級 | 檢查項 | 命令/配置 |
| MySQL 配置 | bind-address | bind-address=0.0.0.0 (my.cnf) 或註釋掉預設 127.0.0.1 |
| MySQL 配置 | skip-networking | 必須關閉(註釋或設 0) |
| 防火牆 | 3306 埠開放 | firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload |
| 雲廠商 | 安全組/防火牆 | 入站規則開放 3306,來源限制業務 IP 段 |
| SELinux | MySQL 網路連線 | setsebool -P mysql_connect_any 1 |
驗證遠程連線
# 客戶端測試
mysql -h 192.168.1.50 -u remote_user -p
# 檢查連線來源
SHOW PROCESSLIST;
-- Host 欄顯示 client_ip:port
常見問題排查
| 錯誤 | 原因 | 解決 |
| Host 'x.x.x.x' is not allowed to connect | 用戶無 % 或對應 IP 授權 | GRANT ... TO 'user'@'%' / 'user'@'x.x.x.x' |
| Access denied for user 'user'@'localhost' | 匿名用戶 ''@'localhost' 攔截 | DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES; |
| Connection refused / timeout | bind-address / 防火牆 / 安全組 | 檢查 my.cnf bind-address=0.0.0.0、開放 3306 |
| SSL connection required | 8.0 預設要求 SSL | JDBC URL 加 useSSL=false 或配置憑證 |
安全基線建議
- 禁止 root 遠程:
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
- 最小權限原則:應用帳號僅授權所需庫/表/操作
- 強密碼策略:安裝
validate_password 元件
- IP 白名單:
'user'@'192.168.1.%' 而非 '%'
- 定期審計:
SELECT Host, User FROM mysql.user WHERE Host='%';
遠程授權鐵律:網路通 → bind-address 開 → 用戶@% 授權 → 防火牆放行 → 強密碼 → 最小權限 → 定期審計。任一環節缺失皆導致連線失敗或安全風險。