MySQL 遠程訪問需同時滿足:
bind-address 監聽 0.0.0.0 或指定 IP缺一不可。
sudo vim /etc/mysql/my.cnf
# 或 /etc/mysql/mysql.conf.d/mysqld.cnf (Ubuntu 16.04+)
# 找到
bind-address = 127.0.0.1
# 改為
bind-address = 0.0.0.0
# 允許所有介面監聽;或指定具體 IP:bind-address = 192.168.1.100
sudo systemctl restart mysql
# 或舊版
sudo /etc/init.d/mysql restart
mysql -uroot -p
-- 建立允許任意主機(%)連線的用戶
CREATE USER 'app_user'@'%' IDENTIFIED BY 'strong_password';
-- 或修改現有 root(不建議生產用 root 遠程)
-- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
-- 授權特定資料庫
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
# 客戶端機器測試
mysql -uapp_user -p -h -P 3306
# 成功進入提示符即通
sudo ufw allow from 192.168.1.0/24 to any port 3306(限制來源 IP 段)REQUIRE SSL 於 GRANT 子句| 現象 | 可能原因 | 排查 |
|---|---|---|
| Connection refused | bind-address 未改、服務未重啟、防火牆攔截 | netstat -ntlp | grep 3306;telnet ip 3306 |
| Access denied for user | 用戶/密碼錯、宿主不匹配(%' vs 具體 IP) | SELECT User,Host FROM mysql.user;SHOW GRANTS |
| Host 'x.x.x.x' is not allowed | skip-name-resolve 導致反解析失敗 | my.cnf 加 skip-name-resolve 或授權具體 IP |
Ubuntu 開放 MySQL 遠程:bind-address=0.0.0.0 + CREATE USER ...@'%' + GRANT + FLUSH PRIVILEGES + 防火牆放行。安全第一:專用帳號、最小權限、SSL、來源 IP 限制。