在 MySQL 中建立使用者帳號主要有兩種途徑:使用 GRANT 語句(推薦,語法簡潔、錯誤率低)或 直接對授權表執行 INSERT/UPDATE(需手動 FLUSH PRIVILEGES)。本文詳細對比兩種方法並提供實戰範例。
先以 root 登入:
shell> mysql --user=root mysql
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'something' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'something' WITH GRANT OPTION;
說明: 必須同時建立 localhost 與 % 兩條記錄,否則本地匿名帳號優先權較高會導致 monty@localhost 無法生效。
GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost';
可執行 mysqladmin reload、flush-*、processlist 等管理指令,無資料庫操作權限。
GRANT USAGE ON *.* TO 'dummy'@'localhost';
USAGE 等同於「無任何權限」,用於預留帳號,後續再補授權。
-- 僅允許從 localhost 存取 bankaccount
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'stupid';
-- 僅允許從 whitehouse.gov 存取 expenses
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'stupid';
-- 允許從任意主機存取 customer
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO 'custom'@'%' IDENTIFIED BY 'stupid';
同樣先以 root 登入 mysql 資料庫,然後插入記錄:
INSERT INTO user (Host, User, Password) VALUES ('localhost', 'custom', PASSWORD('stupid'));
INSERT INTO user (Host, User, Password) VALUES ('server.domain', 'custom', PASSWORD('stupid'));
INSERT INTO user (Host, User, Password) VALUES ('whitehouse.gov', 'custom', PASSWORD('stupid'));
此時僅建立登入憑證,所有權限欄位預設為 'N'。
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv)
VALUES ('localhost', 'bankaccount', 'custom', 'Y','Y','Y','Y','Y','Y');
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv)
VALUES ('whitehouse.gov', 'expenses', 'custom', 'Y','Y','Y','Y','Y','Y');
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv)
VALUES ('%', 'customer', 'custom', 'Y','Y','Y','Y','Y','Y');
FLUSH PRIVILEGES;
允許來自 mydomainname.com 任意子網域的連線:
-- GRANT 方式
GRANT ALL PRIVILEGES ON *.* TO 'myusername'@'%.mydomainname.com' IDENTIFIED BY 'mypassword';
-- 直接操作表方式
INSERT INTO user (Host, User, Password) VALUES ('%.mydomainname.com', 'myusername', PASSWORD('mypassword'));
FLUSH PRIVILEGES;
除命令列外,亦可使用 xmysqladmin、mysql_webadmin、xmysql 等圖形化工具管理授權表(位於 MySQL Contrib 目錄)。
日常運維強烈建議使用 GRANT/REVOKE 語句,語義清晰且自動處理權限生效。直接操作授權表僅適合批次匯入、遷移或特殊自動化場景,且務必記得 FLUSH PRIVILEGES。掌握兩種方法,靈活應對不同管理需求。