經典新手坑:本機 mysql -u root -p 正常,改用 mysql -h 192.168.x.x -u root -p 卻報 Host '192.168.x.x' is not allowed to connect。根因是 MySQL 權限系統按 『用戶@主機』 區分帳號,root@localhost 與 root@192.168.x.x 互不相干。一條 GRANT + FLUSH PRIVILEGES 即可解決。
-- 授予所有庫、所有表、所有權限給指定 IP 的用戶
GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'IP地址' IDENTIFIED BY '密碼';
-- 立即生效
FLUSH PRIVILEGES;
| 子句 | 示例 | 含義 |
|---|---|---|
| ALL PRIVILEGES | ALL PRIVILEGES / SELECT,INSERT,UPDATE | 權限範圍,生產環境建議最小權限 |
| *.* | *.* / db_name.* / db_name.tbl_name | 對象範圍:所有庫.所有表 / 指定庫.所有表 / 指定庫.指定表 |
| TO 'user'@'host' | 'app_user'@'192.168.1.%' | 帳號@主機,支援通配符 %(同網段)、具體 IP、域名 |
| IDENTIFIED BY | IDENTIFIED BY 'StrongP@ssw0rd' | 設定密碼,5.7+ 建議配合 ALTER USER ... IDENTIFIED BY |
'app_user'@'192.168.1.%' 覆蓋整個 C 段,避免 IP 變更維護成本SELECT,INSERT,UPDATE,DELETE;遷移帳號加 CREATE,ALTER,DROP,INDEX;監控帳號僅 PROCESS,REPLICATION CLIENTGRANT ... REQUIRE SSL 強制加密傳輸WITH MAX_QUERIES_PER_HOUR 1000 MAX_CONNECTIONS_PER_HOUR 50SELECT Host,User FROM mysql.user; 確認目標 Host 列包含目標 IP/通配符netstat -tlnp | grep 3306 確認監聽 0.0.0.0:3306(非 127.0.0.1)firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload 開放埠mysql -h 目標IP -u 用戶名 -p 遠端驗證