MySQL 默認僅允許本地連接(root@localhost),遠程連接需顯式授權。本文給出標準授權流程、通配符主機用法、防火牆配置、驗證步驟,並說明 db 表庫級權限的補充管理。
mysql -h127.0.0.1 -uroot -p
USE mysql;
SELECT Host, User FROM user;
-- 輸出示例:
-- +-----------+------+
-- | Host | User |
-- +-----------+------+
-- | localhost | root |
-- +-----------+------+
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'StrongPass123!' WITH GRANT OPTION;
FLUSH PRIVILEGES;
參數解讀:
*.*:所有庫所有表'root'@'%':用戶 root,允許任意 IP 連接IDENTIFIED BY:設置/更新密碼(MySQL 5.7+ 建議改用 ALTER USER)WITH GRANT OPTION:允許該用戶再授權(謹慎給予)SELECT Host, User FROM user;
-- 應新增一行:% | root
-- 遠程機器測試
mysql -h -uroot -p'StrongPass123!' -e "SELECT VERSION();"
-- 1. 創建專用遠程用戶(不用 root)
CREATE USER 'app_remote'@'10.0.0.%' IDENTIFIED BY 'AppPass123!';
-- 2. 僅授業務庫必要權限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `biz_db`.* TO 'app_remote'@'10.0.0.%';
-- 3. 不授 GRANT OPTION、DROP、ALTER、CREATE、FILE、SHUTDOWN、PROCESS、SUPER
FLUSH PRIVILEGES;
若需同一用戶對不同庫不同權限,可直接操作 mysql.db 表或多次 GRANT ON db.*。GRANT 會自動維護 db、tables_priv、columns_priv。
# Linux iptables
iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT
# 阿里云/AWS 安全組:入站規則 3306/TCP 來源 10.0.0.0/24
# MySQL 配置綁定地址(/etc/my.cnf)
[mysqld]
bind-address = 0.0.0.0 # 監聽所有網卡,或具體內網 IP
| 現象 | 原因 | 對策 |
|---|---|---|
Access denied for user 'root'@'192.168.1.5' | 用戶主機不匹配(無 root@% 或 root@192.168.1.%) | 補授權或改用戶主機 |
連接超時 Can't connect to MySQL server | 防火牆阻攔 / bind-address=127.0.0.1 / 安全組未放行 | 檢查網絡層、my.cnf、雲廠商安全組 |
Authentication plugin 'caching_sha2_password' not supported | 客戶端驅動過舊 | 升級驅動或 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; |
| 授權後不生效 | 未執行 FLUSH PRIVILEGES(手工改表時) | GRANT 自動刷新,手工改表需執行 |
「最小權限、專用賬號、網絡層放行、驗證生效」四步走,安全開啟 MySQL 遠程訪問。