MySQL 預設僅允許本地連線,當應用與數據庫分離部署時,必須開啟遠程訪問。本文詳細對比「改表法」與「授權法」的操作步驟、優缺點、適用場景,並提供生產環境安全加固建議,助你快速落地。
MySQL 安裝後,mysql.user 表中 root 用戶的 Host 字段通常為 localhost 或 127.0.0.1,導致外部 IP 連線報錯:
ERROR 1130 (HY000): Host '192.168.x.x' is not allowed to connect to this MySQL server
解決思路:修改用戶的 Host 為 %(任意 IP)或具體 IP/網段。
-- 1. 登入本地 MySQL mysql -u root -p -- 2. 切換到 mysql 系統庫 USE mysql; -- 3. 將 root 的 Host 改為 %(允許任意 IP) UPDATE user SET Host = '%' WHERE User = 'root'; -- 4. 驗證修改結果 SELECT Host, User FROM user; -- 5. 刷新權限生效 FLUSH PRIVILEGES;
缺點:無法同時設置密碼、SSL、資源限制;MySQL 8.0+ authentication_string 加密方式變更,直接 UPDATE 易導致密碼失效。
-- 1. 本地登入 mysql -h localhost -u root -p -- 2. 授權 root 從任意 IP 訪問(僅測試環境) GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'StrongP@ssw0rd' WITH GRANT OPTION; -- 3. 或授權業務用戶從任意 IP 訪問 GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'StrongP@ssw0rd' WITH GRANT OPTION; -- 4. 或限制特定 IP 訪問特定庫(生產推薦) GRANT ALL PRIVILEGES ON dk.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'StrongP@ssw0rd' WITH GRANT OPTION; -- 5. 必須刷新權限 FLUSH PRIVILEGES; -- 6. 退出 EXIT;
| 對比項 | 改表法 | 授權法 |
|---|---|---|
| MySQL 版本兼容性 | 5.7 及以下較安全;8.0+ 高風險 | 全版本完美支持 |
| 密碼同步修改 | 需額外 UPDATE authentication_string | 語句中 IDENTIFIED BY 一體化 |
| 權限粒度控制 | 僅能改 Host,無法細化到庫/表/欄位 | 支持 *.*, db.*, db.tbl, tbl(col) 任意粒度 |
| 資源限制 | 不支持 | 支持 MAX_QUERIES_PER_HOUR 等 |
| SSL/認證插件 | 極難配置 | 原生支持 REQUIRE SSL、auth_plugin |
| 操作原子性 | 無事務保護,半途失敗導致不一致 | DDL 級原子操作 |
REVOKE ALL ON *.* FROM 'root'@'%'; 僅保留 root@'localhost'。SELECT, INSERT, UPDATE, DELETE,禁止 DROP, ALTER, GRANT OPTION。%,結合雲廠商安全組/防火牆雙層防護。validate_password 插件,配合 PASSWORD EXPIRE。GRANT ... REQUIRE SSL,防止內網明文傳輸被竊聽。audit_log 或 MariaDB Audit Plugin 記錄所有登入與敏感操作。# 客戶機測試 mysql -h-u myuser -p -P 3306 # 或使用 telnet 測試端口通達性 telnet 3306
開啟 MySQL 遠程訪問,**強烈建議使用標準 GRANT 授權法**,摒棄直接操作 mysql.user 表的「改表法」。授權時遵循「最小權限、精確 IP、強密碼、SSL 加密、審計日誌」五大原則,並在網絡層(安全組/防火牆)同步放行對應 IP 段的 3306 端口,方能構建安全可用的遠程訪問通道。