文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  MySQL 提供的權限

8.2.2 MySQL 提供的權限

授予 MySQL 帳戶的權限決定了該帳戶可以執行的操作。MySQL 權限在其應用上下文中以及在不同操作層級上有所不同。

  • 管理權限允許使用者管理 MySQL 伺服器的操作。這些權限是全域的,因為它們不特定於特定的資料庫。

  • 資料庫權限適用於資料庫及其中的所有物件。這些權限可以授予特定資料庫,或全域授予,以便應用於所有資料庫。

  • 資料庫物件(例如表格、索引、檢視和儲存的常式)的權限可以針對資料庫中的特定物件、資料庫中給定類型的所有物件(例如,資料庫中的所有表格)或全域地針對所有資料庫中給定類型的所有物件進行授予。

權限的差異還在於它們是靜態的(內建於伺服器中)還是動態的(在執行時定義)。權限是靜態還是動態會影響其授予使用者帳戶和角色的可用性。有關靜態權限和動態權限之間差異的資訊,請參閱靜態與動態權限。)

有關帳戶權限的資訊儲存在 mysql 系統資料庫中的授權表中。有關這些表格的結構和內容的描述,請參閱第 8.2.3 節「授權表」。MySQL 伺服器會在啟動時將授權表的內容讀入記憶體,並在第 8.2.13 節「權限變更何時生效」中指示的情況下重新載入。伺服器會根據授權表的記憶體內複本做出存取控制決策。

重要事項

某些 MySQL 版本會變更授權表以新增新權限或功能。為了確保您可以利用任何新功能,請在每次升級 MySQL 時將您的授權表更新為目前的結構。請參閱第 3 章《升級 MySQL》

以下各節總結了可用的權限,提供每個權限的更詳細描述,並提供使用指南。

可用權限摘要

下表顯示 GRANTREVOKE 陳述式中使用的靜態權限名稱,以及授權表中與每個權限相關聯的欄位名稱和權限套用的內容。

表 8.2 用於 GRANT 和 REVOKE 的允許靜態權限

權限 授權表欄位 內容
ALL [PRIVILEGES] 所有權限」的同義詞 伺服器管理
ALTER Alter_priv 資料表
ALTER ROUTINE Alter_routine_priv 預存常式
CREATE Create_priv 資料庫、資料表或索引
CREATE ROLE Create_role_priv 伺服器管理
CREATE ROUTINE Create_routine_priv 預存常式
CREATE TABLESPACE Create_tablespace_priv 伺服器管理
CREATE TEMPORARY TABLES Create_tmp_table_priv 資料表
CREATE USER Create_user_priv 伺服器管理
CREATE VIEW Create_view_priv 檢視
DELETE Delete_priv 資料表
DROP Drop_priv 資料庫、資料表或檢視
DROP ROLE Drop_role_priv 伺服器管理
EVENT Event_priv 資料庫
EXECUTE Execute_priv 預存常式
FILE File_priv 伺服器主機上的檔案存取
GRANT OPTION Grant_priv 資料庫、資料表或預存常式
INDEX Index_priv 資料表
INSERT Insert_priv 資料表或欄位
LOCK TABLES Lock_tables_priv 資料庫
PROCESS Process_priv 伺服器管理
PROXY 請參閱 proxies_priv 表格 伺服器管理
REFERENCES References_priv 資料庫或資料表
RELOAD Reload_priv 伺服器管理
REPLICATION CLIENT Repl_client_priv 伺服器管理
REPLICATION SLAVE Repl_slave_priv 伺服器管理
SELECT Select_priv 資料表或欄位
SHOW DATABASES Show_db_priv 伺服器管理
SHOW VIEW Show_view_priv 檢視
SHUTDOWN Shutdown_priv 伺服器管理
SUPER Super_priv 伺服器管理
TRIGGER Trigger_priv 資料表
UPDATE Update_priv 資料表或欄位
USAGE 無權限」的同義詞 伺服器管理

下表顯示 GRANTREVOKE 陳述式中使用的動態權限名稱,以及權限套用的內容。

表 8.3 用於 GRANT 和 REVOKE 的允許動態權限

