授予 MySQL 帐户的权限决定了该帐户可以执行的操作。MySQL 权限在它们应用的上下文和不同级别的操作中有所不同:
- 管理权限使用户能够管理 MySQL 服务器的操作。这些权限是全局的,因为它们不是特定于特定数据库的。
- 数据库权限适用于数据库及其中的所有对象。这些权限可以授予特定数据库,也可以全局授予,以便它们适用于所有数据库。
- 可以为数据库中的特定对象、数据库中给定类型的所有对象(例如,数据库中的所有表)或全局授予所有数据库对象(例如表、索引、视图和存储例程)的权限。所有数据库中给定类型的对象。
特权在它们是静态(内置于服务器)还是动态(在运行时定义)方面也有所不同。特权是静态的还是动态的会影响其授予用户帐户和角色的可用性。有关静态和动态权限之间差异的信息,请参阅 静态与动态权限。)
有关帐户权限的信息存储在mysql系统数据库的授权表中。有关这些表的结构和内容的说明,请参见 第 6.2.3 节“授予表”。MySQL 服务器在启动时将授权表的内容读入内存,并在第 6.2.13 节“当权限更改生效时”所示的情况下重新加载它们 。服务器根据授权表的内存副本做出访问控制决策。
重要的
一些 MySQL 版本引入了对授权表的更改以添加新的权限或功能。为确保您可以利用任何新功能,请在升级 MySQL 时将授权表更新为当前结构。请参阅 第 2.11 节,“升级 MySQL”。
以下部分总结了可用权限,提供每个权限的更详细说明,并提供使用指南。
可用权限摘要
下表显示了在GRANT和 REVOKE语句中使用的静态权限名称 ,以及与授权表中的每个权限关联的列名称以及权限应用的上下文。
表 6.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语句中使用的动态权限名称 ,以及权限应用的上下文。
表 6.3 GRANT 和 REVOKE 允许的动态权限
| 特权 | 上下文 |
|---|---|
APPLICATION_PASSWORD_ADMIN |
双密码管理 |
AUDIT_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 |
服务器管理 |
FLUSH_USER_RESOURCES |
服务器管理 |
GROUP_REPLICATION_ADMIN |
复制管理 |
INNODB_REDO_LOG_ARCHIVE |
重做日志归档管理 |
NDB_STORED_USER |
导航台集群 |
PERSIST_RO_VARIABLES_ADMIN |
服务器管理 |
REPLICATION_APPLIER |
PRIVILEGE_CHECKS_USER 对于复制通道 |
REPLICATION_SLAVE_ADMIN |
复制管理 |
RESOURCE_GROUP_ADMIN |
资源组管理 |
RESOURCE_GROUP_USER |
资源组管理 |
ROLE_ADMIN |
服务器管理 |
SESSION_VARIABLES_ADMIN |
服务器管理 |
SET_USER_ID |
服务器管理 |
SHOW_ROUTINE |
服务器管理 |
SYSTEM_USER |
服务器管理 |
SYSTEM_VARIABLES_ADMIN |
服务器管理 |
TABLE_ENCRYPTION_ADMIN |
服务器管理 |
VERSION_TOKEN_ADMIN |
服务器管理 |
XA_RECOVER_ADMIN |
服务器管理 |
静态权限描述
与在运行时定义的动态权限相反,静态权限内置于服务器中。以下列表描述了 MySQL 中可用的每个静态权限。
特定的 SQL 语句可能具有比此处指出的更具体的权限要求。如果是,则相关声明的描述会提供详细信息。
-
这些权限说明符的速记“可在给定的权限级别的所有权限” (除
GRANT OPTION)。例如,ALL在全局或表级别授予分别授予所有全局权限或所有表级别权限。 -
允许使用该
ALTER TABLE语句来更改表的结构。ALTER TABLE还需要CREATE和INSERT权限。重命名表需要ALTER和DROP对旧表,CREATE以及INSERT对新表。 -
允许使用更改或删除存储例程(存储过程和函数)的语句。对于属于授予特权的范围内且用户不是名为routine 的用户的例程
DEFINER,还允许访问例程定义以外的例程属性。 -
允许使用创建新数据库和表的语句。
-
启用
CREATE ROLE语句的使用。(CREATE USER特权还允许使用该CREATE ROLE语句。)请参阅 第 6.2.10 节,“使用角色”。在
CREATE ROLE和DROP ROLE特权是不是强大CREATE USER,因为它们只能用于创建和删除帐户。它们不能用于CREATE USER修改帐户属性或重命名帐户。请参阅 用户和角色互换性。 -
允许使用创建存储例程(存储过程和函数)的语句。对于属于授予权限的范围内且用户不是名为routine 的用户的例程
DEFINER,还允许访问例程定义以外的例程属性。 -
允许使用创建、更改或删除表空间和日志文件组的语句。
-
允许使用该
CREATE TEMPORARY TABLE语句创建临时表 。会话创建临时表后,服务器不会对该表执行进一步的权限检查。所述创建会话可以在桌子上进行任何操作,例如
DROP TABLE,INSERT,UPDATE,或SELECT。有关更多信息,请参阅第 13.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语句。)请参阅第 6.2.10 节,“使用角色”。在
CREATE ROLE和DROP ROLE特权是不是强大CREATE USER,因为它们只能用于创建和删除帐户。它们不能用于CREATE USER修改帐户属性或重命名帐户。请参阅 用户和角色互换性。 -
允许使用为事件调度程序创建、更改、删除或显示事件的语句。
-
允许使用执行存储例程(存储过程和函数)的语句。对于属于授予权限的范围内且用户不是名为routine 的用户的例程
DEFINER,还允许访问例程定义以外的例程属性。 -
影响以下操作和服务器行为:
- 使用
LOAD DATAandSELECT ... INTO OUTFILE语句和LOAD_FILE()函数在服务器主机上启用读取和写入文件。具有FILE权限的用户可以读取服务器主机上任何世界可读或 MySQL 服务器可读的文件。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件。) - 允许在 MySQL 服务器具有写访问权限的任何目录中创建新文件。这包括服务器的数据目录,其中包含实现权限表的文件。
- 为语句 启用
DATA DIRECTORYorINDEX DIRECTORY表选项CREATE TABLE。
作为安全措施,服务器不会覆盖现有文件。
要限制可以读取和写入文件的位置,请将
secure_file_priv系统变量设置为特定目录。请参阅 第 5.1.8 节,“服务器系统变量”。 - 使用
-
使您能够向其他用户授予或撤销您自己拥有的那些权限。
-
允许使用创建或删除(删除)索引的语句。
INDEX适用于现有表。如果您拥有CREATE表的 权限,则可以在CREATE TABLE语句中包含索引定义 。 -
允许将行插入到数据库的表中。
INSERT还需要对ANALYZE TABLE,OPTIMIZE TABLE和REPAIR TABLE表维护语句。 -
允许使用显式
LOCK TABLES语句来锁定您拥有SELECT特权的表。这包括使用写锁,它可以防止其他会话读取锁定的表。 -
该
PROCESS权限控制访问有关服务器内执行的线程的信息(即,有关语句的信息由会话执行)。使用SHOW PROCESSLIST语句、mysqladmin processlist 命令、INFORMATION_SCHEMA.PROCESSLIST表和 Performance Schemaprocesslist表可用的线程信息可按如下方式访问:注意
Performance Schema
threads表还提供线程信息,但表访问使用不同的权限模型。请参阅 第 27.12.21.6 节,“线程表”。该
PROCESS特权还允许使用SHOW ENGINE语句、访问INFORMATION_SCHEMAInnoDB表(名称以 开头的表INNODB_)和(从 MySQL 8.0.21 开始)访问INFORMATION_SCHEMAFILES表。 -
使一个用户能够冒充或成为另一个用户。请参阅第 6.2.18 节,“代理用户”。
-
创建外键约束需要
REFERENCES父表的 特权。 -
将
RELOAD实现以下操作:-
FLUSH语句的 使用。 -
使用中mysqladmin等效于命令
FLUSH操作:flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables,flush-threads,refresh,和reload。该
reload命令告诉服务器将授权表重新加载到内存中。flush-privileges是 的同义词reload。该refresh命令关闭并重新打开日志文件并刷新所有表。其他 命令执行类似于 的功能 ,但更具体,在某些情况下可能更可取。例如,如果您只想刷新日志文件, 则比 .flush-*xxx*``refresh``flush-logs``refresh -
使用执行各种操作的mysqldump选项
FLUSH:--flush-logs和--master-data. -
使用
RESET MASTER和RESET REPLICA(或在 MySQL 8.0.22 之前,RESET SLAVE)语句。
-
-
允许使用的
SHOW MASTER STATUS,SHOW REPLICA STATUS和SHOW BINARY LOGS语句。 -
使帐户能够使用
SHOW REPLICAS(或 MySQL 8.0.22 之前的SHOW SLAVE HOSTS)SHOW RELAYLOG EVENTS、 和SHOW BINLOG EVENTS语句请求对复制源服务器上的数据库进行的更新 。使用mysqlbinlog选项--read-from-remote-server(-R)--read-from-remote-source、 和 也需要此权限--read-from-remote-master。将此权限授予副本用于连接到当前服务器作为其复制源服务器的帐户。 -
允许从数据库中的表中选择行。
SELECT语句SELECT仅在实际访问表时才需要 特权。有些SELECT语句不访问表,可以在没有任何数据库许可的情况下执行。例如,您可以将其SELECT用作一个简单的计算器来计算不引用表的表达式:SELECT 1+1; SELECT PI()*2;SELECT其他读取列值的语句也需要 该权限。例如, 在 语句SELECT中*col_name=expr*赋值右侧引用的UPDATE列或在or 语句的WHERE子句中 命名的列需要它 。DELETEUPDATE -
通过发出
SHOW DATABASE语句使帐户能够查看数据库名称 。没有这个权限的帐户只能看到他们有一些权限的数据库,如果服务器是用该--skip-show-database选项启动的,则根本不能使用该语句 。注意
由于任何静态全局权限都被视为适用于所有数据库的权限,因此任何静态全局权限都使用户能够通过
SHOW DATABASES或通过检查 的SCHEMATA表来查看所有数据库名称INFORMATION_SCHEMA,但已在数据库级别通过部分撤销受到限制的数据库除外。 -
启用
SHOW CREATE VIEW语句的使用。与 一起使用的视图也需要此权限EXPLAIN。 -
启用
SHUTDOWN和RESTART语句、 mysqladmin 关闭命令和mysql_shutdown()C API 函数的使用。 -
SUPER是一项强大而深远的特权,不应轻易授予。如果一个帐户只需要执行一部分SUPER操作,则可以通过授予一个或多个动态权限来实现所需的权限集,每个权限都赋予更多有限的功能。请参阅 动态权限描述。注意
SUPER已弃用,您应该期望它会在 MySQL 的未来版本中删除。请参阅将 帐户从 SUPER 迁移到动态权限。SUPER影响以下操作和服务器行为:-
在运行时启用系统变量更改:
-
启用服务器的配置变化与全球系统变量
SET GLOBAL和SET PERSIST。对应的动态权限为
SYSTEM_VARIABLES_ADMIN. -
允许设置需要特殊权限的受限会话系统变量。
对应的动态权限为
SESSION_VARIABLES_ADMIN.
另请参见第 5.1.9.1 节,“系统变量权限”。
-
-
启用对全局事务特性的更改(请参阅第 13.3.7 节,“SET TRANSACTION 语句”)。
对应的动态权限为
SYSTEM_VARIABLES_ADMIN. -
使帐户能够启动和停止复制,包括组复制。
对应的动态权限
REPLICATION_SLAVE_ADMIN用于常规复制,GROUP_REPLICATION_ADMIN用于组复制。 -
允许使用
CHANGE REPLICATION SOURCE TO语句(来自 MySQL 8.0.23)、CHANGE MASTER TO语句(MySQL 8.0.23 之前)和CHANGE REPLICATION FILTER语句。对应的动态权限为
REPLICATION_SLAVE_ADMIN. -
通过
PURGE BINARY LOGSandBINLOG语句启用二进制日志控制 。对应的动态权限为
BINLOG_ADMIN. -
允许在执行视图或存储程序时设置有效的授权 ID。具有此权限的用户可以在
DEFINER视图或存储程序的属性中指定任何帐户 。对应的动态权限为
SET_USER_ID. -
允许使用的
CREATE SERVER,ALTER SERVER和DROP SERVER语句。 -
启用mysqladmin 调试 命令的使用。
-
启用
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如果启用了二进制日志记录, 您可能还需要创建或更改存储函数的权限,如 第 25.7 节“存储程序二进制日志记录”中所述。 -
-
启用触发器操作。您必须具有此权限才能为表创建、删除、执行或显示该表的触发器。
当触发器被激活(由谁拥有特权执行用户
INSERT,UPDATE或DELETE与触发器关联的表的语句),触发器执行要求谁定义触发器的用户仍然有TRIGGER对表的特权。 -
允许更新数据库表中的行。
-
此权限说明符代表“无权限”。”在全局级别使用 with
GRANT指定子句,例如WITH GRANT OPTION不命名权限列表中的特定帐户权限。SHOW GRANTS显示USAGE以指示帐户没有权限级别的权限。
动态权限描述
动态权限是在运行时定义的,而静态权限则是内置于服务器中的。以下列表描述了 MySQL 中可用的每个动态权限。
大多数动态权限是在服务器启动时定义的。其他由特定组件或插件定义,如权限描述中所示。在这种情况下,除非启用定义它的组件或插件,否则该权限将不可用。
特定的 SQL 语句可能具有比此处指出的更具体的权限要求。如果是,则相关声明的描述会提供详细信息。
-
APPLICATION_PASSWORD_ADMIN(在 MySQL 8.0.14 中添加)对于双密码功能,此权限允许使用适用于您自己帐户的and 语句的
RETAIN CURRENT PASSWORDandDISCARD OLD PASSWORD子句 。操作您自己的二级密码需要此权限,因为大多数用户只需要一个密码。ALTER USERSET PASSWORD如果要允许一个帐户为所有帐户操作二级密码,则应授予它
CREATE USER特权而不是APPLICATION_PASSWORD_ADMIN。有关使用双密码的更多信息,请参阅 第 6.2.15 节 “密码管理”。
-
启用审计日志配置。此权限由
audit_log插件定义;请参阅 第 6.4.5 节,“MySQL 企业审计”。 -
启用
LOCK INSTANCE FOR BACKUP语句的执行和对 Performance Schemalog_status表的访问。注意
此外
BACKUP_ADMIN,在SELECT对特权log_status还需要为它的访问表。从早期版本执行就地升级到 MySQL 8.0 时, 该
BACKUP_ADMIN权限会自动授予具有该RELOAD权限的用户 。 -
通过
PURGE BINARY LOGSandBINLOG语句启用二进制日志控制 。 -
启用设置系统变量
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适用于这些系统变量的影响:init_connect:客户端连接init_connect时服务器不执行 系统变量内容CONNECTION_ADMIN。max_connections:CONNECTION_ADMIN即使max_connections达到系统变量配置的连接限制,服务器也接受来自客户端的 一个连接 。offline_mode:处于离线模式(offline_mode启用)的服务器不会CONNECTION_ADMIN在下一个客户端请求时终止 客户端连接,并接受来自CONNECTION_ADMIN客户端的新连接 。read_only:即使read_only启用了系统变量,也可以执行更新 。这适用于明确的表的更新,并使用账户管理语句,如GRANT和REVOKE隐式更新表。
-
启用
InnoDB加密密钥轮换。 -
使用户能够为任何用户管理防火墙规则。此权限由
MYSQL_FIREWALL插件定义 ;请参阅 第 6.4.7 节,“MySQL 企业防火墙”。 -
FIREWALL_EXEMPT(在 MySQL 8.0.27 中添加)具有此权限的用户不受防火墙限制。此权限由
MYSQL_FIREWALL插件定义 ;请参阅 第 6.4.7 节,“MySQL 企业防火墙”。 -
使用户能够更新他们自己的防火墙规则。此权限由
MYSQL_FIREWALL插件定义 ;请参阅 第 6.4.7 节,“MySQL 企业防火墙”。 -
FLUSH_OPTIMIZER_COSTS(在 MySQL 8.0.23 中添加)启用
FLUSH OPTIMIZER_COSTS语句的使用。 -
FLUSH_STATUS(在 MySQL 8.0.23 中添加)启用
FLUSH STATUS语句的使用。 -
FLUSH_TABLES(在 MySQL 8.0.23 中添加)启用
FLUSH TABLES语句的使用。 -
FLUSH_USER_RESOURCES(在 MySQL 8.0.23 中添加)启用
FLUSH USER_RESOURCES语句的使用。 -
使帐户能够使用
START GROUP REPLICATIONandSTOP GROUP REPLICATION语句启动和停止组复制、更改group_replication_consistency系统变量的全局设置 以及使用group_replication_set_write_concurrency()andgroup_replication_set_communication_protocol()函数。将此权限授予用于管理作为复制组成员的服务器的帐户。 -
使帐户能够激活和停用重做日志归档。
-
启用该
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG语句以启用或禁用重做日志记录。在 MySQL 8.0.21 中引入。请参阅禁用重做日志记录。
-
使用户或角色及其特权在所有
NDB启用的 MySQL 服务器加入给定的 NDB Cluster 后立即在所有启用的 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,请参阅 第 23.6.12 节,“具有 NDB_STORED_USER 的分布式 MySQL 权限”。该
NDB_STORED_USER特权从 NDB 8.0.18 开始可用。 -
对于还具有 的用户
SYSTEM_VARIABLES_ADMIN,PERSIST_RO_VARIABLES_ADMIN允许使用SET PERSIST_ONLY将全局系统变量持久化到mysqld-auto.cnf数据目录中的选项文件中。该语句类似于SET PERSIST但不修改运行时全局系统变量值。这SET PERSIST_ONLY适用于配置只能在服务器启动时设置的只读系统变量。另请参见第 5.1.9.1 节,“系统变量权限”。
-
使帐户充当
PRIVILEGE_CHECKS_USER复制通道,并BINLOG在mysqlbinlog输出中执行语句。将此权限授予使用CHANGE REPLICATION SOURCE TO(从 MySQL 8.0.23)或CHANGE MASTER TO(在 MySQL 8.0.23 之前)分配的帐户, 以为复制通道提供安全上下文,并处理这些通道上的复制错误。除了REPLICATION_APPLIER权限之外,您还必须为帐户授予执行复制通道收到的或包含在mysqlbinlog 中的事务所需的权限输出,例如更新受影响的表。有关更多信息,请参阅第 17.3.3 节,“复制权限检查”。 -
启用账户连接复制源服务器,使用
START REPLICAandSTOP REPLICA语句启动和停止复制 ,使用CHANGE REPLICATION SOURCE TO语句(MySQL 8.0.23CHANGE MASTER TO之前)或语句(MySQL 8.0.23之前)和CHANGE REPLICATION FILTER语句。将此权限授予副本用于连接到当前服务器作为其复制源服务器的帐户。此权限不适用于 Group Replication;使用GROUP_REPLICATION_ADMIN了点。 -
启用资源组管理,包括创建、更改和删除资源组,以及将线程和语句分配给资源组。具有此权限的用户可以执行与资源组相关的任何操作。
-
允许将线程和语句分配给资源组。具有此权限的用户可以使用该
SET RESOURCE GROUP语句和RESOURCE_GROUP优化器提示。 -
允许授予和撤销角色、语句
WITH ADMIN OPTION子句的 使用以及 函数结果中的GRANT非空<graphml>元素内容ROLES_GRAPHML()。需要设置mandatory_roles系统变量的值 。 -
启用与仅允许管理连接的网络接口的连接(请参阅 第 5.1.12.1 节,“连接接口”)。
-
SESSION_VARIABLES_ADMIN(在 MySQL 8.0.14 中添加)对于大多数系统变量,设置会话值不需要特殊权限,任何用户都可以完成以影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是一种受限操作。对于这些,
SESSION_VARIABLES_ADMIN特权使用户能够设置会话值。如果系统变量受到限制并且需要特殊权限来设置会话值,则变量描述会指示该限制。实例包括
binlog_format,sql_log_bin,和sql_log_off。在 MySQL 8.0.14
SESSION_VARIABLES_ADMIN添加之前,受限会话系统变量只能由具有SYSTEM_VARIABLES_ADMIN或SUPER权限的用户设置 。该
SESSION_VARIABLES_ADMIN特权的一个子集SYSTEM_VARIABLES_ADMIN和SUPER特权。拥有这些特权中的任何一个的用户也被允许设置受限的会话变量,并且实际上SESSION_VARIABLES_ADMIN是隐含的,不需要SESSION_VARIABLES_ADMIN明确授予 。另请参见第 5.1.9.1 节,“系统变量权限”。
-
允许在执行视图或存储程序时设置有效的授权 ID。具有此权限的用户可以指定任何帐户作为
DEFINER视图或存储程序的 属性。从 MySQL 8.0.22 开始,
SET_USER_ID还启用覆盖安全检查,旨在防止(可能无意中)导致存储对象成为孤立对象或导致采用当前孤立的存储对象的操作。有关详细信息,请参阅 孤立存储对象。 -
SHOW_ROUTINE(在 MySQL 8.0.20 中添加)使用户能够访问所有存储例程(存储过程和函数)的定义和属性,即使是那些用户未命名为例程的定义和属性
DEFINER。此访问包括:INFORMATION_SCHEMA.ROUTINES表 的内容 。- 该
SHOW CREATE FUNCTION和SHOW CREATE PROCEDURE语句。 - 该
SHOW FUNCTION CODE和SHOW PROCEDURE CODE语句。 - 该
SHOW FUNCTION STATUS和SHOW PROCEDURE STATUS语句。
在 MySQL 8.0.20 之前,用户要访问用户未定义的例程定义,用户必须具有全局
SELECT权限,这是非常广泛的。从 8.0.20 开始,SHOW_ROUTINE可以改为授予权限,该权限具有更受限的范围,允许访问例程定义。(也就是说,管理员可以SELECT从不需要它的用户撤销全局 并SHOW_ROUTINE改为授予它 。)这使帐户能够备份存储的例程,而无需广泛的特权。 -
SYSTEM_USER(在 MySQL 8.0.16 中添加)该
SYSTEM_USER权限将系统用户与普通用户区分开来:- 具有
SYSTEM_USER特权的用户是系统用户。 - 没有
SYSTEM_USER权限的用户是普通用户。
该
SYSTEM_USER权限会影响给定用户可以应用其其他权限的帐户,以及该用户是否受到其他帐户的保护:- 系统用户可以修改系统账户和普通账户。也就是说,拥有对常规帐户执行给定操作的适当权限的用户通过拥有
SYSTEM_USER也可以对系统帐户执行操作。系统帐户只能由具有适当权限的系统用户修改,普通用户不能修改。 - 具有适当权限的普通用户可以修改普通帐户,但不能修改系统帐户。普通帐户可以由系统用户和普通用户以适当的权限进行修改。
有关更多信息,请参阅 第 6.2.11 节,“帐户类别”。
由
SYSTEM_USER特权提供给系统帐户的常规帐户修改保护 不适用于对mysql系统模式具有特权的常规帐户, 因此可以直接修改该模式中的授权表。为了全面保护,不要mysql向普通帐户授予架构权限。请参阅 保护系统帐户免受常规帐户的操纵。 - 具有
-
影响以下操作和服务器行为:
-
在运行时启用系统变量更改:
- 启用服务器的配置变化与全球系统变量
SET GLOBAL和SET PERSIST。 - 启用服务器的配置变化与全球系统变量
SET PERSIST_ONLY,如果用户也有PERSIST_RO_VARIABLES_ADMIN。 - 允许设置需要特殊权限的受限会话系统变量。实际上,
SYSTEM_VARIABLES_ADMIN暗示SESSION_VARIABLES_ADMIN没有明确授予SESSION_VARIABLES_ADMIN。
另请参见第 5.1.9.1 节,“系统变量权限”。
- 启用服务器的配置变化与全球系统变量
-
启用对全局事务特性的更改(请参阅第 13.3.7 节,“SET TRANSACTION 语句”)。
-
-
TABLE_ENCRYPTION_ADMIN(在 MySQL 8.0.16 中添加)允许用户在
table_encryption_privilege_check启用时覆盖默认加密设置 ;请参阅 为模式和通用表空间定义加密默认值。 -
启用版本令牌功能的执行。此权限由
version_tokens插件定义 ;请参阅 第 5.6.6 节,“版本令牌”。 -
启用
XA RECOVER语句的执行 ;请参阅 第 13.3.8.1 节,“XA 事务 SQL 语句”。在 MySQL 8.0 之前,任何用户都可以执行该
XA RECOVER语句来发现未完成的准备好的 XA 事务的 XID 值,这可能会导致 XA 事务由非启动它的用户提交或回滚。在 MySQL 8.0 中,XA RECOVER仅允许具有XA_RECOVER_ADMIN特权,预计仅授予需要它的管理用户。例如,对于 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 语句注册由 component 定义的任何权限 my_component,但 UNINSTALL COMPONENT不会取消注册它们。对于第二条INSTALL COMPONENT语句,发现它注册的组件权限已经注册了,但是没有出现警告或者错误。
动态权限仅适用于全局级别。服务器在mysql.global_grants系统表中存储有关当前分配给用户帐户的动态权限的信息 :
- 服务器
global_grants在服务器启动期间自动注册指定的权限 (除非提供了该--skip-grant-tables选项)。 - 该
GRANT和REVOKE语句修改的内容global_grants。 - 中列出的动态权限分配
global_grants是持久的。它们不会在服务器关闭时删除。
示例:以下语句授予用户 u1控制副本上的复制(包括组复制)和修改系统变量所需的权限:
GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN
ON *.* TO 'u1'@'localhost';
授予的动态权限出现在SHOW GRANTS语句和 INFORMATION_SCHEMA USER_PRIVILEGES表的输出 中。
对于GRANT和 REVOKE在全局级别,任何未被识别为静态的命名权限都会根据当前注册的动态权限集进行检查,如果找到则授予。否则,会发生错误以指示未知的特权标识符。
forGRANT和 at the global levelREVOKE的含义 ALL [PRIVILEGES]包括所有静态全局权限,以及所有当前注册的动态权限:
GRANT ALL在全局级别授予所有静态全局权限和所有当前注册的动态权限。执行GRANT语句后注册的动态权限不会追溯授予任何帐户。REVOKE ALL在全局级别撤销所有授予的静态全局权限和所有授予的动态权限。
该FLUSH PRIVILEGES语句读取global_grants动态权限分配表并注册在那里找到的任何未注册的权限。
有关 MySQL Server 和 MySQL 发行版中包含的组件提供的动态权限的说明,请参阅 第 6.2.2 节,“MySQL 提供的权限”。
将帐户从 SUPER 迁移到动态权限
在 MySQL 8.0 中,许多以前需要SUPER特权的操作也与范围更有限的动态特权相关联。(有关这些权限的说明,请参阅 第 6.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第一步中的 查询应生成一个空结果集。




