首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL GRANT 權限管理完全指南:從語法到最佳實踐

     編輯:MySQL 綜合教學

MySQL 權限體系採用「最小權限原則」,通過 GRANT 在多層級(全局、庫、表、列、存儲程序)精細授權。本文系統梳理語法、典型角色授權模板、權限查看與回收、常見坑點,助你構建安全合規的數據庫訪問控制。

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 ...

分層級授權實戰模板

1. 全局管理員(DBA)

-- 高權限 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,由專門帳號管理權限

2. 應用讀寫賬號(後端服務)

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、禁止跨庫

3. 應用唯讀賬號(報表/只讀副本)

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 限流

4. 開發/測試賬號

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.%.%';

5. 列級權限(敏感字段脫敏)

-- 僅允許讀取非敏感列
GRANT SELECT (id, username, email, created_at) ON app_db.users TO 'api_ro'@'10.0.3.%';
-- 或創建視圖 + 授權視圖(更靈活)

6. 存儲過程/函數執行權限

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.%';

7. 複制/備份賬號

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;

關鍵注意事項

  1. 生效時機:修改權限後,已建立的連接不受影響,需重新連接或執行 FLUSH PRIVILEGES(8.0 自動持久化)
  2. 主機匹配:'user'@'%' 匹配所有 IP,'user'@'10.0.%' 匹配網段,'user'@'localhost' 僅 Unix Socket,**不匹配 127.0.0.1**
  3. 匿名用戶:安裝後默認存在 ''@'localhost',必須刪除:DROP USER ''@'localhost';
  4. 密碼策略:啟用 validate_password 插件,強制長度、混合字符、過期輪換
  5. GRANT OPTION 慎用:避免權限傳遞失控,僅 DBA 管理帳號持有
  6. 預設庫權限: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'; 是否有庫/表級 SELECT
  • 確認主機匹配:SELECT USER(), CURRENT_USER(); 對比實際認證身份
  • 視圖/存儲過程需 DEFINER 權限,調用者需 EXECUTE + 底層表權限

自動化治理建議

  • 權限變更走工單、Git 記錄、審批流
  • 定期掃描 mysql.user、mysql.db、mysql.tables_priv 異常權限
  • 配合 pt-show-grants 導出權限矩陣,做基線對比
  • 敏感操作(DROP、TRUNCATE、GRANT OPTION)審計日志告警

總結

MySQL 權限管理核心是「最小權限、網段隔離、審計可追溯」。建立角色模板(DBA、App_RW、App_RO、Dev、Repl、Backup),變更走流程,定期巡檢,將權限風險降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved