文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  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 8.4 中,以前需要 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 查询应生成一个空的结果集。