MySQL 使用者管理可透過 GRANT 指令 (推薦) 或直接操作 mysql.user/db/host 授權表。本文詳細說明兩種方式語法、建立超級用戶/一般用戶/無權限用戶範例、主機通配符用法、以及修改授權表後必須 FLUSH PRIVILEGES 的鐵則。
-- 超級用戶 monty,任意主機、密碼 something
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 與 %,否則匿名用戶優先順序高於 % 導致本地連線失敗
-- 管理用戶 admin,本地免密、僅 RELOAD/PROCESS 權限
GRANT RELOAD, PROCESS ON *.* TO admin@localhost IDENTIFIED BY '';
-- 無權限用戶 dummy,本地免密、USAGE (佔位)
GRANT USAGE ON *.* TO dummy@localhost IDENTIFIED BY '';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@whitehouse.gov IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'%' IDENTIFIED BY 'stupid';
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'));
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');
-- ... 其他資料庫同理
FLUSH PRIVILEGES; -- 必須執行,否則修改不生效
user 表建立連線身分,db 表控制資料庫層級權限。FLUSH PRIVILEGES 重新載入記憶體快取。%:任意主機。%.mydomain.com:特定網域所有主機 (GRANT 或 INSERT 皆支援)。可使用 xmysqladmin、mysql_webadmin、xmysql (Contrib 目錄) 圖形化管理授權表。
首選 GRANT 指令,語法清晰、自動生效、不易出錯。直接操作授權表僅用於批次匯入/遷移腳本,**切記結尾必加 FLUSH PRIVILEGES**。理解 user/db 兩層權限架構與主機優先順序,是 MySQL 安全管理基石。