MySQL 權限 = 用戶名 + 主機名 + 密碼插件 三元組。
'user'@'host' 中 host 支持:
- 具體 IP:192.168.1.100
- 域名:app.example.com(需 DNS 反解一致)
- 通配符:%(任意主機)、192.168.1.%(網段)
- localhost ≠ 127.0.0.1(前者走 Unix Socket,後者走 TCP)
-- 1. 創建用戶(5.7+ 推薦分離創建與授權)
CREATE USER 'demo'@'%' IDENTIFIED BY 'StrongPwd123!';
-- 2. 授權:僅 shandong 庫、所有表、所有權限、可轉授
GRANT ALL PRIVILEGES ON `shandong`.* TO 'demo'@'%' WITH GRANT OPTION;
-- 3. 生效
FLUSH PRIVILEGES;
關鍵點:
- WITH GRANT OPTION 允許該用戶再授權給他人,生產環境慎用。
- FLUSH PRIVILEGES 在 GRANT 後通常自動執行,但手工操作 mysql.user 表時必須顯式調用。
ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect to this MySQL server
'root'@'localhost' 存在,但無 'root'@'%' 或 'root'@'x.x.x.x'。
mysql -u root -pSELECT Host, User FROM mysql.user WHERE User='root';% 但仍報錯 → FLUSH PRIVILEGES; 刷新緩存。% → 新增授權:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'StrongPwd123!' WITH GRANT OPTION;
FLUSH PRIVILEGES;
UPDATE user SET Host='%' WHERE User='root'; 易觸發 Duplicate entry '%-root' for key 'PRIMARY'(主鍵衝突),不推薦直接 UPDATE。| 操作 | 問題 | 正確做法 |
|---|---|---|
GRANT ... TO 'user'@'%' | 開放全網訪問,極高風險 | 限定具體 IP/網段:'user'@'192.168.1.%' |
IDENTIFIED BY 'pwd' 在 GRANT 中 | 5.7+ 棄用,語法警告 | 先 CREATE USER ... IDENTIFIED BY ... 再 GRANT |
| 密碼插件不匹配 | 8.0 默認 caching_sha2_password,老客戶端不支持 | ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; |
| skip-name-resolve 開啟 | 授權 host 必須是 IP,不能用域名 | 授權時直接填 IP 或 % |
-- 服務端
SHOW GRANTS FOR 'demo'@'%';
SELECT Host, User, plugin FROM mysql.user WHERE User='demo';
-- 客戶端遠程測試
mysql -h -u demo -pStrongPwd123! -P 3306 -e "SELECT CURRENT_USER();"
root 遠程:RENAME USER 'root'@'%' TO 'root'@'localhost';GRANT SELECT, INSERT, UPDATE ON `app_db`.* TO 'app'@'10.0.1.%';GRANT ... REQUIRE SSL;SELECT * FROM mysql.user WHERE Host='%'; 掃描過度授權賬號。