mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
user:目標用戶名(如 app_user)%':允許任意主機連接(生產建議限定具體 IP/網段)WITH GRANT OPTION:允許該用戶再授權(謹慎使用)-- 僅允許應用服務器網段
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON app_db.* TO 'app_user'@'10.0.0.%' IDENTIFIED BY 'StrongPass#2024';
FLUSH PRIVILEGES;
[mysqld]
bind-address = 0.0.0.0 # 或具體內網 IP,如 10.0.0.10
# skip-networking 註釋掉或刪除
重啟生效:systemctl restart mysqld
# firewalld (CentOS 7+)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
# iptables
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 3306 -j ACCEPT
service iptables save
# 從應用服務器
mysql -h 10.0.0.10 -u app_user -p -e "SELECT 1;"
telnet 10.0.0.10 3306
nc -zv 10.0.0.10 3306
| 現象 | 原因 | 修正 |
|---|---|---|
| Host 'x.x.x.x' is not allowed to connect | 用戶宿主不匹配 | 檢查 SELECT User, Host FROM mysql.user; 確認 % 或具體 IP |
| Connection refused | bind-address 未改 / 防火牆攔截 / 服務未重啟 | 依次排查三項 |
| Access denied for user (using password: YES) | 密碼錯誤 / plugin 不匹配 (caching_sha2_password vs mysql_native_password) | 重設密碼 ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'pass'; |