MySQL 權限系統基於「用戶 = 用戶名 + 主機」模型,權限分層:全局、庫級、表級、列級、存儲過程級。本文匯總創建用戶、精細授權、撤銷權限、修改密碼、刪除用戶、查看權限、密碼複雜度策略的標準化操作手冊。
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
-- host: 'localhost' 本地、'10.0.%.%' IP 段、'%' 任意遠程
-- 密碼可為空 (不推薦)
CREATE USER 'app'@'10.0.%.%' IDENTIFIED BY 'Str0ngP@ss!';
CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadOnly#2024' REQUIRE SSL;
-- 庫級讀寫
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `biz_db`.* TO 'app'@'10.0.%.%';
-- 唯讀
GRANT SELECT ON `biz_db`.* TO 'readonly'@'%';
-- 開發全權限 (含 GRANT OPTION)
GRANT ALL PRIVILEGES ON `dev_db`.* TO 'dev'@'10.0.%.%' WITH GRANT OPTION;
-- 列級權限 (極少用)
GRANT SELECT (id, name), UPDATE (name) ON `biz_db`.`user` TO 'masked'@'%';
-- 存儲過程權限
GRANT EXECUTE ON PROCEDURE `biz_db`.`sp_calc` TO 'app'@'10.0.%.%';
REVOKE DELETE ON `biz_db`.* FROM 'app'@'10.0.%.%';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'dev'@'10.0.%.%';
-- 注意:授權粒度與撤銷粒度必須一致,否則不生效
-- GRANT SELECT ON db.tbl → REVOKE SELECT ON db.* 無效
-- 5.7.6+ / 8.0
ALTER USER 'app'@'10.0.%.%' IDENTIFIED BY 'NewPass#2024';
-- 或
SET PASSWORD FOR 'app'@'10.0.%.%' = 'NewPass#2024';
-- 當前會話用戶修改自己密碼
SET PASSWORD = 'NewPass#2024';
DROP USER 'app'@'10.0.%.%';
SHOW GRANTS FOR 'app'@'10.0.%.%';
SHOW GRANTS; -- 當前用戶
-- 安裝 (8.0 內建組件)
INSTALL COMPONENT 'file://component_validate_password';
-- 關鍵參數
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.policy = STRONG; -- LOW/MEDIUM/STRONG
-- 密碼過期策略
ALTER USER 'app'@'10.0.%.%' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'app'@'10.0.%.%' PASSWORD REQUIRE CURRENT; -- 修改密碼需驗證舊密碼
| 權限 | 層級 | 說明 |
|---|---|---|
| ALL PRIVILEGES | 全局/庫/表 | 除 GRANT OPTION 外所有權限 |
| SELECT/INSERT/UPDATE/DELETE | 庫/表/列 | 四大 DML |
| CREATE/DROP/ALTER/INDEX | 庫/表 | DDL |
| CREATE VIEW/SHOW VIEW | 庫/表 | 視圖 |
| CREATE ROUTINE/ALTER ROUTINE/EXECUTE | 庫/過程 | 存儲過程/函數 |
| TRIGGER | 庫/表 | 觸發器 |
| REFERENCES | 庫/表/列 | 外鍵引用 |
| LOCK TABLES | 庫/表 | 需配合 SELECT |
| RELOAD | 全局 | FLUSH 操作 |
| SHUTDOWN | 全局 | 關閉服務 |
| PROCESS | 全局 | SHOW PROCESSLIST |
| FILE | 全局 | LOAD/SELECT INTO OUTFILE (高危) |
| SUPER | 全局 | KILL、CHANGE MASTER、SET GLOBAL 等 (高危) |
| REPLICATION CLIENT/SLAVE | 全局 | 複製 |
| CREATE USER | 全局 | 建用戶/改密碼/重命名 |
| GRANT OPTION | 全局/庫/表 | 授權給他人 |
| USAGE | 全局 | 僅允許連接,無實質權限 |
SELECT user, host FROM mysql.user WHERE authentication_string = '' OR user = ''; 排查空密碼/匿名用戶。權限管理核心:最小權限、職責分離、定期審計、密碼強制輪換。MySQL 8.0 引入角色 (ROLE) 簡化批量授權:CREATE ROLE 'app_rw'; GRANT SELECT,INSERT ON db.* TO 'app_rw'; GRANT 'app_rw' TO 'user1'@'%';