MySQL 管理員必須掌握:如何創建用戶賬號、限制連接來源、授予精確權限。MySQL 3.22.11 引入 GRANT 和 REVOKE 兩條語句,作為授權表的前端接口,比直接操作底層表更簡單、安全。
| 表名 | 存儲內容 |
|---|---|
user |
可連接服務器的用戶及其全局權限 |
db |
數據庫級權限 |
tables_priv |
表級權限 |
columns_priv |
列級權限 |
第五張表 host 不受 GRANT/REVOKE 影響,需手動維護。
user 表創建用戶記錄userdb、tables_priv、columns_priv建議:雖然 GRANT/REVOKE 更易用,但管理員應閱讀《MySQL 安全性指南》,理解底層表如何超越語句功能(如複雜的主機匹配邏輯)。
GRANT 權限列表 (列名) ON 權限作用範圍 TO 用戶名@主機名 IDENTIFIED BY '密碼' WITH GRANT OPTION
| 分類 | 權限 | 允許操作 |
|---|---|---|
| 數據/結構權限 (庫/表/列級) |
ALTER |
修改表結構和索引 |
CREATE |
創建數據庫和表 | |
DELETE |
刪除表記錄 | |
DROP |
刪除數據庫和表 | |
INDEX |
創建/刪除索引 | |
INSERT |
插入新行 | |
SELECT |
查詢記錄 | |
UPDATE |
修改現有記錄 | |
| 管理權限 (嚴格限制授予) |
FILE |
讀寫服務器文件 |
PROCESS |
查看/殺死線程 | |
RELOAD |
重載授權表、清空日志/緩存 | |
SHUTDOWN |
關閉服務器 | |
| 特殊權限 | ALL |
所有權限(同 ALL PRIVILEGES) |
USAGE |
「無權限」——僅創建用戶不授權 |
可選,僅用於列級權限。多列用逗號分隔。
*.*:全局(所有庫所有表)db_name.*:特定庫所有表db_name.tbl_name:特定表COLUMNS 子句實現列級格式:用戶名@主機名。MySQL 區分「誰」從「哪裡」連接,同名不同源用戶權限完全獨立。用戶名無需關聯系統登錄名。
IDENTIFIED BY → 無密碼(不安全)GRANT 會自動加密密碼,**不要**像 SET PASSWORD 那樣用 PASSWORD() 函數可選。包含則允許該用戶將自己擁有的權限再授予他人。
大小寫敏感性:用戶名、密碼、數據庫名、表名 區分大小寫;主機名、列名 不區分。
user@host)privileges ON what)FILE/PROCESS/RELOAD/SHUTDOWN)-- 僅允許從 localhost 連接 GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY 'ruby'; -- 允許從特定域名連接 GRANT ALL ON samp_db.* TO fred@res.mars.com IDENTIFIED BY 'quartz';
-- 允許從任何主機連接(謹慎使用!) GRANT ALL ON samp_db.* TO 'traveler'@'%' IDENTIFIED BY 'password';
GRANT USAGE ON *.* TO 'audit'@'%' IDENTIFIED BY 'audit123';
mysqlaccess:測試用戶權限的 Perl 腳本mysql_setpermission:交互式設置權限的 Perl 腳本(需 DBI 支持)