預設 MySQL 僅監聽 127.0.0.1,外部主機無法連線。本文提供最精簡的三步驟,快速開放遠程存取並建立專用帳號,附帶 GRANT 參數詳細說明與權限疊加機制。
sudo vi /etc/mysql/my.cnf # 找到 [mysqld] 區塊,註解掉 bind-address # bind-address = 127.0.0.1 # 儲存離開,重啟服務 sudo service mysql restart
註解後 MySQL 將監聽 0.0.0.0(所有網卡),允許外部連線。
GRANT ALL PRIVILEGES ON *.* TO 'gino'@'%' IDENTIFIED BY "123456";
| 子句 | 含義 |
|---|---|
| ALL PRIVILEGES | 所有權限(可改為 SELECT、INSERT 等單一權限) |
| ON *.* | 前 * 為資料庫,後 * 為資料表;*.* 表示所有庫所有表 |
| TO 'gino'@'%' | 用戶 gino,@ 後為主機限制;% 表示任意主機(含遠程) |
| IDENTIFIED BY "123456" | 設定登入密碼 |
| WITH GRANT OPTION | 允許該用戶將自己擁有的權限再授權給他人(建立管理帳號時加上) |
'user'@'192.168.1.%':限定網段'user'@'%.example.com':限定域名% 不包含 localhost,本地無法登入時請額外建立 'user'@'localhost'。同一帳號重複執行 GRANT 會疊加權限,例如:
GRANT SELECT ON db.* TO 'u'@'%'; GRANT INSERT ON db.* TO 'u'@'%'; -- 現在 u 同時擁有 SELECT + INSERT
FLUSH PRIVILEGES;
特別是直接對權限表(user、db、host)做 UPDATE/DELETE 後,必須執行此指令。
# Ubuntu/Debian systemd sudo systemctl start mysql sudo systemctl stop mysql sudo systemctl restart mysql # 傳統 SysVinit sudo service mysql start sudo service mysql stop sudo service mysql restart
# 客戶端測試 mysql -h-u gino -p123456
若報 Host 'x.x.x.x' is not allowed to connect,檢查:
skip_networking 是否為 OFF三步驟完成,即可安全開放 MySQL 遠程存取,配合最小權限原則建立專用業務帳號,滿足微服務、異地備份、BI 分析等多種場景需求。