授予 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_priv |
表 |
插入 |
Insert_priv |
表或列 |
锁定表 |
Lock_tables_priv |
数据库 |
进程 |
Process_priv |
服务器管理 |
代理 |
参见 proxies_priv 表 |
服务器管理 |
引用 |
References_priv |
数据库或表 |
重新加载 |
Reload_priv |
服务器管理 |
复制客户端 |
Repl_client_priv |
服务器管理 |
复制从属 |
Repl_slave_priv |
服务器管理 |
选择 |
Select_priv |
表或列 |
显示数据库 |
Show_db_priv |
服务器管理 |
显示视图 |
Show_view_priv |
视图 |
关机 |
Shutdown_priv |
服务器管理 |
超级 |
Super_priv |
服务器管理 |
触发器 |
Trigger_priv |
表 |
更新 |
Update_priv |
表或列 |
使用 |
是 “无权限” 的同义词 | 服务器管理 |
下表显示了 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语句。启用从数据库中的表中删除行。
启用使用删除(移除)现有数据库、表和视图的语句。
DROP权限是使用ALTER TABLE ... DROP PARTITION语句在分区表上所必需的。DROP权限对于TRUNCATE TABLE也是必需的。启用使用
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 命令、Information SchemaPROCESSLIST表和 Performance Schemaprocesslist表访问线程信息,如下所示:注意Performance Schema
threads表也提供线程信息,但表访问使用不同的权限模型。请参见 第 29.12.22.8 节,“threads 表”。PROCESS权限还允许使用SHOW ENGINE语句、访问INFORMATION_SCHEMAInnoDB表(名称以INNODB_开头的表)以及访问INFORMATION_SCHEMAFILES表。允许一个用户模拟或成为另一个用户。请参见 第 8.2.19 节,“代理用户”。
创建外键约束需要对父表拥有
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权限也适用于读取列值的语句。例如,SELECT是在UPDATE语句中的col_name=expr赋值中引用的列的右侧或在DELETE或UPDATE语句的WHERE子句中命名的列所需的。允许帐户通过发出
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。
如 第 27.7 节,“存储程序二进制日志记录” 中所述,如果启用了二进制日志记录,您可能还需要
SUPER权限才能创建或更改存储函数。允许触发器操作。您必须对表具有此权限才能为该表创建、删除、执行或显示触发器。
当触发器被激活(由具有执行
INSERT、UPDATE或DELETE语句以访问与触发器关联的表的权限的用户激活)时,触发器执行需要定义触发器的用户仍然对该表具有TRIGGER权限。允许在数据库中的表中更新行。
此权限说明符代表 “无权限。”” 它在全局级别与
GRANT一起使用,以指定诸如WITH GRANT OPTION之类的子句,而无需在权限列表中命名特定的帐户权限。SHOW GRANTS显示USAGE以指示帐户在权限级别上没有权限。
与在服务器中内置的静态权限相比,动态权限是在运行时定义的。以下列表描述了 MySQL 中可用的每个动态权限。
大多数动态权限是在服务器启动时定义的。其他权限由特定组件或插件定义,如权限说明中所述。在这种情况下,除非定义该权限的组件或插件已启用,否则该权限不可用。
某些 SQL 语句可能具有比此处所示更具体的权限要求。如果是这样,则相应的语句描述将提供详细信息。
允许覆盖旨在防止可能(无意中)导致存储对象成为孤儿或导致采用当前是孤儿的存储对象的那些操作的安全检查。没有此权限,任何尝试生成孤儿 SQL 过程、函数或视图都会导致错误。使用
CREATE PROCEDURE、CREATE FUNCTION、CREATE TRIGGER、CREATE EVENT或CREATE VIEW生成孤儿对象还需要SET_ANY_DEFINER以及ALLOW_NONEXISTENT_DEFINER,以便允许与当前用户不同的定义者。有关详细信息,请参阅 孤儿存储对象。
对于双密码功能,此权限允许对适用于您自己帐户的
ALTER USER和SET PASSWORD语句使用RETAIN CURRENT PASSWORD和DISCARD OLD PASSWORD子句。此权限是操作您自己的辅助密码所必需的,因为大多数用户只需要一个密码。如果要允许帐户操作所有帐户的辅助密码,则应授予该帐户
CREATE USER权限,而不是APPLICATION_PASSWORD_ADMIN。有关使用双密码的更多信息,请参阅 第 8.2.15 节,“密码管理”。
允许审计日志过滤器中的 “abort” 项目阻止的查询。此权限由
audit_log插件定义;请参阅 第 8.4.5 节,“MySQL 企业审计”。使用
SYSTEM_USER权限创建的帐户在创建时会自动分配AUDIT_ABORT_EXEMPT权限。在执行升级过程时,如果现有的帐户没有分配该权限,则也会将AUDIT_ABORT_EXEMPT权限分配给具有SYSTEM_USER权限的现有帐户。因此,具有SYSTEM_USER权限的帐户可用于在审计错误配置后恢复对系统的访问。允许审计日志配置。此权限由
audit_log插件定义;请参阅 第 8.4.5 节,“MySQL 企业审计”。允许执行
LOCK INSTANCE FOR BACKUP语句并访问性能模式log_status表。注意除了
BACKUP_ADMIN之外,还需要对log_status表具有SELECT权限才能访问它。在将 MySQL 8.4 从早期版本就地升级时,
BACKUP_ADMIN权限会自动授予具有RELOAD权限的用户。系统变量
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 Server 的脱机模式,这可以通过将系统变量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 防火墙”。具有此权限的用户不受防火墙限制的约束。此权限由
MYSQL_FIREWALL插件定义;请参见 第 8.4.7 节,“MySQL Enterprise 防火墙”。启用用户更新自己的防火墙规则。此权限由
MYSQL_FIREWALL插件定义;请参见 第 8.4.7 节,“MySQL Enterprise 防火墙”。启用使用
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)时,必须将其授予恢复用户。启用帐户激活和停用重做日志存档。
启用使用
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG语句来启用或停用重做日志记录。请参见 停用重做日志记录。
启用帐户使用
masking_dictionary_term_add()和masking_dictionary_term_remove()组件函数添加和删除字典词条。帐户还需要此动态权限才能使用masking_dictionary_remove()函数删除完整的字典,该函数会删除当前在mysql.masking_dictionaries表中与指定字典相关联的所有词条。启用用户或角色及其权限在所有启用了
NDB的 MySQL 服务器之间共享和同步,只要它们加入了给定的 NDB 集群。此权限仅在启用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的用户的全局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 企业审计”),则拥有SYSTEM_USER权限的帐户会自动分配AUDIT_ABORT_EXEMPT权限,该权限允许执行其查询,即使过滤器中配置的 “abort” 项目会阻止它们。因此,可以使用拥有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设置为这些值之一。为了将
gtid_next设置为AUTOMATIC:,TAGREPLICATION_CHECKS_APPLIER还必须拥有该权限以及REPLICATION_APPLIER权限。这在启动复制应用线程时进行检查。该权限还要求设置
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 事务。在 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查询应生成一个空的结果集。