五層權限體系
| 層級 | 範圍 | 存儲表 | 典型授權語句 |
| 全局 | 所有庫所有表 | mysql.user | GRANT ALL ON *.* TO user@'%'; |
| 庫級 | 單庫所有表 | mysql.db | GRANT ALL ON db.* TO user@'%'; |
| 表級 | 單表所有列 | mysql.tables_priv | GRANT SELECT ON db.tbl TO user@'%'; |
| 列級 | 單表單列 | mysql.columns_priv | GRANT SELECT(col) ON db.tbl TO user@'%'; |
| 程序級 | 存儲過程/函數 | mysql.procs_priv | GRANT EXECUTE ON PROCEDURE db.sp TO user@'%'; |
六大權限系統表結構要點
mysql.user:全局權限、密碼、資源限制、SSL、插件認證
mysql.db:庫級權限,主鍵 (Host, Db, User)
mysql.tables_priv:表級權限,Table_priv (set)、Column_priv (set)
mysql.columns_priv:列級權限,主鍵含 Column_name
mysql.procs_priv:程序級權限,Proc_priv (set)
mysql.proxies_priv:代理用戶權限
創建用戶三種方式
DROP USER 'app'@'%'; -- 推薦
-- 或
DELETE FROM mysql.user WHERE User='app' AND Host='%'; FLUSH PRIVILEGES;
修改密碼四種方式
忘記 root 密碼恢復
- 停止服務:
systemctl stop mysqld
- 跳過授權表啟動:
mysqld_safe --skip-grant-tables &
- 無密碼登錄:
mysql -u root
- 修改密碼:
UPDATE mysql.user SET authentication_string=PASSWORD('new') WHERE User='root'; FLUSH PRIVILEGES;
- 正常重啟:
systemctl restart mysqld
收回權限
| 角色 | 典型權限 |
| 應用賬號 | SELECT, INSERT, UPDATE, DELETE, EXECUTE |
| 開發人員 | SELECT + 建表/改表/刪表/索引/視圖/存儲過程權限 |
| 只讀分析 | SELECT(可限制到列級) |
| 普通 DBA | 單庫 ALL PRIVILEGES |
| 超級 DBA | *.* ALL PRIVILEGES |
環境隔離原則
- 生產庫:僅應用賬號寫入,DBA 變更走審批,開發/測試/分析唯讀
- 測試庫:測試寫入,開發/分析讀,結構變更雙人審核
- 開發庫:全團隊讀寫改結構,只要不掛服務即可