授予 MySQL 帳戶的權限決定了該帳戶可以執行的操作。MySQL 權限在其應用上下文中以及在不同操作層級上有所不同。
管理權限允許使用者管理 MySQL 伺服器的操作。這些權限是全域的,因為它們不特定於特定的資料庫。
資料庫權限適用於資料庫及其中的所有物件。這些權限可以授予特定資料庫,或全域授予,以便應用於所有資料庫。
資料庫物件(例如表格、索引、檢視和儲存的常式)的權限可以針對資料庫中的特定物件、資料庫中給定類型的所有物件(例如,資料庫中的所有表格)或全域地針對所有資料庫中給定類型的所有物件進行授予。
權限的差異還在於它們是靜態的(內建於伺服器中)還是動態的(在執行時定義)。權限是靜態還是動態會影響其授予使用者帳戶和角色的可用性。有關靜態權限和動態權限之間差異的資訊,請參閱靜態與動態權限。)
有關帳戶權限的資訊儲存在 mysql 系統資料庫中的授權表中。有關這些表格的結構和內容的描述,請參閱第 8.2.3 節「授權表」。MySQL 伺服器會在啟動時將授權表的內容讀入記憶體,並在第 8.2.13 節「權限變更何時生效」中指示的情況下重新載入。伺服器會根據授權表的記憶體內複本做出存取控制決策。
某些 MySQL 版本會變更授權表以新增新權限或功能。為了確保您可以利用任何新功能,請在每次升級 MySQL 時將您的授權表更新為目前的結構。請參閱第 3 章《升級 MySQL》。
以下各節總結了可用的權限,提供每個權限的更詳細描述,並提供使用指南。
下表顯示 GRANT 和 REVOKE 陳述式中使用的靜態權限名稱,以及授權表中與每個權限相關聯的欄位名稱和權限套用的內容。
表 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 |
「無權限」的同義詞 | 伺服器管理 |
下表顯示 GRANT 和 REVOKE 陳述式中使用的動態權限名稱,以及權限套用的內容。
表 8.3 用於 GRANT 和 REVOKE 的允許動態權限
靜態權限是內建於伺服器中的,與在執行階段定義的動態權限相反。以下清單描述 MySQL 中可用的每個靜態權限。
特定的 SQL 陳述式可能具有比此處指示更具體的權限要求。如果是這樣,相關陳述式的描述會提供詳細資訊。
這些權限規範是「在給定權限層級可用的所有權限」(除了
GRANT OPTION之外) 的簡寫。例如,在全域或資料表層級授予ALL會分別授予所有全域權限或所有資料表層級權限。啟用使用
ALTER TABLE陳述式來變更資料表的結構。ALTER TABLE也需要CREATE和INSERT權限。重新命名資料表需要舊資料表上的ALTER和DROP,以及新資料表上的CREATE和INSERT。啟用使用變更或刪除預存常式 (預存程序和函數) 的陳述式。對於屬於授予權限範圍內且使用者不是指定為常式
DEFINER的使用者之常式,也允許存取常式定義以外的常式屬性。啟用使用建立新資料庫和資料表的陳述式。
啟用使用
CREATE ROLE陳述式。(CREATE USER權限也啟用CREATE ROLE陳述式的使用。) 請參閱 第 8.2.10 節「使用角色」。CREATE ROLE和DROP ROLE權限不如CREATE USER強大,因為它們只能用於建立和刪除帳戶。它們不能像CREATE USER一樣用於修改帳戶屬性或重新命名帳戶。請參閱 使用者和角色互換性。啟用使用建立預存常式 (預存程序和函數) 的陳述式。對於屬於授予權限範圍內且使用者不是指定為常式
DEFINER的使用者之常式,也允許存取常式定義以外的常式屬性。啟用使用建立、變更或刪除表格空間和記錄檔群組的陳述式。
啟用使用
CREATE TEMPORARY TABLE陳述式來建立暫時資料表。在工作階段建立暫時資料表後,伺服器不會對該資料表執行進一步的權限檢查。建立工作階段可以對資料表執行任何作業,例如
DROP TABLE、INSERT、UPDATE或SELECT。如需詳細資訊,請參閱 第 15.1.20.2 節「CREATE TEMPORARY TABLE 陳述式」。啟用使用
ALTER USER、CREATE ROLE、CREATE USER、DROP ROLE、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES陳述式。啟用使用
CREATE VIEW陳述式。啟用從資料庫中的資料表刪除資料列。
啟用使用可刪除(移除)現有資料庫、表格和檢視表的語句。在分割表格上使用
ALTER TABLE ... DROP PARTITION語句時,需要DROP權限。TRUNCATE TABLE也需要DROP權限。啟用使用
DROP ROLE語句。(CREATE USER權限也啟用使用DROP ROLE語句。)請參閱 第 8.2.10 節「使用角色」。CREATE ROLE和DROP ROLE權限不如CREATE USER強大,因為它們只能用於建立和刪除帳戶。它們不能像CREATE USER一樣用於修改帳戶屬性或重新命名帳戶。請參閱 使用者和角色互換性。啟用使用可建立、修改、刪除或顯示事件排程器的事件的語句。
啟用使用可執行預存常式(預存程序和函數)的語句。對於落在授予權限範圍內且使用者並非指定為常式
DEFINER的使用者,也啟用存取常式屬性(常式定義除外)。影響下列操作和伺服器行為
啟用使用
LOAD DATA和SELECT ... INTO OUTFILE語句以及LOAD_FILE()函數,在伺服器主機上讀取和寫入檔案。具有FILE權限的使用者可以讀取伺服器主機上任何可供公開讀取或可供 MySQL 伺服器讀取的檔案。(這表示使用者可以讀取任何資料庫目錄中的任何檔案,因為伺服器可以存取任何這些檔案。)啟用在 MySQL 伺服器具有寫入權限的任何目錄中建立新檔案。這包括伺服器的資料目錄,其中包含實作權限表格的檔案。
啟用針對
CREATE TABLE語句使用DATA DIRECTORY或INDEX DIRECTORY表格選項。
作為安全措施,伺服器不會覆寫現有檔案。
若要限制可以讀取和寫入檔案的位置,請將
secure_file_priv系統變數設定為特定目錄。請參閱 第 7.1.8 節「伺服器系統變數」。讓您可以將您自己擁有的權限授予或撤銷其他使用者。
啟用使用可建立或刪除(移除)索引的語句。
INDEX適用於現有表格。如果您具有表格的CREATE權限,則可以在CREATE TABLE語句中包含索引定義。啟用將資料列插入資料庫中的表格。
INSERT也適用於ANALYZE TABLE、OPTIMIZE TABLE和REPAIR TABLE表格維護語句。啟用使用明確的
LOCK TABLES語句來鎖定您具有SELECT權限的表格。這包括使用寫入鎖定,這會防止其他工作階段讀取鎖定的表格。PROCESS權限控制對伺服器內執行之執行緒資訊的存取(也就是關於工作階段正在執行之語句的資訊)。使用SHOW PROCESSLIST語句、mysqladmin processlist 命令、資訊綱要PROCESSLIST表格和效能綱要processlist表格可用的執行緒資訊如下注意效能綱要
threads表格也提供執行緒資訊,但表格存取使用不同的權限模型。請參閱 第 29.12.22.8 節「threads 表格」。PROCESS權限也啟用使用SHOW ENGINE語句,存取INFORMATION_SCHEMAInnoDB表格(名稱以INNODB_開頭的表格),以及存取INFORMATION_SCHEMAFILES表格。啟用一個使用者偽裝或變為另一個使用者。請參閱 第 8.2.19 節「Proxy 使用者」。
建立外部索引鍵限制需要父表格的
REFERENCES權限。RELOAD啟用下列操作使用
FLUSH語句。使用 mysqladmin 命令,這些命令等同於
FLUSH操作:flush-hosts、flush-logs、flush-privileges、flush-status、flush-tables、refresh和reload。reload命令會告訴伺服器將授權表格重新載入記憶體。flush-privileges是reload的同義詞。refresh命令會關閉並重新開啟記錄檔,並刷新所有表格。其他flush-命令會執行類似xxxrefresh的功能,但更具體且在某些情況下可能更適合。例如,如果您只想刷新記錄檔,flush-logs會是比refresh更好的選擇。使用 mysqldump 選項,這些選項會執行各種
FLUSH操作:--flush-logs和--source-data。使用
RESET BINARY LOGS AND GTIDS和RESET REPLICA語句。
啟用使用
SHOW BINARY LOG STATUS、SHOW REPLICA STATUS和SHOW BINARY LOGS語句。啟用帳戶使用
SHOW REPLICAS、SHOW RELAYLOG EVENTS和SHOW BINLOG EVENTS語句,請求對複寫來源伺服器上的資料庫進行的更新。使用 mysqlbinlog 選項--read-from-remote-server(-R) 和--read-from-remote-source也需要此權限。將此權限授予複本用來連線到目前伺服器做為其複寫來源伺服器的帳戶。允許從資料庫的表格中選取資料列。
SELECT陳述式只有在實際存取表格時才需要SELECT權限。某些SELECT陳述式不會存取表格,因此可以在沒有任何資料庫權限的情況下執行。例如,您可以使用SELECT作為簡單的計算機,來評估不參考表格的運算式。SELECT 1+1; SELECT PI()*2;其他讀取欄位值的陳述式也需要
SELECT權限。例如,在UPDATE陳述式中,col_name=expr指定的右側所參考的欄位,或在DELETE或UPDATE陳述式的WHERE子句中指定的欄位,都需要SELECT權限。允許帳戶透過執行
SHOW DATABASE陳述式來查看資料庫名稱。沒有此權限的帳戶只能看到他們具有某些權限的資料庫,如果伺服器啟動時使用了--skip-show-database選項,則完全無法使用此陳述式。注意因為任何靜態的全域權限都被視為所有資料庫的權限,所以任何靜態的全域權限都允許使用者透過
SHOW DATABASES或檢查INFORMATION_SCHEMA的SCHEMATA表格來查看所有資料庫名稱,但已透過部分撤銷在資料庫層級限制的資料庫除外。允許使用
SHOW CREATE VIEW陳述式。使用EXPLAIN的檢視表也需要此權限。允許使用
SHUTDOWN和RESTART陳述式、mysqladmin shutdown 命令,以及mysql_shutdown()C API 函數。SUPER是一種強大且影響深遠的權限,不應輕易授予。如果帳戶只需要執行SUPER操作的子集,則可以透過授予一個或多個動態權限來實現所需的權限集,每個動態權限都賦予更有限的功能。請參閱動態權限描述。注意SUPER已被棄用,您應該預期它會在未來版本的 MySQL 中移除。請參閱將帳戶從 SUPER 移轉到動態權限。SUPER會影響以下操作和伺服器行為允許在執行階段變更系統變數
允許使用
SET GLOBAL和SET PERSIST來變更全域系統變數的伺服器組態。對應的動態權限是
SYSTEM_VARIABLES_ADMIN。允許設定需要特殊權限的受限工作階段系統變數。
對應的動態權限是
SESSION_VARIABLES_ADMIN。
另請參閱第 7.1.9.1 節「系統變數權限」。
允許變更全域交易特性(請參閱第 15.3.7 節「SET TRANSACTION 陳述式」)。
對應的動態權限是
SYSTEM_VARIABLES_ADMIN。允許帳戶啟動和停止複寫,包括群組複寫。
對應的動態權限是常規複寫的
REPLICATION_SLAVE_ADMIN,以及群組複寫的GROUP_REPLICATION_ADMIN。允許使用
CHANGE REPLICATION SOURCE TO和CHANGE REPLICATION FILTER陳述式。對應的動態權限是
REPLICATION_SLAVE_ADMIN。允許透過
PURGE BINARY LOGS和BINLOG陳述式來控制二進位記錄。對應的動態權限是
BINLOG_ADMIN。允許在執行檢視表或預存程式時設定有效的授權 ID。具有此權限的使用者可以在檢視表或預存程式的
DEFINER屬性中指定任何帳戶。對應的動態權限是
SET_ANY_DEFINER和ALLOW_NONEXISTENT_DEFINER。允許使用
CREATE SERVER、ALTER SERVER和DROP SERVER陳述式。允許使用 mysqladmin debug 命令。
允許
InnoDB加密金鑰輪換。對應的動態權限是
ENCRYPTION_KEY_ADMIN。允許執行版本符記函式。
對應的動態權限是
VERSION_TOKEN_ADMIN。允許授予和撤銷角色、使用
GRANT陳述式的WITH ADMIN OPTION子句,以及ROLES_GRAPHML()函式結果中的非空白<graphml>元素內容。對應的動態權限是
ROLE_ADMIN。允許控制非
SUPER帳戶不允許的用戶端連線允許使用
KILL陳述式或 mysqladmin kill 命令來終止屬於其他帳戶的執行緒。(帳戶始終可以終止自己的執行緒。)當
SUPER用戶端連線時,伺服器不會執行init_connect系統變數內容。即使達到
max_connections系統變數設定的連線限制,伺服器也會接受來自SUPER用戶端的一個連線。處於離線模式的伺服器(啟用
offline_mode)不會在下一個用戶端請求時終止SUPER用戶端連線,並且會接受來自SUPER用戶端的新連線。即使啟用
read_only系統變數,也可以執行更新。這適用於明確的表格更新,以及使用帳戶管理陳述式(例如GRANT和REVOKE)隱含更新表格。
前面提到的連線控制操作的對應動態權限是
CONNECTION_ADMIN。
如果啟用了二進位記錄,您可能還需要
SUPER權限來建立或變更預存函式,如第 27.7 節「預存程式二進位記錄」中所述。允許觸發程序操作。您必須擁有表格的此權限,才能建立、刪除、執行或顯示該表格的觸發程序。
當觸發程序被啟動時(由具有執行與觸發程序相關聯之表格的
INSERT、UPDATE或DELETE陳述式權限的使用者),觸發程序執行需要定義觸發程序的使用者仍然擁有該表格的TRIGGER權限。允許在資料庫的表格中更新資料列。
此權限指定符代表 「無權限」。它在全域層級與
GRANT一起使用,以指定諸如WITH GRANT OPTION的子句,而無需在權限清單中指定特定的帳戶權限。SHOW GRANTS會顯示USAGE,以表示帳戶在權限層級上沒有任何權限。
動態權限是在執行階段定義的,與伺服器內建的靜態權限不同。以下清單描述了 MySQL 中可用的每個動態權限。
大多數動態權限在伺服器啟動時定義。其他權限由特定的元件或外掛程式定義,如權限描述中所述。在這種情況下,除非啟用定義它的元件或外掛程式,否則權限不可用。
特定的 SQL 陳述式可能具有比此處指示更具體的權限要求。如果是這樣,相關陳述式的描述會提供詳細資訊。
啟用覆寫安全檢查,這些檢查旨在防止(可能無意中)導致儲存的物件成為孤立物件,或導致採用目前為孤立的儲存物件的操作。如果沒有此權限,任何嘗試產生孤立的 SQL 程序、函數或視圖的操作都會導致錯誤。使用
CREATE PROCEDURE、CREATE FUNCTION、CREATE TRIGGER、CREATE EVENT或CREATE VIEW產生孤立物件的嘗試,除了ALLOW_NONEXISTENT_DEFINER之外,還需要SET_ANY_DEFINER,以便允許與目前使用者不同的定義者。有關詳細資訊,請參閱 孤立儲存物件。
對於雙重密碼功能,此權限允許對您自己的帳戶使用
ALTER USER和SET PASSWORD陳述式的RETAIN CURRENT PASSWORD和DISCARD OLD PASSWORD子句。此權限是操作您自己的第二密碼所必需的,因為大多數使用者只需要一個密碼。如果要允許帳戶操作所有帳戶的第二密碼,則應授予其
CREATE USER權限,而不是APPLICATION_PASSWORD_ADMIN。有關雙重密碼使用的更多資訊,請參閱 第 8.2.15 節「密碼管理」。
允許稽核日誌篩選器中 「中止」 項目所封鎖的查詢。此權限由
audit_log外掛程式定義;請參閱 第 8.4.5 節「MySQL Enterprise Audit」。使用
SYSTEM_USER權限建立的帳戶會在建立時自動被指派AUDIT_ABORT_EXEMPT權限。當您執行升級程序時,如果沒有現有帳戶被指派該權限,則AUDIT_ABORT_EXEMPT權限也會被指派給具有SYSTEM_USER權限的現有帳戶。因此,具有SYSTEM_USER權限的帳戶可用於在稽核設定錯誤後重新取得系統的存取權。啟用稽核日誌組態。此權限由
audit_log外掛程式定義;請參閱 第 8.4.5 節「MySQL Enterprise Audit」。允許執行
LOCK INSTANCE FOR BACKUP陳述式並存取效能綱要log_status表格。注意除了
BACKUP_ADMIN之外,存取log_status表格也需要SELECT權限。當從較早的版本執行就地升級至 MySQL 8.4 時,具有
RELOAD權限的使用者會自動被授予BACKUP_ADMIN權限。authentication_policy系統變數對CREATE USER和ALTER USER陳述式的驗證相關子句的使用方式施加某些限制。具有AUTHENTICATION_POLICY_ADMIN權限的使用者不受這些限制的約束。(對於否則不允許的陳述式,會出現警告)。有關
authentication_policy所施加的限制的詳細資訊,請參閱該變數的說明。允許透過
PURGE BINARY LOGS和BINLOG陳述式來控制二進位記錄。啟用設定系統變數
binlog_encryption,以啟用或停用二進位記錄檔和中繼記錄檔的加密。此功能不是由BINLOG_ADMIN、SYSTEM_VARIABLES_ADMIN或SESSION_VARIABLES_ADMIN權限提供的。相關的系統變數binlog_rotate_encryption_master_key_at_startup會在伺服器重新啟動時自動輪換二進位記錄主金鑰,不需要此權限。允許執行
CLONE陳述式。包括BACKUP_ADMIN和SHUTDOWN權限。允許使用
KILL陳述式或 mysqladmin kill 命令來終止屬於其他帳戶的執行緒。(帳戶始終可以終止自己的執行緒。)允許設定與用戶端連線相關的系統變數,或規避與用戶端連線相關的限制。
CONNECTION_ADMIN是啟用 MySQL 伺服器離線模式所必需的,方法是將offline_mode系統變數的值變更為ON。CONNECTION_ADMIN權限允許具有此權限的管理員繞過這些系統變數的效果。init_connect:當CONNECTION_ADMIN用戶端連線時,伺服器不會執行init_connect系統變數內容。max_connections:即使達到max_connections系統變數設定的連線限制,伺服器也會接受來自CONNECTION_ADMIN用戶端的一個連線。offline_mode:處於離線模式的伺服器(啟用offline_mode)不會在下一個用戶端請求時終止CONNECTION_ADMIN用戶端連線,並接受來自CONNECTION_ADMIN用戶端的新連線。read_only:即使啟用read_only系統變數,也可以執行來自CONNECTION_ADMIN用戶端的更新。這適用於明確的表格更新,以及隱式更新表格的帳戶管理陳述式,例如GRANT和REVOKE。
群組複寫群組成員需要
CONNECTION_ADMIN權限,以便在其中一個相關伺服器置於離線模式時,不會終止群組複寫連線。如果使用 MySQL 通訊堆疊(group_replication_communication_stack = MYSQL),如果沒有此權限,則置於離線模式的成員會被逐出群組。允許
InnoDB加密金鑰輪換。允許使用者管理任何使用者的防火牆規則。此權限由
MYSQL_FIREWALL外掛程式定義;請參閱 第 8.4.7 節「MySQL Enterprise Firewall」。具有此權限的使用者不受防火牆限制的約束。此權限由
MYSQL_FIREWALL外掛程式定義;請參閱 第 8.4.7 節「MySQL Enterprise Firewall」。允許使用者更新自己的防火牆規則。此權限由
MYSQL_FIREWALL外掛程式定義;請參閱第 8.4.7 節「MySQL Enterprise Firewall」。允許使用
FLUSH OPTIMIZER_COSTS陳述式。允許使用
FLUSH PRIVILEGES陳述式。允許使用
FLUSH STATUS陳述式。允許使用
FLUSH TABLES陳述式。允許使用
FLUSH USER_RESOURCES陳述式。允許帳戶使用
START GROUP REPLICATION和STOP GROUP REPLICATION陳述式來啟動和停止群組複寫,變更group_replication_consistency系統變數的全域設定,以及使用group_replication_set_write_concurrency()和group_replication_set_communication_protocol()函數。將此權限授予用於管理複寫群組成員伺服器的帳戶。允許使用者帳戶用於建立群組複寫的群組通訊連線。當 MySQL 通訊堆疊用於群組複寫時,必須將此權限授予復原使用者 (
group_replication_communication_stack=MYSQL)。允許帳戶啟動和停用 redo 日誌歸檔。
允許使用
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG陳述式來啟用或停用 redo 日誌記錄。請參閱停用 Redo 日誌記錄。
允許帳戶使用
masking_dictionary_term_add()和masking_dictionary_term_remove()組件函數來新增和移除字典詞彙。帳戶也需要此動態權限,才能使用masking_dictionary_remove()函數來移除完整的字典,此函數會移除目前位於mysql.masking_dictionaries資料表中與命名字典相關的所有詞彙。請參閱第 8.5 節「MySQL Enterprise Data Masking and De-Identification」。
允許在給定的 NDB 叢集中,使用者或角色及其權限在所有已啟用
NDB的 MySQL 伺服器加入時,立即進行共用和同步。只有在啟用NDB儲存引擎時,此權限才可用。對給定使用者或角色所做的任何權限變更或撤銷,都會立即與所有已連線的 MySQL 伺服器 (SQL 節點) 同步。您應該注意,無法保證來自不同 SQL 節點的多個影響權限的陳述式,會以相同的順序在所有 SQL 節點上執行。因此,強烈建議所有使用者管理都應從單一指定的 SQL 節點執行。
NDB_STORED_USER是一個全域權限,必須使用ON *.*授予或撤銷。嘗試為此權限設定任何其他範圍都會導致錯誤。此權限可以授予給大多數應用程式和管理使用者,但不能授予給系統保留帳戶,例如mysql.session@localhost或mysql.infoschema@localhost。已授予
NDB_STORED_USER權限的使用者會儲存在NDB中 (因此會由所有 SQL 節點共用),具有此權限的角色也是如此。僅授予具有NDB_STORED_USER權限的角色使用者,不會儲存在NDB中;每個儲存的NDB使用者都必須明確授予此權限。有關此功能在
NDB中如何運作的更多詳細資訊,請參閱第 25.6.13 節「權限同步和 NDB_STORED_USER」。允許使用
OPTIMIZE LOCAL TABLE和OPTIMIZE NO_WRITE_TO_BINLOG TABLE陳述式。此權限適用於無密碼使用者帳戶
對於帳戶建立,執行
CREATE USER以建立無密碼帳戶的使用者,必須具備PASSWORDLESS_USER_ADMIN權限。在複寫環境中,
PASSWORDLESS_USER_ADMIN權限適用於複寫使用者,並允許複寫針對設定為無密碼驗證的使用者帳戶的ALTER USER ... MODIFY陳述式。
有關無密碼驗證的資訊,請參閱WebAuthn 無密碼驗證。
對於也具有
SYSTEM_VARIABLES_ADMIN的使用者,PERSIST_RO_VARIABLES_ADMIN允許使用SET PERSIST_ONLY將全域系統變數永久儲存到資料目錄中的mysqld-auto.cnf選項檔案。此陳述式類似於SET PERSIST,但不修改執行階段的全域系統變數值。這使得SET PERSIST_ONLY適用於配置僅能在伺服器啟動時設定的唯讀系統變數。另請參閱第 7.1.9.1 節「系統變數權限」。
允許帳戶充當複寫通道的
PRIVILEGE_CHECKS_USER,並在 mysqlbinlog 輸出中執行BINLOG陳述式。將此權限授予使用CHANGE REPLICATION SOURCE TO指派的帳戶,以便為複寫通道提供安全性內容,並處理這些通道上的複寫錯誤。除了REPLICATION_APPLIER權限之外,您還必須給予該帳戶執行複寫通道接收或包含在 mysqlbinlog 輸出中的交易所需的權限,例如更新受影響的資料表。如需更多資訊,請參閱第 19.3.3 節「複寫權限檢查」。允許帳戶連線至複製來源伺服器,並使用
START REPLICA和STOP REPLICA陳述式來啟動和停止複製,並使用CHANGE REPLICATION SOURCE TO和CHANGE REPLICATION FILTER陳述式。將此權限授予作為複本連線至目前伺服器作為其複製來源伺服器的帳戶。此權限不適用於群組複製;請改用GROUP_REPLICATION_ADMIN。啟用資源群組管理,包括建立、變更和刪除資源群組,以及將執行緒和陳述式指派給資源群組。擁有此權限的使用者可以執行與資源群組相關的任何操作。
啟用將執行緒和陳述式指派給資源群組。擁有此權限的使用者可以使用
SET RESOURCE GROUP陳述式和RESOURCE_GROUP最佳化器提示。啟用授予和撤銷角色、使用
GRANT陳述式的WITH ADMIN OPTION子句,以及ROLES_GRAPHML()函數結果中的非空<graphml>元素內容。設定mandatory_roles系統變數的值是必要的。允許持有者在 Performance Schema 表格
global_variables、session_variables、variables_by_thread和persisted_variables中檢視敏感系統變數的值,發出SELECT陳述式以傳回它們的值,並追蹤連線的階段作業追蹤器中對它們的變更。沒有此權限的使用者無法檢視或追蹤這些系統變數值。請參閱 持久化敏感系統變數。啟用連線至僅允許管理連線的網路介面(請參閱 第 7.1.12.1 節,「連線介面」)。
對於大多數系統變數,設定階段作業值不需要特殊權限,任何使用者都可以執行以影響目前的階段作業。對於某些系統變數,設定階段作業值可能會對目前階段作業之外產生影響,因此這是一個受限制的操作。對於這些變數,
SESSION_VARIABLES_ADMIN權限允許使用者設定階段作業值。如果系統變數受到限制,並且需要特殊權限才能設定階段作業值,則變數描述會指出該限制。範例包括
binlog_format、sql_log_bin和sql_log_off。SESSION_VARIABLES_ADMIN權限是SYSTEM_VARIABLES_ADMIN和SUPER權限的子集。擁有其中一個權限的使用者也允許設定受限制的階段作業變數,並且實際上擁有SESSION_VARIABLES_ADMIN,因此不需要明確授予SESSION_VARIABLES_ADMIN。另請參閱第 7.1.9.1 節「系統變數權限」。
啟用在執行檢視或預存程式時設定有效的授權 ID。擁有此權限的使用者可以指定任何帳戶作為
CREATE PROCEDURE、CREATE FUNCTION、CREATE TRIGGER、CREATE EVENT、ALTER EVENT、CREATE VIEW和ALTER VIEW的DEFINER屬性。如果沒有此權限,則只能指定有效的驗證 ID。預存程式會以指定帳戶的權限執行,因此請務必遵循 第 27.6 節,「預存物件存取控制」中列出的風險最小化指南。
允許使用者存取所有預存常式(預存程序和函數)的定義和屬性,即使使用者未被指定為常式
DEFINER。此存取包括Information Schema
ROUTINES表格的內容。
可以將
SHOW_ROUTINE授予為具有更受限範圍的權限,允許存取常式定義。(也就是說,管理員可以從不需要的其他使用者撤銷全域SELECT,並改為授予SHOW_ROUTINE。)這允許帳戶備份預存常式,而不需要廣泛的權限。具有此權限的使用者發出的查詢不受
Rewriter外掛程式重新撰寫的影響(請參閱 第 7.6.4 節,「Rewriter 查詢重新撰寫外掛程式」)。此權限應授予發出不應被重新撰寫的管理或控制陳述式的使用者,以及用於套用來自複製來源的陳述式的
PRIVILEGE_CHECKS_USER帳戶(請參閱 第 19.3.3 節,「複製權限檢查」)。SYSTEM_USER權限將系統使用者與一般使用者區分開來擁有
SYSTEM_USER權限的使用者是系統使用者。沒有
SYSTEM_USER權限的使用者是一般使用者。
SYSTEM_USER權限會影響給定使用者可以將其其他權限套用至的帳戶,以及使用者是否受到其他帳戶的保護系統使用者可以修改系統帳戶和一般帳戶。也就是說,如果使用者擁有對一般帳戶執行給定操作的適當權限,則擁有
SYSTEM_USER會使其能夠對系統帳戶執行該操作。系統帳戶只能由擁有適當權限的系統使用者修改,而不能由一般使用者修改。擁有適當權限的一般使用者可以修改一般帳戶,但不能修改系統帳戶。系統帳戶和一般帳戶都可以由擁有適當權限的系統使用者和一般使用者修改。
這也表示,擁有
SYSTEM_USER權限的使用者所建立的資料庫物件,若其他使用者沒有此權限,則無法修改或刪除。這也適用於定義者具有此權限的常式。如需更多資訊,請參閱第 8.2.11 節「帳戶類別」。
SYSTEM_USER權限賦予系統帳戶的保護,使其免受一般帳戶修改,但不適用於在mysql系統綱要上擁有權限的一般帳戶,因此可以修改該綱要中的授權表。為了獲得全面保護,請勿將mysql綱要權限授予一般帳戶。請參閱保護系統帳戶免受一般帳戶操縱。如果正在使用
audit_log外掛程式(請參閱第 8.4.5 節「MySQL Enterprise Audit」),則擁有SYSTEM_USER權限的帳戶會自動被指派AUDIT_ABORT_EXEMPT權限,即使篩選器中設定的 「中止」項目會阻止查詢,也允許執行其查詢。因此,擁有SYSTEM_USER權限的帳戶可以用於在稽核設定錯誤後重新獲得系統存取權。影響下列操作和伺服器行為
允許在執行階段變更系統變數
允許使用
SET GLOBAL和SET PERSIST來變更全域系統變數的伺服器組態。如果使用者也擁有
PERSIST_RO_VARIABLES_ADMIN,則允許使用SET PERSIST_ONLY來變更全域系統變數的伺服器組態。允許設定需要特殊權限的受限工作階段系統變數。實際上,
SYSTEM_VARIABLES_ADMIN隱含SESSION_VARIABLES_ADMIN,而無需明確授予SESSION_VARIABLES_ADMIN。
另請參閱第 7.1.9.1 節「系統變數權限」。
允許變更全域交易特性(請參閱第 15.3.7 節「SET TRANSACTION 陳述式」)。
當啟用
table_encryption_privilege_check時,允許使用者覆寫預設的加密設定;請參閱為綱要和一般表空間定義加密預設值。允許遙測日誌組態。此權限由
telemetry_log外掛程式定義,該外掛程式透過 AWS 上的 HeatWave 部署。允許以特權連線連線至伺服器。當達到
thread_pool_max_transactions_limit定義的限制時,不允許新的連線,除非被thread_pool_longrun_trx_limit覆寫。特權連線會忽略交易限制,並允許連線至伺服器以提高交易限制、移除限制或終止執行中的交易。預設情況下,不會將此權限授予任何使用者。若要建立特權連線,起始連線的使用者必須具有TP_CONNECTION_ADMIN權限。當達到
thread_pool_max_transactions_limit定義的限制時,特權連線可以執行陳述式並啟動交易。特權連線會放置在Admin執行緒群組中。請參閱特權連線。必須在複寫來源伺服器上將
gtid_next系統變數設定為AUTOMATIC:或TAGUUID:。此外,至少需要TAG:NUMBERSYSTEM_VARIABLES_ADMIN、SESSION_VARIABLES_ADMIN或REPLICATION_APPLIER其中之一,才能在來源上將gtid_next設定為這些值之一。REPLICATION_CHECKS_APPLIER也必須具有此權限以及REPLICATION_APPLIER權限,才能將gtid_next設定為AUTOMATIC:。這會在啟動複寫應用程式執行緒時檢查。TAG設定
gtid_purged伺服器系統變數也需要此權限。如需有關使用已標記 GTID 的更多資訊,請參閱
gtid_next的描述,以及第 19.1.4 節「在線上伺服器上變更 GTID 模式」。允許執行版本符記函式。此權限由
version_tokens外掛程式定義;請參閱第 7.6.6 節「版本符記」。允許執行
XA RECOVER陳述式;請參閱第 15.3.8.1 節「XA 交易 SQL 陳述式」。在 MySQL 8.4 之前,任何使用者都可以執行
XA RECOVER陳述式,以發現未完成的已備妥 XA 交易的 XID 值,這可能會導致由起始 XA 交易的使用者以外的使用者來認可或復原 XA 交易。在 MySQL 8.4 中,僅允許擁有XA_RECOVER_ADMIN權限的使用者使用XA RECOVER,預期僅將該權限授予有需要的管理使用者。例如,XA 應用程式的管理員如果應用程式已當機,並且需要找出應用程式啟動的未完成交易,以便可以復原這些交易,就可能需要此權限。此權限需求可防止使用者發現自己以外的未完成備妥 XA 交易的 XID 值。它不會影響 XA 交易的正常認可或復原,因為啟動交易的使用者知道其 XID。
僅將帳戶需要的權限授予該帳戶是個好主意。在授予 FILE 和管理權限時,您應格外謹慎
FILE可能會被濫用,以將 MySQL 伺服器可以在伺服器主機上讀取的任何檔案讀取到資料庫表中。這包括所有可供全球讀取的檔案以及伺服器資料目錄中的檔案。然後可以使用SELECT存取表格,以將其內容傳輸到用戶端主機。GRANT OPTION允許使用者將其權限授予其他使用者。兩個具有不同權限且具有GRANT OPTION權限的使用者能夠合併權限。ALTER可以透過重新命名表格來顛覆權限系統。SHUTDOWN可能會被濫用,透過終止伺服器完全拒絕其他使用者的服務。PROCESS可用於檢視目前正在執行的陳述式的純文字,包括設定或變更密碼的陳述式。SUPER可用於終止其他工作階段或變更伺服器的運作方式。針對
mysql系統資料庫本身授予的權限可用於變更密碼和其他存取權限資訊
MySQL 支援靜態和動態權限
靜態權限是內建於伺服器中的。它們始終可用於授予使用者帳戶,且無法取消註冊。
動態權限可以在執行階段註冊和取消註冊。這會影響它們的可用性:尚未註冊的動態權限無法授予。
例如,SELECT 和 INSERT 權限是靜態的且始終可用,而動態權限只有在啟用實作該權限的元件時才可用。
本節的其餘部分說明動態權限在 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選項)。global_grants中列出的動態權限指派是持久性的。它們不會在伺服器關閉時移除。
範例:以下陳述式將在副本上控制複製(包括群組複製)所需的權限授予使用者 u1,並允許修改系統變數
GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN
ON *.* TO 'u1'@'localhost';已授與的動態權限會出現在 SHOW GRANTS 陳述式和 INFORMATION_SCHEMA USER_PRIVILEGES 表格的輸出中。
對於全域層級的 GRANT 和 REVOKE,任何未被識別為靜態的命名權限都會針對目前已註冊的動態權限集合進行檢查,如果找到則會授與。否則,會發生錯誤,表示未知的權限識別碼。
對於 GRANT 和 REVOKE,全域層級的 ALL [PRIVILEGES] 的含義包括所有靜態全域權限,以及所有目前已註冊的動態權限
全域層級的
GRANT ALL會授與所有靜態全域權限和所有目前已註冊的動態權限。在執行GRANT陳述式之後註冊的動態權限不會追溯授予任何帳戶。全域層級的
REVOKE ALL會撤銷所有已授與的靜態全域權限和所有已授與的動態權限。
FLUSH PRIVILEGES 陳述式會讀取 global_grants 表格以取得動態權限指派,並註冊在那裡找到的任何未註冊權限。
有關 MySQL 伺服器和 MySQL 發行版中包含的組件所提供的動態權限描述,請參閱第 8.2.2 節,「MySQL 提供的權限」。
在 MySQL 8.4 中,許多先前需要 SUPER 權限的操作也與範圍更受限的動態權限相關聯。(有關這些權限的描述,請參閱 第 8.2.2 節,「MySQL 提供的權限」。)透過授予相關聯的動態權限而不是 SUPER,可以允許帳戶執行每個此類操作。此變更透過使 DBA 能夠避免授予 SUPER 並更精確地客製化使用者權限來提高安全性。SUPER 現在已棄用;預計會在未來版本的 MySQL 中移除。
當移除 SUPER 時,除非將已授予 SUPER 的帳戶遷移到適當的動態權限,否則先前需要 SUPER 的操作會失敗。請使用以下說明來完成該目標,以便在移除 SUPER 之前,帳戶已準備就緒
執行此查詢以識別已授予
SUPER的帳戶SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE PRIVILEGE_TYPE = 'SUPER';對於先前查詢識別的每個帳戶,請判斷它需要
SUPER的操作。然後授予與這些操作對應的動態權限,並撤銷SUPER。例如,如果
'u1'@'localhost'需要SUPER以進行二進位日誌清除和系統變數修改,則這些陳述式會對帳戶進行必要的變更GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'u1'@'localhost'; REVOKE SUPER ON *.* FROM 'u1'@'localhost';在您修改所有適用的帳戶之後,第一步中的
INFORMATION_SCHEMA查詢應產生空的結果集。