「無法連接遠程 MySQL」是運維高頻問題。本文系統梳理防火牆、綁定地址、用戶授權、驗證插件四大環節,提供生產環境可落地的配置清單。
bind-address 允許非本地連接firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT service iptables save
阿里云/騰訊云/AWS 控制台 → 安全組入站規則 → 添加 TCP 3306,來源按需設為具體 IP 或 0.0.0.0/0。
編輯 /etc/my.cnf(或 /etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld] # 註釋或修改為 0.0.0.0 監聽所有網卡 # bind-address = 127.0.0.1 bind-address = 0.0.0.0 # 生產環境建議開啟跳過 DNS 反解析,提升連接速度 skip-name-resolve
重啟生效:systemctl restart mysqld
-- 1. 創建用戶(指定主機 % 表示任意 IP,建議限定具體 IP 段) CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'StrongPassw0rd!'; -- 2. 授予特定庫權限(避免 *.*) GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `prod_db`.* TO 'app_user'@'10.0.0.%'; -- 3. 刷新權限 FLUSH PRIVILEGES;
| 需求 | GRANT 語句 |
|---|---|
| 全庫全表所有權限(慎用) | GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'pwd' WITH GRANT OPTION; |
| 特定庫所有權限 | GRANT ALL PRIVILEGES ON `db_name`.* TO 'user'@'%'; |
| 特定表讀寫 | GRANT SELECT, INSERT, UPDATE ON `db`.`orders` TO 'user'@'%'; |
| 僅讀賬號 | GRANT SELECT ON `db`.* TO 'readonly'@'%'; |
user@'host':% 匹配任意主機,192.168.1.% 匹配網段,localhost 僅本地(Unix socket)WITH GRANT OPTION:允許該用戶再授權給他人,極少使用IDENTIFIED BY:5.7 隱式創建用戶,8.0 需先 CREATE USER# 客戶端測試 mysql -h 192.168.1.100 -u app_user -p -P 3306 # 或使用 telnet 測試端口通斷 telnet 192.168.1.100 3306
| 錯誤碼 | 原因 | 解決 |
|---|---|---|
| 1130 Host not allowed | 用戶 host 不匹配 | 檢查 user@'host',需 % 或具體 IP |
| 1045 Access denied | 密碼錯誤/插件不匹配 | 確認密碼、8.0 檢查 caching_sha2_password vs mysql_native_password |
| Can't connect (timeout) | 網絡不通/防火牆/bind-address | telnet 3306、檢查安全組、my.cnf bind-address |
| SSL connection required | 8.0 強制 SSL | 客戶端加 --ssl-mode=DISABLED 或配置憑證 |
8.0 默認 caching_sha2_password,舊驅動(JDBC 5.x、舊 Navicat、PHP mysqlnd)不支持。
-- 方案 1:創建用戶指定舊插件(推薦過渡期) CREATE USER 'legacy_user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; -- 方案 2:修改現有用戶 ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';
user@'10.0.1.%' 代替 %validate_password 插件強制複雜度SELECT user, host FROM mysql.user; 清理僵屍賬號按清單逐項驗證,遠程連接問題迎刃而解。