查詢所有使用者帳號
在 MySQL 中,使用者資訊儲存在 mysql 資料庫的 user 資料表中。你可以執行以下指令來查看系統中所有的帳號以及他們的主機位置:
SELECT user, host FROM mysql.user;
這會列出所有使用者名稱及其對應的連線主機。
查詢特定使用者的權限
如果你想查看某個特定使用者的具體權限,可以使用 SHOW GRANTS 指令。語法如下:
SHOW GRANTS FOR ‘username’@’host’;
例如,要查詢 root 使用者在本地端的權限:
SHOW GRANTS FOR ‘root’@’localhost’;
執行後,系統會回傳一串 GRANT 開頭的指令,這些指令描述了該帳號擁有的所有權限。
查詢所有使用者的權限清單
如果你的目標是快速掃描所有使用者的權限,可以直接查詢 mysql.user 表格中的權限欄位。不過這個表格欄位非常多,通常建議只選取幾個關鍵欄位:
SELECT user, host, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv FROM mysql.user;
這能讓你一眼看到哪些帳號具備基本的資料操作權限。
查詢特定資料庫的權限
有時候權限是針對特定資料庫設定的,這類資訊儲存在 mysql.db 資料表中。你可以執行:
SELECT user, host, db, Select_priv, Insert_priv FROM mysql.db;
這會顯示哪些使用者對哪些特定的資料庫擁有存取權。
判斷帳號是否具備遠端連線權限
在 MySQL 的權限機制中,一個帳號是否能連線取決於 user 表格中的 host 欄位。如果 host 欄位設定為 localhost 或 127.0.0.1,該帳號就只能從資料庫伺服器本機登入。若要從遠端 IP 連線,host 欄位必須是特定的遠端 IP 地址或是萬用字元 %。
你可以執行這行指令來檢查:
SELECT user, host FROM mysql.user WHERE host != ‘localhost’ AND host != ‘127.0.0.1’;
如果查詢結果中 host 顯示為 %,代表該帳號可以從任何遠端 IP 位址連線。如果顯示的是特定的 IP 或主機名稱,則代表該帳號僅限從該位置連線。
檢查 MySQL 監聽狀態
除了帳號權限外,資料庫本身的網路設定也會影響遠端連線。如果 MySQL 只監聽本機介面,即使帳號 host 設定為 % 也無法連線。你可以檢查系統設定值:
SHOW VARIABLES LIKE ‘bind_address’;
如果結果是 127.0.0.1,代表資料庫只接受本機連線。若要接受遠端連線,這個數值通常會設定為 0.0.0.0。
確認權限細節
有時候帳號雖然可以連線,但沒有進入特定資料庫的權限。你可以針對特定的遠端帳號查看其詳細定義:
SHOW GRANTS FOR ‘your_user’@’%’;
這會顯示該遠端帳號具備的所有權限與加密要求。如果 host 設定不是 % 而是特定 IP,請將指令中的 % 替換為該 IP。
修改 MySQL 設定允許外部 IP 連線
你的查詢結果顯示 bind_address 為 127.0.0.1,這代表 MySQL 目前被鎖定在只能接受本機連線。即使你修改了使用者權限,遠端連線依然會被系統層級阻擋。你必須先修改設定檔,通常位於 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf。
找到 bind-address 這一行,將它改為:
bind-address = 0.0.0.0
這代表允許所有網路介面的連線。修改存檔後,必須重啟 MySQL 服務才會生效:
sudo systemctl restart mysql
修改使用者帳號的 Host 屬性
解決了系統監聽問題後,接著要處理帳號權限。你可以將現有帳號的 host 改為 %(代表任何 IP),或是針對特定 IP 進行設定。最直接的方式是使用 RENAME USER 指令:
RENAME USER ‘username’@’localhost’ TO ‘username’@’%’;
如果你想保留原本的本機帳號,另外建立一個遠端帳號,可以使用 CREATE USER 並賦予權限:
CREATE USER ‘username’@’%’ IDENTIFIED BY ‘your_password’;
GRANT ALL PRIVILEGES ON database_name.* TO ‘username’@’%’;
FLUSH PRIVILEGES;
安全性檢查與防火牆設定
修改完 host 和 bind_address 後,最後一步是確認作業系統的防火牆(如 ufw 或 iptables)是否有開啟 3306 埠。
如果你的伺服器在雲端平台(如 AWS, Google Cloud),還需要在雲端平台的防火牆規則(Security Group)中允許 TCP 3306 埠的入站流量。建議將 % 改為特定的固定 IP,以避免資料庫暴露在公開網路中遭受攻擊。
使用 mysql 指令連線資料庫
要在終端機(Terminal)或命令提示字元(CMD)連線到 MySQL 資料庫,最基本的指令格式包含使用者名稱、密碼以及主機位置。
本機連線方式
如果你是在安裝資料庫的同一台電腦上連線,可以使用以下指令。輸入後系統會提示你輸入密碼:
mysql -u username -p
如果是要連線後直接進入特定的資料庫,可以在最後加上資料庫名稱:
mysql -u username -p database_name
遠端連線方式
由於你之前檢查過 bind_address 並可能已經開放了遠端存取,連線到遠端伺服器時需要指定主機的 IP 地址或網址:
mysql -h 192.168.1.100 -P 3306 -u username -p
- -h:指定遠端伺服器的 IP 地址。
- -P:指定連接埠(預設是 3306,若沒改過可以省略)。
- -u:你的使用者名稱。
- -p:代表需要密碼(不要直接在 -p 後面寫密碼,這樣會留在指令紀錄中不安全)。
常見連線參數對照表
| 參數 | 說明 | 範例 |
| -h | 主機位址 (Host) | -h 127.0.0.1 |
| -u | 使用者名稱 (User) | -u root |
| -p | 密碼 (Password) | -p |
| -P | 連接埠 (Port) | -P 3306 |
| -D | 資料庫名稱 (Database) | -D my_db |
連線成功後的常用指令
連線成功後,你會看到 mysql> 的提示字元。這時你可以執行以下指令來確認環境:
- 查詢目前所在的資料庫:SELECT DATABASE();
- 切換資料庫:USE database_name;
- 列出所有資料庫:SHOW DATABASES;
- 離開連線:EXIT; 或 QUIT;
如果你在連線時遇到時連線失敗(例如 Connection refused),通常是防火牆沒開或是 bind_address 尚未修改生效,需要我幫你排查連線錯誤嗎?