基本功能:授予特定主機用戶對特定資料庫的 SELECT/INSERT/UPDATE/DELETE 權限。額外功能:控制匿名存取、特定函數使用(如 LOAD DATA INFILE)。MySQL 用戶名與系統用戶名無關,標準做法用 --user 選項指定。
主機 1 的 lee 與主機 2 的 lee 是不同使用者,權限可異。核心問題:授予「從某主機登入的某用戶」對「某資料庫」的權限。可用 mysqlaccess 測試。所有授權資訊存於 mysql 資料庫的 user、host、db 三表。
通配符 % 表示任意,空值亦同義。搜尋順序:user → db → host。
user 表,找到第一匹配記錄 → 稱 Privdb 表獲取授權db 表 Host 為空,且 Priv 記錄主機包含在 host 表 Host 中,則可將 host 表中為 Y 的權限加給該用戶db 表 Host 非空,則不影響該用戶/主機授權Host 後 User。規則:無通配符 → 有通配符 → 空值。同一 Host 內再按 User 同規則排序。Host 欄位:無通配符 → 有通配符 → 空值。Host 欄位:無通配符 → 有通配符 → 空值。
+-----------+---------+
| Host | User |
+-----------+---------+
| % | root |
| % | jeffrey |
| localhost | root |
| localhost | |
+-----------+---------+
搜尋順序:
localhost/root
localhost/any
any/jeffrey
any/root
localhost 的 jeffrey 連線,授權依 localhost/any 行而非 any/jeffrey。配置不當極易導致無法正常使用。
需求:用戶 custom 從 localhost、server.domain、whitehouse.gov 連線,密碼 stupid。bankaccount 僅允許 localhost 存取;customers 允許三主機存取。
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');
INSERT INTO db (host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)
VALUES ('%','customers','custom','Y','Y','Y','Y','Y','Y');
欄位:Host char(60) PRI, User char(16) PRI, Password char(16), Select_priv enum('N','Y') 預設 N, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv
欄位:Host char(60) PRI, Db char(64) PRI, User char(16) PRI, Select_priv...Drop_priv (同 user 表前 8 權限)
僅在 db 表項目 Host 為空時使用。欄位:Host, Db, Select_priv...Drop_priv。
三表均支援通配符。
mysql_install_db 建立授權表(測試:mysql -u root 應無錯誤)mysql -u root mysql 或以 root 身份操作mysqladmin reload 更新--skip-grant-tables 啟動PASSWORD('pwd') 加密密碼;-ppassword 無空格mysql --user other_user db 繞過驗證Process_priv、File_priv 等高危權限--secure (檢查 IP 一致性)、--skip-grant-tables (慎用)、--skip-name-resolve (授權表只能用 IP/localhost)、--skip-networking (禁用 TCP/IP,僅 Unix Socket,強烈推薦)