首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL GRANT 命令詳解:權限管理實戰完全指南

     編輯:MySQL 資料庫相關知識

概述

GRANT 是 MySQL 權限系統的核心命令,用於授予用戶對資料庫對象的特定操作權限。本文基於 MySQL 5.x 版本,通過分層級、分場景的實例,系統講解授權語法、權限層級、查看與回收機制及常見陷阱。

基礎語法

GRANT privilege_type [, privilege_type] ...
ON object_type privilege_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option ...}]
[WITH with_option ...]
  • privilege_type:SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、INDEX、ALTER、REFERENCES、EXECUTE、CREATE VIEW、SHOW VIEW、CREATE ROUTINE、ALTER ROUTINE、ALL PRIVILEGES 等。
  • privilege_level:*.*(全庫全表)、db.*(庫級)、db.tbl(表級)、db.tbl(col)(列級)、PROCEDURE db.proc、FUNCTION db.func。
  • user_specification:'user'@'host',支援通配符 %。

常見角色授權模板

1. 只讀業務賬號(查詢、插入、更新、刪除)

GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%' IDENTIFIED BY 'strong_pass';

2. 開發人員(DDL + 視圖 + 存儲過程)

GRANT CREATE, ALTER, DROP, INDEX, REFERENCES,
      CREATE TEMPORARY TABLES,
      CREATE VIEW, SHOW VIEW,
      CREATE ROUTINE, ALTER ROUTINE, EXECUTE
ON dev_db.* TO 'dev_user'@'192.168.1.%' IDENTIFIED BY 'dev_pass';

3. 單庫 DBA(完全控制權)

GRANT ALL PRIVILEGES ON prod_db.* TO 'dba_user'@'localhost' IDENTIFIED BY 'dba_pass';

4. 超級管理員(全例項管理權)

GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root_pass' WITH GRANT OPTION;

注意:WITH GRANT OPTION 允許被授權者再授權給他人,生產環境極少開啟,權限收口由專職 DBA 統一管理。

五大權限作用層級詳解

層級語法範例適用場景
全例項GRANT SELECT ON *.* TO 'monitor'@'%';監控、備份、審計賬號
單庫GRANT SELECT ON reporting.* TO 'analyst'@'%';跨表查詢分析
單表GRANT SELECT, INSERT ON orders.order_2024 TO 'etl_user'@'%';ETL 寫入特定分表
列級GRANT SELECT(id, name, email) ON users.profile TO 'api_user'@'%';敏感字段隔離(如密碼哈希不授權)
程序/函數GRANT EXECUTE ON PROCEDURE pay.calc_bonus TO 'svc_user'@'%';業務邏輯封裝在存儲過程

權限查看與回收

查看當前用戶權限

SHOW GRANTS;

查看指定用戶權限

SHOW GRANTS FOR 'app_user'@'%';

回收權限(REVOKE)

REVOKE ALL ON *.* FROM 'old_user'@'%';

語法與 GRANT 幾乎相同,僅將 TO 改為 FROM。

生效機制與注意事項

  1. 權限變更需重新連線生效:已建立的會話不受影響,必須斷開重連。
  2. WITH GRANT OPTION 慎用:權限傳遞鏈難以追蹤,違反最小權限原則。
  3. 權限表直接操作風險高:不要手動 INSERT/UPDATE/DELETE mysql.user, mysql.db, mysql.tables_priv...,務必用 GRANT/REVOKE 讓服務器自動維護權限快取。
  4. 匿名用戶與空密碼清理:安裝後執行 DELETE FROM mysql.user WHERE User='' OR Password=''; FLUSH PRIVILEGES;。
  5. 主機名解析影響權限匹配:skip-name-resolve 開啟時,權限表 Host 列只能用 IP,否則需確保 DNS/hosts 正確。

最佳實踐清單

  • 按「最小權限原則」建立賬號:唯讀、讀寫、DDL、管理分離。
  • 生產庫禁止使用 root@'%',管理賬號限制 localhost 或跳板機 IP。
  • 定期審計 SHOW GRANTS,清理離職人員、廢棄專案賬號。
  • 配合 MAX_QUERIES_PER_HOUR、MAX_CONNECTIONS_PER_HOUR 等資源限制防濫用。

結語

MySQL 權限系統雖不如 PostgreSQL 的角色體系靈活,但掌握 GRANT 的層級語法與生效機制,配合自動化腳本管理賬號全生命週期,完全能滿足企業級合規與安全需求。

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