作為開發或測試人員,配置 MySQL 遠程訪問幾乎是必經之路。網上教程雖多,但實際操作常因細節疏忽導致「配置了還是連不上」。本文總結高頻坑點,給出生產級配置檢查清單。
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass#2024'; GRANT SELECT,INSERT,UPDATE,DELETE ON mydb.* TO 'app_user'@'192.168.1.%'; FLUSH PRIVILEGES;
/etc/my.cnf 或 /etc/mysql/my.cnf):
[mysqld] bind-address = 0.0.0.0 # 監聽所有網卡,或指定內網 IP
# CentOS 7/8 firewalld firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload # Ubuntu ufw ufw allow 3306/tcp
systemctl restart mysqld # 或 mysql
| 現象 | 可能原因 | 排查命令/方案 |
|---|---|---|
| 本地能連,遠程超時 | 防火牆/安全組攔截 | telnet ip 3306;雲廠商控制台放行安全組規則 |
| 報錯 Host 'x.x.x.x' is not allowed | 用戶 host 不匹配 | SELECT user,host FROM mysql.user;授權時 host 必須與客戶端 IP 一致 |
| 報錯 Access denied for user | 密碼錯誤/插件不匹配 | MySQL 8.0 默認 caching_sha2_password,舊驅動需改用 mysql_native_password |
| 連接後秒斷 | skip-name-resolve 缺失導致 DNS 反解慢 | my.cnf 添加 skip-name-resolve 禁用 DNS 解析 |
| SSL 強制報錯 | 客戶端不支援 SSL | 用戶創建時 REQUIRE NONE 或客戶端啟用 SSL 參數 |
| 修改配置不生效 | 未執行 FLUSH PRIVILEGES / 未重啟服務 | 權限修改必須 FLUSH;bind-address 修改必須重啟 mysqld |
GRANT OPTION、FILE、SHUTDOWN 等高危權限。DELETE FROM mysql.user WHERE user='root' AND host!='localhost'; FLUSH PRIVILEGES;require_secure_transport=ON。audit_log 插件記錄所有登錄與 DDL/DML 操作。validate_password 插件強制複雜度與過期策略。#!/bin/bash # check_mysql_remote.sh HOST=$1 USER=$2 PASS=$3 mysql -h"$HOST" -u"$USER" -p"$PASS" -e "SELECT 1;" >/dev/null 2>&1 && echo "✅ 連接成功" || echo "❌ 連接失敗,請按清單排查" # 用法:./check_mysql_remote.sh 192.168.1.100 app_user StrongPass#2024
配置無小事,清單在手,遠程訪問不再愁。