權限資料儲存於 mysql 系統庫:
| 表 | 作用域 | 核心欄位 |
|---|---|---|
user | 全域 (伺服器級) | Host, User, Password, Select_priv, Update_priv... (全域權限) |
db | 資料庫級 | Host, Db, User, Select_priv... |
tables_priv | 資料表級 | Host, Db, User, Table_name, Table_priv (SET 型別) |
columns_priv | 欄位級 | Host, Db, User, Table_name, Column_name, Column_priv |
procs_priv | 存儲程序/函數級 | Host, Db, User, Routine_name, Routine_type, Proc_priv |
user 表:連線驗證 + 全域權限。db 表:資料庫級權限。tables_priv 表:資料表級權限。columns_priv 表:欄位級權限。procs_priv 表:程序權限。任一層級滿足即通過,層層遞進。
Host、User、Password (實際存 PASSWORD() 雜湊值)。INSERT INTO user (Host,User,Password) VALUES ('%','bill',PASSWORD('12345')); 切勿存明文。user 表權限對所有庫生效,含 mysql 系統庫。除 root 外建議全 N,改用 db 表授權。localhost (socket)、127.0.0.1 (TCP)、% (任意主機)、192.168.1.% (網段)。Root 建議僅 localhost。FLUSH PRIVILEGES;。GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER ON bill_db.* TO 'bill'@'%';
Table_priv / Column_priv 為 SET 型別,可選 SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,GRANT,INDEX,ALTER,REFERENCES。SELECT、分析師需特定敏感欄位 SELECT、應用帳號禁止 DROP。'app'@'10.0.1.%' 而非 '%'。SELECT User,Host FROM mysql.user WHERE User NOT IN ('root','repl','monitor');CREATE ROLE 'app_read'; GRANT SELECT ON db.* TO 'app_read'; GRANT 'app_read' TO 'user'@'%';| 錯誤 | 原因 | 解決 |
|---|---|---|
| Access denied for user 'x'@'host' | user 表無此 Host/User 組合 | 新增對應 Host 記錄或用 % |
| Access denied for user 'x'@'%' to database 'db' | db 表缺授權 | GRANT ON db.* TO 'x'@'%' |
| Table 'x' doesn't exist | tables_priv 缺 SELECT | GRANT SELECT ON db.x TO 'x'@'%' |
| Command denied to user 'x'@'%' for table 'mysql.user' | 無系統庫權限 | 正常,業務帳號不應有 |
MySQL 權限系統採五層遞進模型,GRANT/REVOKE 是操作介面,底層維護五張表。掌握檢查順序與 Host 匹配規則,配合最小權限、按網段授權、定期審計,即可構建安全可控的資料庫存取體系。