Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

8.2.2 MySQL 提供的权限

MySQL 账户的权限确定了该账户可以执行的操作。MySQL 权限在应用上下文和操作级别不同:

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

  • 数据库权限适用于数据库和其中的所有对象。这些权限可以授予特定数据库或全局,以便应用于所有数据库。

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

权限还不同于是否是静态的(内置到服务器中)或动态的(在运行时定义)。权限是否是静态或动态影响了用户账户和角色的可授予权限。有关静态和动态权限的差异,请参阅静态 Versus 动态权限

关于账户权限的信息存储在 mysql 系统数据库中的授权表中。有关这些表的结构和内容,请参阅第8.2.3节,“Grant Tables”。MySQL 服务器在启动时将授权表的内容读入内存,并在第8.2.13节,“When Privilege Changes Take Effect”中指定的条件下重新加载它们。服务器基于内存中的授权表来做出访问控制决策。

Important

某些 MySQL 发布版本引入了对授权表的更改,以添加新权限或功能。为了确保您可以充分利用任何新功能,请在升级 MySQL 时更新授权表到当前结构。请参阅第3章,《Upgrading MySQL》

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

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

表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 日志过滤器阻止
AUDIT_ADMIN audit 日志管理
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 redo日志归档管理
INNODB_REDO_LOG_ENABLE redo日志管理
MASKING_DICTIONARIES_ADMIN 服务器管理
NDB_STORED_USER NDB集群
OPTIMIZE_LOCAL_TABLE OPTIMIZE LOCAL TABLE语句
PASSWORDLESS_USER_ADMIN 身份验证管理
PERSIST_RO_VARIABLES_ADMIN 服务器管理
REPLICATION_APPLIER 复制应用
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 Telemetry log管理(MySQL HeatWave on AWS)
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 服务器。

    • INSERTUPDATE 授予给 mysql 系统数据库的权限,允许用户添加权限或修改现有权限,分别。

    • DROP 授予给 mysql 系统数据库的权限,可以用来删除权限表或甚至整个数据库。

MySQL 支持静态和动态权限:

  • 静态权限是内置到服务器中的。它们总是可以被授予用户账户,并且不能被取消注册。

  • 动态权限可以在运行时注册和取消注册。这影响了它们的可用性:一个动态权限,如果没有被注册,不能被授予。

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

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

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控制复制(包括 Group Replication)在复制服务器上,并修改系统变量的权限:

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 提供的权限”

在 MySQL 8.4 中,许多之前需要SUPER权限的操作现在也关联到一个更有限的动态权限。 (关于这些权限的描述,请见第8.2.2节,“MySQL 提供的权限”。)每个操作可以被授予动态权限,而不是SUPER。这项改进了安全性,允许DBA避免授予SUPER权限,并根据操作授予用户权限。SUPER现在已被弃用;在未来的 MySQL 版本中将被删除。

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查询应该产生一个空结果集。