文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  MySQL 提供的权限

8.2.2 MySQL 提供的权限

授予 MySQL 帐户的权限决定了该帐户可以执行哪些操作。MySQL 权限在适用的上下文中和不同的操作级别上有所不同。

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

  • 数据库权限适用于数据库及其内部的所有对象。这些权限可以针对特定数据库授予,也可以全局授予,以便它们适用于所有数据库。

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

权限在是否为静态(内置于服务器)或动态(在运行时定义)方面也有所不同。权限是静态的还是动态的会影响其对用户帐户和角色的可用性。有关静态权限和动态权限之间差异的信息,请参见 静态与动态权限。)

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

重要提示

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

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

可用权限摘要

下表显示了 GRANTREVOKE 语句中使用的静态权限名称,以及授权表中与每个权限关联的列名以及权限适用的上下文。

表 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 表或列
使用 “无权限”的同义词 服务器管理

下表显示了在 GRANTREVOKE 语句中使用的动态权限名称,以及该权限适用的上下文。

表 8.3 GRANT 和 REVOKE 允许的动态权限

权限 上下文
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_PRIVILEGES 服务器管理
FLUSH_STATUS 服务器管理
FLUSH_TABLES 服务器管理
FLUSH_USER_RESOURCES 服务器管理
GROUP_REPLICATION_ADMIN 复制管理
GROUP_REPLICATION_STREAM 复制管理
INNODB_REDO_LOG_ARCHIVE 重做日志归档管理
INNODB_REDO_LOG_ENABLE 重做日志管理
MASKING_DICTIONARIES_ADMIN 服务器管理
NDB_STORED_USER NDB 集群
OPTIMIZE_LOCAL_TABLE OPTIMIZE LOCAL TABLE 语句
PASSWORDLESS_USER_ADMIN 身份验证管理
PERSIST_RO_VARIABLES_ADMIN 服务器管理
REPLICATION_APPLIER PRIVILEGE_CHECKS_USER 用于复制通道
REPLICATION_SLAVE_ADMIN 复制管理
RESOURCE_GROUP_ADMIN 资源组管理
RESOURCE_GROUP_USER 资源组管理
ROLE_ADMIN 服务器管理
SENSITIVE_VARIABLES_OBSERVER 服务器管理
SESSION_VARIABLES_ADMIN 服务器管理
SET_ANY_DEFINER 服务器管理
SHOW_ROUTINE 服务器管理
SKIP_QUERY_REWRITE 服务器管理
SYSTEM_USER 服务器管理
SYSTEM_VARIABLES_ADMIN 服务器管理
TABLE_ENCRYPTION_ADMIN 服务器管理
TELEMETRY_LOG_ADMIN AWS 上 HeatWave 的遥测日志管理
TP_CONNECTION_ADMIN 线程池管理
TRANSACTION_GTID_TAG 复制管理
VERSION_TOKEN_ADMIN 服务器管理
XA_RECOVER_ADMIN 服务器管理

静态权限描述

静态权限内置于服务器,与动态权限形成对比,动态权限是在运行时定义的。以下列表描述了 MySQL 中可用的每个静态权限。

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

动态权限描述

动态权限是在运行时定义的,与静态权限相反,静态权限是内置于服务器中的。以下列表描述了 MySQL 中可用的每个动态权限。

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

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

授权指南

为帐户授予其需要的权限是一个好主意。在授予FILE和管理权限时应格外小心

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

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

  • ALTER可用于通过重命名表来破坏权限系统。

  • SHUTDOWN可能会被滥用,通过终止服务器来完全拒绝其他用户服务。

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

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

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

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

    • 针对mysql系统数据库授予的INSERTUPDATE分别使用户能够添加权限或修改现有权限。

    • 针对mysql系统数据库授予的DROP使用户能够删除权限表,甚至删除数据库本身。

静态权限与动态权限

MySQL 支持静态权限和动态权限

  • 静态权限内置于服务器中。它们始终可用于授予用户帐户,并且不能取消注册。

  • 动态权限可以在运行时注册和取消注册。这会影响它们的可用性:尚未注册的动态权限无法授予。

例如,SELECTINSERT权限是静态的并且始终可用,而动态权限仅在实现它的组件已启用后才可用。

本节的其余部分介绍了动态权限在 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 选项)。

  • 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 服务器和 MySQL 发行版中包含的组件提供的动态权限的说明,请参阅 第 8.2.2 节,“MySQL 提供的权限”

从 SUPER 迁移帐户到动态权限

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