MySQL 權限體系採用「最小權限原則」,通過 GRANT 在多層級(全局、庫、表、列、存儲程序)精細授權。本文系統梳理語法、典型角色授權模板、權限查看與回收、常見坑點,助你構建安全合規的數據庫訪問控制。
GRANT priv_type [(column_list)]
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | tls_option ...}]
[WITH with_option ...];
-- 核心要素:
-- priv_type : SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, EXECUTE, REPLICATION SLAVE 等
-- priv_level : *.* | db.* | db.tbl | db.tbl(col) | PROCEDURE db.proc | FUNCTION db.fn
-- user_specification : 'user'@'host' IDENTIFIED BY 'pwd' [WITH GRANT OPTION]
-- with_option : GRANT OPTION | MAX_QUERIES_PER_HOUR n | MAX_CONNECTIONS_PER_HOUR n ...
-- 高權限 DBA,僅限本地/堡壘機
CREATE USER 'dba'@'10.0.0.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.0.%' WITH GRANT OPTION;
-- 生產環境建議不給 GRANT OPTION,由專門帳號管理權限
CREATE USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'AppRw@2024';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_rw'@'10.0.1.%';
-- 僅授權業務庫,禁止 DDL、禁止跨庫
CREATE USER 'app_ro'@'10.0.2.%' IDENTIFIED BY 'AppRo@2024';
GRANT SELECT ON app_db.* TO 'app_ro'@'10.0.2.%';
-- 可加 MAX_CONNECTIONS_PER_HOUR 限流
CREATE USER 'dev'@'192.168.%.%' IDENTIFIED BY 'Dev@2024';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX ON test_db.* TO 'dev'@'192.168.%.%';
GRANT CREATE TEMPORARY TABLES ON test_db.* TO 'dev'@'192.168.%.%';
GRANT EXECUTE ON PROCEDURE test_db.* TO 'dev'@'192.168.%.%';
-- 僅允許讀取非敏感列
GRANT SELECT (id, username, email, created_at) ON app_db.users TO 'api_ro'@'10.0.3.%';
-- 或創建視圖 + 授權視圖(更靈活)
GRANT EXECUTE ON PROCEDURE app_db.sp_calc_bonus TO 'batch_user'@'10.0.4.%';
GRANT EXECUTE ON FUNCTION app_db.fn_encrypt TO 'batch_user'@'10.0.4.%';
CREATE USER 'repl'@'10.0.5.%' IDENTIFIED BY 'Repl@2024';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'10.0.5.%';
-- 物理備份工具需額外權限
GRANT BACKUP_ADMIN, PROCESS, RELOAD ON *.* TO 'backup_user'@'10.0.6.%';
-- 當前用戶
SHOW GRANTS;
-- 指定用戶
SHOW GRANTS FOR 'app_rw'@'10.0.1.%';
-- 回收權限(語法與 GRANT 類似,TO 換 FROM)
REVOKE DROP ON app_db.* FROM 'dev'@'192.168.%.%';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'old_user'@'%';
-- 刷新生效(8.0+ 隱式生效,舊版本需執行)
FLUSH PRIVILEGES;
FLUSH PRIVILEGES(8.0 自動持久化)'user'@'%' 匹配所有 IP,'user'@'10.0.%' 匹配網段,'user'@'localhost' 僅 Unix Socket,**不匹配 127.0.0.1**''@'localhost',必須刪除:DROP USER ''@'localhost';validate_password 插件,強制長度、混合字符、過期輪換test 庫默認所有用戶可寫,生產環境 DROP DATABASE test; 或 REVOKE ALL ON test.* FROM '%'@'%';ERROR 1142 (42000): SELECT command denied to user 'xxx'@'xxx' for table 'tbl'
SHOW GRANTS FOR 'xxx'@'xxx'; 是否有庫/表級 SELECTSELECT USER(), CURRENT_USER(); 對比實際認證身份DEFINER 權限,調用者需 EXECUTE + 底層表權限mysql.user、mysql.db、mysql.tables_priv 異常權限pt-show-grants 導出權限矩陣,做基線對比MySQL 權限管理核心是「最小權限、網段隔離、審計可追溯」。建立角色模板(DBA、App_RW、App_RO、Dev、Repl、Backup),變更走流程,定期巡檢,將權限風險降至最低。