MySQL 账户授予的权限确定了账户可以执行的操作。MySQL 权限在不同的上下文中应用,并在不同的操作级别上有所不同:
-
管理权限使用户可以管理 MySQL 服务器的操作。这些权限是全局的,因为它们不特定于某个数据库。
-
数据库权限适用于某个数据库及其所有对象。这些权限可以授予特定的数据库,或者全局授予所有数据库。
-
数据库对象(如表、索引、视图和存储过程)的权限可以授予特定的对象、特定类型的所有对象(例如某个数据库中的所有表)或所有数据库中的所有对象。
权限还可以根据是否是静态(内置于服务器中)或动态(在运行时定义)而有所不同。权限是否是静态或动态影响了它是否可以授予用户账户和角色。有关静态和动态权限之间的差异的信息,请参见 静态与动态权限。
账户权限信息存储在 mysql
系统数据库中的授权表中。有关这些表的结构和内容的描述,请参见 第 8.2.3 节,“授权表”。MySQL 服务器在启动时将授权表的内容读取到内存中,并在 第 8.2.13 节,“权限更改生效时” 指定的情况下重新加载它们。服务器基于内存中的授权表副本进行访问控制决策。
某些 MySQL 版本引入了授权表的更改,以添加新的权限或功能。为了确保您可以利用任何新的功能,请在升级 MySQL 时更新授权表以获取当前结构。请参见 第 3 章,升级 MySQL。
以下部分总结了可用的权限,提供了每个权限的详细描述,并提供了使用指南。
以下表格显示了在 GRANT
和 REVOKE
语句中使用的静态权限名称,沿with 每个权限在授权表中的列名和应用上下文。
表 8.2 GRANT 和 REVOKE 的静态权限
Privilege | Grant Table Column | Context |
---|---|---|
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 的可授予动态权限
Privilege | Context |
---|---|
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_STATUS |
服务器管理 |
FLUSH_TABLES |
服务器管理 |
刷新用户资源 |
服务器管理 |
组复制管理员 |
复制管理 |
组复制流 |
复制管理 |
InnoDB 重做日志存档 |
重做日志存档管理 |
InnoDB 重做日志启用 |
重做日志管理 |
掩码字典管理员 |
服务器管理 |
NDB 存储用户 |
NDB 集群 |
无密码用户管理员 |
身份验证管理 |
持久只读变量管理员 |
服务器管理 |
复制应用程序 |
PRIVILEGE_CHECKS_USER for a replication channel |
复制从属管理员 |
复制管理 |
资源组管理员 |
资源组管理 |
资源组用户 |
资源组管理 |
角色管理员 |
服务器管理 |
敏感变量观察员 |
服务器管理 |
会话变量管理员 |
服务器管理 |
设置任何定义者 |
服务器管理 |
设置用户 ID |
服务器管理 |
显示例程 |
服务器管理 |
跳过查询重写 |
服务器管理 |
系统用户 |
服务器管理 |
系统变量管理员 |
服务器管理 |
表加密管理员 |
服务器管理 |
遥测日志管理员 |
遥测日志管理 for MySQL HeatWave on AWS |
线程池连接管理员 |
线程池管理 |
事务 GTID 标签 |
复制管理 |
版本令牌管理员 |
服务器管理 |
XA 恢复管理员 |
服务器管理 |
静态权限是内置于服务器中的,而不是在运行时定义的动态权限。以下列表描述了 MySQL 中的每个静态权限。
特定的SQL语句可能具有比这里所示的更多的特权要求。如果是这样,相关语句的描述将提供详细信息。
-
这些特权specifier是“在给定特权级别上的所有可用特权”(除了
GRANT OPTION
)。例如,在全局或表级别授予所有
将授予所有全局特权或所有表级别特权,分别。 -
启用使用
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
权限强大,因为它们只能用于创建和删除账户,不能修改账户属性或重命名账户。请参阅 用户和角色互换。 -
启用 Event Scheduler 的创建、更改、删除或显示事件的语句。
-
启用存储过程(存储过程和函数)的执行语句。对于在授予权限范围内的存储过程和在用户不是存储过程 DEFINER 的情况下,也启用对存储过程属性的访问,除了存储过程定义。
-
影响以下操作和服务器行为:
-
启用使用
LOAD DATA
和SELECT ... INTO OUTFILE
语句和LOAD_FILE()
函数在服务器主机上读取和写入文件。拥有FILE
权限的用户可以读取服务器主机上任何可读文件(这意味着用户可以读取任何数据库目录中的文件,因为服务器可以访问这些文件)。 -
启用在 MySQL 服务器有写入访问权限的任何目录中创建新文件。这包括服务器的数据目录,包含实现权限表的文件。
-
启用使用
DATA DIRECTORY
或INDEX DIRECTORY
表选项的CREATE TABLE
语句。
出于安全考虑,服务器不会覆盖现有文件。
要限制文件可以读取和写入的位置,请将
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
表访问如下:Note性能模式
threads
表也提供了线程信息,但表访问使用不同的权限模型。见 第 29.12.22.8 节,“线程表”。PROCESS
权限还启用了SHOW ENGINE
语句的使用,访问INFORMATION_SCHEMA
InnoDB
表(以INNODB_
开头的表),以及访问INFORMATION_SCHEMA
FILES
表。 -
使一个用户可以伪装或成为另一个用户。见 第 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-
命令执行类似于xxx
refresh
的函数,但更具体,可能在某些情况下更可取。例如,如果您想刷新日志文件,可以使用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
语句或DELETE
语句的WHERE
子句中引用的列。 -
启用账户使用
SHOW DATABASE
语句查看数据库名称。没有该权限的账户只能看到他们拥有某些权限的数据库,无法使用该语句,如果服务器以--skip-show-database
选项启动。Caution因为任何静态全局权限都被认为是所有数据库的权限,因此任何静态全局权限都启用用户使用
SHOW DATABASES
或检查SCHEMATA
表中的INFORMATION_SCHEMA
,除了在数据库级别上被部分撤销的数据库。 -
启用使用
SHOW CREATE VIEW
语句。该权限还需要用于EXPLAIN
的视图。 -
启用使用
SHUTDOWN
和RESTART
语句,以及使用 mysqladmin shutdown 命令。 -
超级
是一个功能强大且范围广泛的权限,不应该轻易授予。如果账户只需要执行超级
操作的子集,可以通过授予一个或多个动态权限来实现所需的权限集,每个权限都授予有限的能力。请参阅 动态权限描述。Note超级
已弃用,预计在未来版本的 MySQL 中将被删除。请参阅 从超级迁移到动态权限。超级
影响以下操作和服务器行为:-
启用运行时系统变量更改:
-
启用使用
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_USER_ID
。 -
启用
CREATE SERVER
、ALTER SERVER
和DROP SERVER
语句。 -
启用 mysqladmin debug 命令。
-
启用
InnoDB
加密密钥轮换。对应的动态权限是
ENCRYPTION_KEY_ADMIN
。 -
启用版本令牌函数。
对应的动态权限是
VERSION_TOKEN_ADMIN
。 -
启用角色授予和撤销、使用
WITH ADMIN OPTION
子句的GRANT
语句,以及非空<graphml>
元素内容来自ROLES_GRAPHML()
函数的结果。对应的动态权限是
ROLE_ADMIN
。 -
启用对客户端连接的控制,不允许非
SUPER
帐户:-
启用使用
KILL
语句或 mysqladmin kill 命令来终止其他帐户的线程。(帐户总是可以终止自己的线程。) -
服务器不执行
init_connect
系统变量内容,当SUPER
客户端连接时。 -
服务器接受来自
SUPER
客户端的连接,即使连接限制配置的max_connections
系统变量已达到。 -
服务器在离线模式下 (
offline_mode
启用) 不会在下一个客户端请求时终止SUPER
客户端连接,并接受来自SUPER
客户端的新连接。 -
可以在
read_only
系统变量启用时执行更新。这适用于显式表更新,以及使用帐户管理语句,如GRANT
和REVOKE
隐式更新表。
对应的动态权限是
CONNECTION_ADMIN
。 -
您可能还需要
SUPER
权限来创建或修改存储函数,如果启用了二进制日志记录,如 第 27.7 节“存储程序二进制日志记录”所述。 -
-
启用触发器操作。您必须拥有该权限来创建、删除、执行或显示触发器的表。
当触发器被激活(由拥有执行
INSERT
、UPDATE
或DELETE
语句的用户)时,触发器执行需要定义触发器的用户仍然拥有该表的TRIGGER
权限。 -
启用在数据库中的表中更新行。
-
该权限specifier 代表“无权限”。它用于全局级别的
GRANT
中,以指定诸如WITH GRANT OPTION
之类的子句,而不指定特定的帐户权限。SHOW GRANTS
显示USAGE
,以指示帐户没有特定的权限。
动态权限是在运行时定义的,与静态权限不同,静态权限是服务器的一部分。以下列表描述了 MySQL 中每个动态权限。
大多数动态权限是在服务器启动时定义的。其他一些是由特定的组件或插件定义的,如权限描述所示。在这种情况下,除非启用了定义该权限的组件或插件,否则该权限不可用。
某些 SQL 语句可能具有比这里所示更具体的权限要求。如果是这样,语句的描述将提供详细信息。
-
启用了绕过安全检查,以防止操作可能(无意中)使存储对象变为孤立或使孤立的存储对象被采纳。如果没有授予该权限(或弃用的
SET_USER_ID
权限),那么任何尝试产生孤立 SQL 过程、函数或视图的尝试将导致错误。使用CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TRIGGER
、CREATE EVENT
或CREATE VIEW
产生孤立对象也需要SET_ANY_DEFINER
权限,除了ALLOW_NONEXISTENT_DEFINER
权限,以便允许定义者不同于当前用户。详细信息,请参阅 孤立存储对象。
-
对于双密码功能,这个权限启用了
RETAIN CURRENT PASSWORD
和DISCARD OLD PASSWORD
子句的使用,以便在ALTER USER
和SET PASSWORD
语句中应用于自己的账户。这个权限是必需的,以便操作自己的次要密码,因为大多数用户只需要一个密码。如果账户需要为所有账户操作次要密码,它应该被授予
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
。有关双密码使用的更多信息,请参阅 第 8.2.15 节,“密码管理”。
-
允许查询被审核日志过滤器中的“abort”项阻止。该权限由
audit_log
插件定义;见 第 8.4.5 节,“MySQL 企业审核”。使用
SYSTEM_USER
权限创建的账户将自动分配AUDIT_ABORT_EXEMPT
权限。当您执行升级过程时,如果没有现有的账户具有该权限,现有的账户也将被分配该权限。因此,具有SYSTEM_USER
权限的账户可以用于在审核misconfiguration 后恢复系统访问。 -
启用审核日志配置。该权限由
audit_log
插件定义;见 第 8.4.5 节,“MySQL 企业审核”。 -
启用执行
LOCK INSTANCE FOR BACKUP
语句和访问性能模式log_status
表。Note除了
BACKUP_ADMIN
,还需要SELECT
权限在log_status
表上以访问它。在从早期版本升级到 MySQL 8.3 时,
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 服务器的离线模式,这是通过将offline_mode
系统变量设置为ON
实现的。CONNECTION_ADMIN
权限使管理员可以绕过这些系统变量的限制:-
init_connect
:服务器不会在CONNECTION_ADMIN
客户端连接时执行init_connect
系统变量的内容。 -
max_connections
:服务器接受来自CONNECTION_ADMIN
客户端的连接,即使已经达到由max_connections
系统变量配置的连接限制。 -
offline_mode
:处于离线模式(offline_mode
启用)的服务器不会在下一个客户端请求时终止CONNECTION_ADMIN
客户端连接,并接受来自CONNECTION_ADMIN
客户端的新连接。 -
read_only
:来自CONNECTION_ADMIN
客户端的更新可以在read_only
系统变量启用时执行。这适用于明确的表更新,以及隐式更新表的账户管理语句,例如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 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
表中的所有条目。 -
启用用户或角色及其权限在所有启用
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
中。授予某个角色该权限的用户 不 会被存储在NDB
中;每个NDB
存储用户都必须明确授予该权限。有关在
NDB
中如何工作的更多详细信息,请参阅 第 25.6.13 节,“权限同步和 NDB_STORED_USER”。从 NDB 8.0.18 开始提供
NDB_STORED_USER
权限。 -
该权限适用于无密码用户帐户:
-
对于帐户创建,执行
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 指定的帐户,以提供复制通道的安全上下文,并处理这些通道上的复制错误。此外,还必须授予帐户执行从复制通道接收的交易或包含在 mysqlbinlog 输出中的交易所需的权限。有关更多信息,请参阅 第 19.3.3 节,“复制权限检查”。 -
启用账户连接到复制源服务器,使用
START REPLICA
和STOP REPLICA
语句,并使用CHANGE REPLICATION SOURCE TO
和CHANGE REPLICATION FILTER
语句。将此权限授予用于连接到当前服务器作为复制源服务器的副本账户。此权限不适用于组复制;使用GROUP_REPLICATION_ADMIN
。 -
启用资源组管理,包括创建、更改和删除资源组,以及将线程和语句分配给资源组。具有此权限的用户可以执行与资源组相关的任何操作。
-
启用将线程和语句分配给资源组。具有此权限的用户可以使用
SET RESOURCE GROUP
语句和RESOURCE_GROUP
优化器提示。 -
启用授予和撤销角色,使用
WITH ADMIN OPTION
子句的GRANT
语句,并在ROLES_GRAPHML()
函数的结果中包含非空<graphml>
元素内容。需要设置mandatory_roles
系统变量的值。 -
启用持有者查看性能模式表
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
权限。 -
启用在执行视图或存储程序时设置有效授权 ID。拥有该权限的用户可以为
CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TRIGGER
、CREATE EVENT
、ALTER EVENT
、CREATE VIEW
和ALTER VIEW
指定任何账户作为DEFINER
属性。没有该权限(或没有弃用的SET_USER_ID
权限)授予,只能指定有效身份验证 ID。存储程序以指定账户的权限执行,因此请遵循 第 27.6 节,“存储对象访问控制” 中列出的风险最小化指南。
-
启用在执行视图或存储程序时设置有效授权 ID。拥有该权限的用户可以为视图或存储程序指定任何账户作为
DEFINER
属性。存储程序以指定账户的权限执行,因此请遵循 第 27.6 节,“存储对象访问控制” 中列出的风险最小化指南。SET_USER_ID
也启用了绕过安全检查,以防止存储对象变得孤立或采纳当前孤立的存储对象。有关详细信息,请参阅 孤立存储对象。该权限已弃用,并将在未来版本的 MySQL 中删除。当使用
GRANT
授予SET_USER_ID
时,SQL 警告将通知您弃用状态。它被以下权限所取代:-
SET_ANY_DEFINER
用于定义对象创建。 -
ALLOW_NONEXISTENT_DEFINER
用于孤立对象保护。
这两个权限都是使用
CREATE PROCEDURE
,CREATE FUNCTION
,CREATE TRIGGER
,CREATE EVENT
, 或CREATE VIEW
产生孤立的 SQL 对象所需的。在 MySQL 服务器升级期间,这些权限共存如下:
-
如果没有用户账户授予
SET_ANY_DEFINER
或ALLOW_NONEXISTENT_DEFINER
,那么所有用户账户授予SET_USER_ID
也将授予SET_ANY_DEFINER
和ALLOW_NONEXISTENT_DEFINER
。SET_USER_ID
权限将保持授予。 -
如果没有用户账户授予
SET_ANY_DEFINER
或ALLOW_NONEXISTENT_DEFINER
,那么所有SUPER
持有者将授予SET_ANY_DEFINER
和ALLOW_NONEXISTENT_DEFINER
,仅当 没有用户账户授予SET_ANY_DEFINER
、ALLOW_NONEXISTENT_DEFINER
或SET_USER_ID
。
在运行时,当 ACL 表被读取(例如使用
FLUSH PRIVILEGES
、服务器启动等)并且SET_USER_ID
授予被源时,将在错误日志中添加一条警告信息,详细说明账户SET_USER_ID
授予。 -
-
启用用户访问所有存储例程(存储过程和函数)的定义和属性,即使用户不是该例程的
DEFINER
。这包括:-
信息架构
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
特权的用户创建的数据库对象不能被没有该特权的用户修改或删除。这也适用于定义者拥有该特权的例程。有关更多信息,请参阅 第 8.2.11 节,“账户分类”。
由
SYSTEM_USER
特权提供的系统账户保护不适用于拥有mysql
系统模式特权的普通账户,这些账户可以直接修改该模式中的授权表。为获得完整保护,不要将mysql
系统模式特权授予普通账户。请参阅 保护系统账户免受普通账户的操作。如果使用
audit_log
插件(见 第 8.4.5 节,“MySQL 企业审计”),拥有SYSTEM_USER
特权的账户将自动分配AUDIT_ABORT_EXEMPT
特权,该特权允许它们的查询在阻止它们的过滤器项配置时执行。因此,拥有SYSTEM_USER
特权的账户可以用于在审计misconfiguration后恢复系统访问。 -
-
影响以下操作和服务器行为:
-
启用运行时系统变量更改:
-
启用使用
SET GLOBAL
和SET PERSIST
的服务器配置更改。 -
启用使用
SET PERSIST_ONLY
的服务器配置更改,如果用户也拥有PERSIST_RO_VARIABLES_ADMIN
特权。 -
启用设置受限会话系统变量,需要特殊权限。在实际中,
SYSTEM_VARIABLES_ADMIN
隐含SESSION_VARIABLES_ADMIN
,无需明确授予SESSION_VARIABLES_ADMIN
。
-
-
启用全局事务特征的更改(见第 15.3.7 节,“SET TRANSACTION 语句”)。
-
-
启用用户覆盖默认加密设置时
table_encryption_privilege_check
启用;见定义模式和通用表空间的加密默认值。 -
启用遥测日志配置。此权限由telemetry_log插件定义,该插件通过 MySQL HeatWave on AWS 部署。
-
启用使用特权连接连接到服务器。当
thread_pool_max_transactions_limit
定义的限制达到时,不允许新连接。特权连接忽略事务限制,允许连接到服务器以增加事务限制、删除限制或终止正在运行的事务。此权限默认不授予任何用户。要建立特权连接,启动连接的用户必须拥有TP_CONNECTION_ADMIN
权限。特权连接可以在thread_pool_max_transactions_limit限制达到时执行语句和启动事务。特权连接被置于Admin线程组中。见特权连接。
-
需要设置
gtid_next
系统变量为AUTOMATIC:TAG
或UUID:TAG
:NUMBER在复制源服务器上。此外,还需要至少一个SYSTEM_VARIABLES_ADMIN
、SESSION_VARIABLES_ADMIN
或REPLICATION_APPLIER
权限来设置gtid_next为这些值之一在源上。此外,
REPLICATION_CHECKS_APPLIER
也需要此权限,以及REPLICATION_APPLIER
权限,以设置gtid_next为AUTOMATIC:TAG
。这是在启动复制应用程序线程时检查的。有关使用标记 GTID 的更多信息,请参阅
gtid_next
的描述,以及第 19.1.4 节,“在线服务器上的 GTID 模式更改”。 -
启用 Version Tokens 函数。此权限由version_tokens插件定义;见第 7.6.6 节,“版本令牌”。
-
启用执行
XA RECOVER
语句;见第15.3.8.1节,“XA事务SQL语句”。在MySQL 8.3之前,任何用户都可以执行
XA RECOVER
语句,以发现未完成的XA事务的XID值,从而可能导致其他用户提交或回滚XA事务。在MySQL 8.3中,XA RECOVER
语句仅允许具有XA_RECOVER_ADMIN
特权的用户执行,这些特权通常仅授予需要它们的管理用户。例如,XA应用程序的管理员可能需要这些特权,以便在应用程序崩溃时找到未完成的事务以便回滚。这项特权要求不会影响正常的XA事务提交或回滚,因为启动事务的用户知道其XID。
建议仅授予账户所需的特权。您应该特别小心地授予FILE
和管理特权:
-
FILE
可以被滥用于读取MySQL服务器主机上的任何文件,包括所有世界可读文件和服务器数据目录中的文件。然后,可以使用SELECT
将其内容传输到客户端主机。 -
GRANT OPTION
使用户能够将其特权授予其他用户。两个具有不同特权且具有GRANT OPTION
特权的用户可以组合特权。 -
ALTER
可能被用于破坏特权系统,方法是重命名表。 -
SHUTDOWN
可能被滥用于完全拒绝其他用户的服务,方法是终止服务器。 -
PROCESS
可以用于查看当前执行语句的明文,包括设置或更改密码的语句。 -
SUPER
可以用于终止其他会话或更改服务器的操作方式。 -
授予mysql系统数据库本身的特权可以用于更改密码和其他访问特权信息:
-
密码存储加密,因此恶意用户无法简单地读取明文密码。但是,具有mysql.user系统表authentication_string列写访问权限的用户可以更改账户密码,然后使用该账户连接到MySQL服务器。
-
DROP
授予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 Server 和 MySQL 发行版中提供的动态权限的描述,请参阅 第 8.2.2 节,“MySQL 提供的权限”。
在 MySQL 8.3 中,许多以前需要 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 查询应该产生一个空结果集。