權限 內容
ALLOW_NONEXISTENT_DEFINER 孤立物件保護
APPLICATION_PASSWORD_ADMIN 雙密碼管理
AUDIT_ABORT_EXEMPT 允許審核日誌篩選器封鎖的查詢
AUDIT_ADMIN 審核日誌管理
AUTHENTICATION_POLICY_ADMIN 驗證管理
BACKUP_ADMIN 備份管理
BINLOG_ADMIN 備份和複製管理
BINLOG_ENCRYPTION_ADMIN 備份和複製管理
CLONE_ADMIN 複製管理
CONNECTION_ADMIN 伺服器管理
ENCRYPTION_KEY_ADMIN 伺服器管理
FIREWALL_ADMIN 防火牆管理
FIREWALL_EXEMPT 防火牆管理
FIREWALL_USER 防火牆管理
FLUSH_OPTIMIZER_COSTS 伺服器管理
FLUSH_PRIVILEGES 伺服器管理
FLUSH_STATUS 伺服器管理
FLUSH_TABLES 伺服器管理
FLUSH_USER_RESOURCES 伺服器管理
GROUP_REPLICATION_ADMIN 複製管理
GROUP_REPLICATION_STREAM 複製管理
INNODB_REDO_LOG_ARCHIVE 重做日誌歸檔管理
INNODB_REDO_LOG_ENABLE 重做日誌管理
MASKING_DICTIONARIES_ADMIN 伺服器管理
NDB_STORED_USER NDB 叢集
OPTIMIZE_LOCAL_TABLE OPTIMIZE LOCAL TABLE 陳述式
PASSWORDLESS_USER_ADMIN 驗證管理
PERSIST_RO_VARIABLES_ADMIN 伺服器管理
REPLICATION_APPLIER 複製通道的 PRIVILEGE_CHECKS_USER
REPLICATION_SLAVE_ADMIN 複製管理
RESOURCE_GROUP_ADMIN 資源群組管理
RESOURCE_GROUP_USER 資源群組管理
ROLE_ADMIN 伺服器管理
SENSITIVE_VARIABLES_OBSERVER 伺服器管理
SESSION_VARIABLES_ADMIN 伺服器管理
SET_ANY_DEFINER 伺服器管理
SHOW_ROUTINE 伺服器管理
SKIP_QUERY_REWRITE 伺服器管理
SYSTEM_USER 伺服器管理
SYSTEM_VARIABLES_ADMIN 伺服器管理
TABLE_ENCRYPTION_ADMIN 伺服器管理
TELEMETRY_LOG_ADMIN 適用於 AWS 上 HeatWave 的遙測日誌管理
TP_CONNECTION_ADMIN 執行緒池管理
TRANSACTION_GTID_TAG 複製管理
VERSION_TOKEN_ADMIN 伺服器管理
XA_RECOVER_ADMIN 伺服器管理

靜態權限描述

靜態權限是內建於伺服器中的,與在執行階段定義的動態權限相反。以下清單描述 MySQL 中可用的每個靜態權限。

特定的 SQL 陳述式可能具有比此處指示更具體的權限要求。如果是這樣,相關陳述式的描述會提供詳細資訊。

動態權限描述

動態權限是在執行階段定義的,與伺服器內建的靜態權限不同。以下清單描述了 MySQL 中可用的每個動態權限。

大多數動態權限在伺服器啟動時定義。其他權限由特定的元件或外掛程式定義,如權限描述中所述。在這種情況下,除非啟用定義它的元件或外掛程式,否則權限不可用。

特定的 SQL 陳述式可能具有比此處指示更具體的權限要求。如果是這樣,相關陳述式的描述會提供詳細資訊。

權限授予指南

僅將帳戶需要的權限授予該帳戶是個好主意。在授予 FILE 和管理權限時,您應格外謹慎

  • FILE 可能會被濫用,以將 MySQL 伺服器可以在伺服器主機上讀取的任何檔案讀取到資料庫表中。這包括所有可供全球讀取的檔案以及伺服器資料目錄中的檔案。然後可以使用 SELECT 存取表格,以將其內容傳輸到用戶端主機。

  • GRANT OPTION 允許使用者將其權限授予其他使用者。兩個具有不同權限且具有 GRANT OPTION 權限的使用者能夠合併權限。

  • ALTER 可以透過重新命名表格來顛覆權限系統。

  • SHUTDOWN 可能會被濫用,透過終止伺服器完全拒絕其他使用者的服務。

  • PROCESS 可用於檢視目前正在執行的陳述式的純文字,包括設定或變更密碼的陳述式。

  • SUPER 可用於終止其他工作階段或變更伺服器的運作方式。

  • 針對 mysql 系統資料庫本身授予的權限可用於變更密碼和其他存取權限資訊

    • 密碼會加密儲存,因此惡意使用者無法僅讀取它們來得知純文字密碼。但是,具有 mysql.user 系統表格 authentication_string 資料行寫入權限的使用者可以變更帳戶的密碼,然後使用該帳戶連線至 MySQL 伺服器。

    • 針對 mysql 系統資料庫授予的 INSERTUPDATE 分別允許使用者新增或修改現有權限。

    • 針對 mysql 系統資料庫的 DROP 允許使用者移除權限表格,甚至是資料庫本身。

靜態與動態權限

MySQL 支援靜態和動態權限

  • 靜態權限是內建於伺服器中的。它們始終可用於授予使用者帳戶,且無法取消註冊。

  • 動態權限可以在執行階段註冊和取消註冊。這會影響它們的可用性:尚未註冊的動態權限無法授予。

例如,SELECTINSERT 權限是靜態的且始終可用,而動態權限只有在啟用實作該權限的元件時才可用。

