Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Privileges Provided by MySQL

8.2.2 MySQL 提供的权限

MySQL 账户授予的权限确定了账户可以执行的操作。MySQL 权限在不同的上下文中应用,并在不同的操作级别上有所不同:

  • 管理权限使用户可以管理 MySQL 服务器的操作。这些权限是全局的,因为它们不特定于某个数据库。

  • 数据库权限适用于某个数据库及其所有对象。这些权限可以授予特定的数据库,或者全局授予所有数据库。

  • 数据库对象(如表、索引、视图和存储过程)的权限可以授予特定的对象、特定类型的所有对象(例如某个数据库中的所有表)或所有数据库中的所有对象。

权限还可以根据是否是静态(内置于服务器中)或动态(在运行时定义)而有所不同。权限是否是静态或动态影响了它是否可以授予用户账户和角色。有关静态和动态权限之间的差异的信息,请参见 静态与动态权限

账户权限信息存储在 mysql 系统数据库中的授权表中。有关这些表的结构和内容的描述,请参见 第 8.2.3 节,“授权表”。MySQL 服务器在启动时将授权表的内容读取到内存中,并在 第 8.2.13 节,“权限更改生效时” 指定的情况下重新加载它们。服务器基于内存中的授权表副本进行访问控制决策。

Important

某些 MySQL 版本引入了授权表的更改,以添加新的权限或功能。为了确保您可以利用任何新的功能,请在升级 MySQL 时更新授权表以获取当前结构。请参见 第 3 章,升级 MySQL

以下部分总结了可用的权限,提供了每个权限的详细描述,并提供了使用指南。

可用权限摘要

以下表格显示了在 GRANTREVOKE 语句中使用的静态权限名称,沿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 同义词为“无权限” 服务器管理

以下表格显示了在 GRANTREVOKE 语句中使用的动态权限名称,连同应用的上下文。

表 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语句可能具有比这里所示的更多的特权要求。如果是这样,相关语句的描述将提供详细信息。

动态权限描述

动态权限是在运行时定义的,与静态权限不同,静态权限是服务器的一部分。以下列表描述了 MySQL 中每个动态权限。

大多数动态权限是在服务器启动时定义的。其他一些是由特定的组件或插件定义的,如权限描述所示。在这种情况下,除非启用了定义该权限的组件或插件,否则该权限不可用。

某些 SQL 语句可能具有比这里所示更具体的权限要求。如果是这样,语句的描述将提供详细信息。

特权授予指南

建议仅授予账户所需的特权。您应该特别小心地授予FILE和管理特权:

  • FILE可以被滥用于读取MySQL服务器主机上的任何文件,包括所有世界可读文件和服务器数据目录中的文件。然后,可以使用SELECT将其内容传输到客户端主机。

  • GRANT OPTION使用户能够将其特权授予其他用户。两个具有不同特权且具有GRANT OPTION特权的用户可以组合特权。

  • ALTER可能被用于破坏特权系统,方法是重命名表。

  • SHUTDOWN可能被滥用于完全拒绝其他用户的服务,方法是终止服务器。

  • PROCESS可以用于查看当前执行语句的明文,包括设置或更改密码的语句。

  • SUPER可以用于终止其他会话或更改服务器的操作方式。

  • 授予mysql系统数据库本身的特权可以用于更改密码和其他访问特权信息:

    • 密码存储加密,因此恶意用户无法简单地读取明文密码。但是,具有mysql.user系统表authentication_string列写访问权限的用户可以更改账户密码,然后使用该账户连接到MySQL服务器。

    • INSERTUPDATE授予mysql系统数据库使用户能够添加特权或修改现有特权。

    • DROP授予mysql系统数据库使用户能够删除特权表,甚至删除整个数据库。

静态与动态特权

MySQL支持静态和动态特权:

  • 静态特权是服务器内置的。它们总是可用的,可以授予用户账户,不能被注销。

  • 动态特权可以在运行时注册和注销。这影响了它们的可用性:未注册的动态特权不能被授予。

例如,SELECTINSERT 权限是静态的,总是可用的,而动态权限只有在实现它的组件被启用时才可用。

本节的其余部分描述了 MySQL 中的动态权限。讨论使用术语 组件,但同样适用于插件。

Note

服务器管理员应该了解哪些服务器组件定义了动态权限。对于 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 Server 和 MySQL 发行版中提供的动态权限的描述,请参阅 第 8.2.2 节,“MySQL 提供的权限”

从 SUPER 迁移到动态权限的账户

在 MySQL 8.3 中,许多以前需要 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 查询应该产生一个空结果集。