MySQL 權限系統基於 user 表的 Host、User、plugin、authentication_string 四要素匹配。遠程訪問需:
1. 資料庫監聽非 127.0.0.1(bind-address=0.0.0.0 或註解掉)
2. 防火牆放行 3306
3. 目標帳號存在 Host='%' 或具體 IP 的記錄
4. GRANT 賦予對應權限
mysql -u root -p USE mysql; SELECT User, Host, plugin FROM user;
-- 若無 root@% 則建立 UPDATE user SET Host = '%' WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES;
-- 任意主機 root 完整權限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'strong_password' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 指定 IP 僅讀權限 GRANT SELECT ON mydb.* TO 'readonly'@'192.168.1.100' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
SELECT Host, User FROM user WHERE User IN ('root','readonly');
-- 應看到 root@% 和 readonly@192.168.1.100
| 版本 | 密碼欄位 | 建議語法 |
|---|---|---|
| 5.6 及以下 | Password | IDENTIFIED BY 'pwd' 兼容 |
| 5.7.6+ | authentication_string | ALTER USER ... IDENTIFIED BY 或 CREATE USER ... IDENTIFIED BY 後 GRANT |
| 8.0+ | authentication_string | CREATE USER ... IDENTIFIED WITH caching_sha2_password BY 'pwd' |
validate_password 插件REQUIRE SSLERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect → Host 表無對應記錄ERROR 1045 (28000): Access denied → 密碼錯誤或 plugin 不匹配授權三部曲:改綁定 → 開防火牆 → 授權限,缺一不可。