本節的其餘部分說明動態權限在 MySQL 中的運作方式。討論中使用術語 元件,但同樣適用於外掛程式。

注意

伺服器管理員應了解哪些伺服器元件定義了動態權限。對於 MySQL 發行版本,定義動態權限的元件文件會描述這些權限。

第三方組件也可能定義動態權限;管理員應理解這些權限,並且不應安裝可能衝突或損害伺服器運作的組件。例如,如果兩個組件定義了相同名稱的權限,則會發生衝突。組件開發人員可以透過選擇以組件名稱為前綴的權限名稱,來降低這種情況發生的可能性。

伺服器在記憶體中內部維護已註冊的動態權限集合。取消註冊會在伺服器關閉時發生。

通常,定義動態權限的組件會在安裝時,在其初始化序列期間註冊它們。當解除安裝時,組件不會取消註冊其已註冊的動態權限。(這是目前的做法,而非要求。也就是說,組件可以但實際上並沒有在任何時間取消註冊它們所註冊的權限。)

嘗試註冊已註冊的動態權限時,不會出現警告或錯誤。請考慮以下陳述順序

INSTALL COMPONENT 'my_component';
UNINSTALL COMPONENT 'my_component';
INSTALL COMPONENT 'my_component';

第一個 INSTALL COMPONENT 陳述式會註冊組件 my_component 定義的所有權限,但 UNINSTALL COMPONENT 不會取消註冊它們。對於第二個 INSTALL COMPONENT 陳述式,它註冊的組件權限會被發現已經註冊,但不會出現警告或錯誤。

動態權限僅在全域層級應用。伺服器將目前指派給使用者帳戶的動態權限相關資訊儲存在 mysql.global_grants 系統表中。

  • 伺服器會在伺服器啟動期間自動註冊 global_grants 中命名的權限(除非給定 --skip-grant-tables 選項)。

  • GRANTREVOKE 陳述式會修改 global_grants 的內容。

  • global_grants 中列出的動態權限指派是持久性的。它們不會在伺服器關閉時移除。

範例:以下陳述式將在副本上控制複製(包括群組複製)所需的權限授予使用者 u1,並允許修改系統變數

GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN
ON *.* TO 'u1'@'localhost';

已授與的動態權限會出現在 SHOW GRANTS 陳述式和 INFORMATION_SCHEMA USER_PRIVILEGES 表格的輸出中。

對於全域層級的 GRANTREVOKE,任何未被識別為靜態的命名權限都會針對目前已註冊的動態權限集合進行檢查,如果找到則會授與。否則,會發生錯誤,表示未知的權限識別碼。

對於 GRANTREVOKE,全域層級的 ALL [PRIVILEGES] 的含義包括所有靜態全域權限,以及所有目前已註冊的動態權限

  • 全域層級的 GRANT ALL 會授與所有靜態全域權限和所有目前已註冊的動態權限。在執行 GRANT 陳述式之後註冊的動態權限不會追溯授予任何帳戶。

  • 全域層級的 REVOKE ALL 會撤銷所有已授與的靜態全域權限和所有已授與的動態權限。

FLUSH PRIVILEGES 陳述式會讀取 global_grants 表格以取得動態權限指派,並註冊在那裡找到的任何未註冊權限。

有關 MySQL 伺服器和 MySQL 發行版中包含的組件所提供的動態權限描述,請參閱第 8.2.2 節,「MySQL 提供的權限」

將帳戶從 SUPER 遷移到動態權限

在 MySQL 8.4 中,許多先前需要 SUPER 權限的操作也與範圍更受限的動態權限相關聯。(有關這些權限的描述,請參閱 第 8.2.2 節,「MySQL 提供的權限」。)透過授予相關聯的動態權限而不是 SUPER,可以允許帳戶執行每個此類操作。此變更透過使 DBA 能夠避免授予 SUPER 並更精確地客製化使用者權限來提高安全性。SUPER 現在已棄用;預計會在未來版本的 MySQL 中移除。

當移除 SUPER 時,除非將已授予 SUPER 的帳戶遷移到適當的動態權限,否則先前需要 SUPER 的操作會失敗。請使用以下說明來完成該目標,以便在移除 SUPER 之前,帳戶已準備就緒

  1. 執行此查詢以識別已授予 SUPER 的帳戶

    SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES
    WHERE PRIVILEGE_TYPE = 'SUPER';
  2. 對於先前查詢識別的每個帳戶,請判斷它需要 SUPER 的操作。然後授予與這些操作對應的動態權限,並撤銷 SUPER

    例如,如果 'u1'@'localhost' 需要 SUPER 以進行二進位日誌清除和系統變數修改,則這些陳述式會對帳戶進行必要的變更

    GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'u1'@'localhost';
    REVOKE SUPER ON *.* FROM 'u1'@'localhost';

    在您修改所有適用的帳戶之後,第一步中的 INFORMATION_SCHEMA 查詢應產生空的結果集。