首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 遠程連接授權全攻略:GRANT 最佳實踐、ERROR 1130 解決、通配符主機、WITH GRANT OPTION 陷阱

     編輯:MySQL 資料庫相關知識

核心授權模型

MySQL 權限 = 用戶名 + 主機名 + 密碼插件 三元組。
'user'@'host' 中 host 支持:
- 具體 IP:192.168.1.100
- 域名:app.example.com(需 DNS 反解一致)
- 通配符:%(任意主機)、192.168.1.%(網段)
- localhost ≠ 127.0.0.1(前者走 Unix Socket,後者走 TCP)

方案一:標準 GRANT 流程(推薦)

-- 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 專項修復

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'。

修復步驟

  1. 本地登入:mysql -u root -p
  2. 檢查現有 host:
    SELECT Host, User FROM mysql.user WHERE User='root';
  3. 若已有 % 但仍報錯 → FLUSH PRIVILEGES; 刷新緩存。
  4. 若無 % → 新增授權:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'StrongPwd123!' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  5. 注意: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.%';
  • 強制 SSL:GRANT ... REQUIRE SSL;
  • 定期審計:SELECT * FROM mysql.user WHERE Host='%'; 掃描過度授權賬號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved