MySQL 權限系統是資料庫安全的基石。本文系統解析權限的分層架構、系統表存儲結構、兩階段驗證流程(連接校驗 + 請求校驗)、賬號名稱匹配規則、權限變更生效機制,為 DBA 與開發者建立完整的權限系統心智模型。
| 層級 | 範圍 | 典型權限 | 存儲表 |
|---|---|---|---|
| 全局/管理權限 | 整個 MySQL 服務實例 | SHUTDOWN, SUPER, RELOAD, PROCESS, CREATE USER, REPLICATION SLAVE | mysql.user |
| 資料庫級權限 | 特定資料庫及其所有對象 | SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER | mysql.db |
| 表級權限 | 特定資料表 | SELECT, INSERT, UPDATE, DELETE, TRIGGER | mysql.tables_priv |
| 欄位級權限 | 特定欄位 | SELECT, INSERT, UPDATE | mysql.columns_priv |
| 存儲程序/函數權限 | 特定 PROCEDURE/FUNCTION | EXECUTE, ALTER ROUTINE | mysql.procs_priv |
| 代理用戶權限 | 代理關係 | PROXY | mysql.proxies_priv |
mysql.user -- 全局權限、認證信息、帳號鎖定狀態
mysql.db -- 資料庫級權限
mysql.tables_priv -- 表級權限
mysql.columns_priv -- 欄位級權限
mysql.procs_priv -- 存儲程序/函數權限
GRANT/REVOKE/CREATE USER 等) 自動刷新快取'user_name'@'host_name''user_name' 等同 'user_name'@'%'-) 或通配符時**必須加引號**'localhost'、'192.168.1.100'、'db-server'% (SQL LIKE 語義):'192.168.1.%'、'%.example.com'、'%''192.168.1.0/255.255.255.0''':匹配**任意用戶名** (匿名用戶)mysql.user 讀取 Host, User, authentication_string, account_lockedaccount_locked='Y')每條 SQL 執行前,Server 檢查會話擁有的權限是否滿足操作需求:
| 修改方式 | 生效時機 | 命令 |
|---|---|---|
| 權限管理語句 | **即時生效** (自動刷新快取) | GRANT, REVOKE, CREATE USER, DROP USER, ALTER USER, SET PASSWORD, RENAME USER |
| 直接 DML 修改系統表 | **不生效**,需手動刷新 | INSERT/UPDATE/DELETE mysql.user 等 |
| 手動刷新快取 | 立即生效 | FLUSH PRIVILEGES; mysqladmin flush-privileges; mysqladmin reload |
| 啟動參數 --skip-grant-tables | **完全跳過權限檢查** (極度危險) | mysqld --skip-grant-tables |
authentication_string,5.6 為 Password)mysql_native_password、caching_sha2_password (8.0 預設)、auth_socket、LDAP、Kerberos 等Server 讀取 mysql.user 到記憶體時會排序:
實例:同時存在 'root'@'%' 和 ''@'localhost' (匿名),本地連接 mysql -u root 會匹配**匿名用戶** (因 Host 精確 localhost 排在 % 前),導致權限不足。解決:刪除匿名用戶 DROP USER ''@'localhost'。
mysql_secure_installationmysql.user:檢查匿名用戶、通配符 Host、弱密碼、過期帳號SHOW GRANTS FOR 'user'@'host' 核實實際權限MySQL 權限系統 = 分層存儲 (5 表) + user@host 匹配模型 + 兩階段驗證 (連接+請求) + 快取生效機制。理解排序規則、匿名用戶陷阱、直接修改系統表不生效等核心細節,能避開 90% 權限相關疑難雜症。