8.2.2 MySQL 提供的权限
MySQL 账户的权限确定了该账户可以执行的操作。MySQL 权限在应用上下文和操作级别不同:
-
管理权限使用户能够管理 MySQL 服务器的操作。这些权限是全局的,因为它们不特定于某个数据库。
-
数据库权限适用于数据库和其中的所有对象。这些权限可以授予特定数据库或全局,以便应用于所有数据库。
-
对数据库对象,如表、索引、视图和存储过程的权限可以授予特定对象、特定对象类型或全局对象类型在所有数据库中。
权限还不同于是否是静态的(内置到服务器中)或动态的(在运行时定义)。权限是否是静态或动态影响了用户账户和角色的可授予权限。有关静态和动态权限的差异,请参阅静态 Versus 动态权限。
关于账户权限的信息存储在 mysql
系统数据库中的授权表中。有关这些表的结构和内容,请参阅第8.2.3节,“Grant Tables”。MySQL 服务器在启动时将授权表的内容读入内存,并在第8.2.13节,“When Privilege Changes Take Effect”中指定的条件下重新加载它们。服务器基于内存中的授权表来做出访问控制决策。
某些 MySQL 发布版本引入了对授权表的更改,以添加新权限或功能。为了确保您可以充分利用任何新功能,请在升级 MySQL 时更新授权表到当前结构。请参阅第3章,《Upgrading MySQL》。
以下部分总结了可用的权限,提供了每个权限的详细描述,并提供了使用指南。
以下表格显示了在GRANT
和REVOKE
语句中使用的静态权限名称,以及与每个权限相关的列名在授权表中,以及权限适用的上下文。
表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 |
同义词““无权限” | 服务器管理 |
以下表格显示了在GRANT
和REVOKE
语句中使用的动态权限名称,以及权限适用的上下文。
表8.3 GRANT 和 REVOKE 可以使用的动态权限
静态权限是服务器的一部分,而不是动态权限,它们是在运行时定义的。以下列表描述了MySQL中每个静态权限的详细信息。
某些SQL语句可能需要更多的权限要求。如果是这样,语句的描述将提供详细信息。
-
这些权限指定符是“所有可用的权限”(除了
GRANT OPTION
)的简写。例如,授予ALL
的全局或表级权限将授予所有全局权限或所有表级权限,分别。 -
启用使用
ALTER TABLE
语句来更改表的结构。ALTER TABLE
还需要CREATE
和INSERT
权限。重命名表需要ALTER
和DROP
旧表的权限CREATE
和INSERT
新表的权限。 -
启用修改或删除存储程序(存储过程和函数)的语句。对于在权限范围内的存储程序,并且用户不是定义该存储程序的用户,也启用访问存储程序的其他属性,除了存储程序定义。
-
启用创建新数据库和表的语句。
-
启用使用
CREATE ROLE
语句。(CREATE USER
权限也启用使用CREATE ROLE
语句。)请参阅第8.2.10节,“使用角色”。CREATE ROLE和DROP ROLE权限不像CREATE USER权限那样强大,因为它们只能用于创建和删除账户。它们不能用于修改账户属性或重命名账户。请参阅用户和角色互换性。
-
启用创建存储程序(存储过程和函数)的语句。对于在权限范围内的存储程序,并且用户不是定义该存储程序的用户,也启用访问存储程序的其他属性,除了存储程序定义。
-
启用创建、修改或删除表空间和日志文件组的语句。
-
启用使用
CREATE TEMPORARY TABLE
语句创建临时表。创建会话后,服务器对临时表不再执行任何权限检查。创建会话可以对表执行任何操作,如
DROP TABLE
、INSERT
、UPDATE
或SELECT
。更多信息,请见第15.1.20.2节,“CREATE TEMPORARY TABLE 语句”。 -
启用
ALTER USER
、CREATE ROLE
、CREATE USER
、DROP ROLE
、DROP USER
、RENAME USER
和REVOKE ALL PRIVILEGES
语句。 -
启用
CREATE VIEW
语句。 -
启用删除表中的行。
-
启用删除现有数据库、表和视图的语句。
DROP
权限也用于使用DROP
语句来删除分区表的分区。同时,DROP
权限也用于使用TRUNCATE TABLE
语句。 -
启用
DROP ROLE
语句。(CREATE USER
权限也启用DROP ROLE
语句。请见第8.2.10节,“使用角色”。《
CREATE ROLE
》和《DROP ROLE
》权限不像《CREATE USER
》那样强大,因为它们只能用来创建和删除账户,而不能用来修改账户属性或重命名账户。请参阅用户和角色互换性。 -
《
EVENT
》启用使用创建、修改、删除或显示事件的语句,以便使用事件调度器。
-
《
EXECUTE
》启用使用存储的存储程序(存储过程和函数)。对于在权限范围内的程序,并且用户不是程序的定义者,也启用访问程序的其他属性,除了程序定义。
-
《
FILE
》影响以下操作和服务器行为:
-
启用在服务器主机上读取和写入文件的操作,使用《
LOAD DATA
》和《SELECT ... INTO OUTFILE
》语句,以及《LOAD_FILE()
》函数。拥有《FILE
》权限的用户可以读取服务器主机上的任何文件,该文件是世界可读的或MySQL服务器可读的(这意味着用户可以读取任何数据库目录中的文件,因为服务器可以访问任何这些文件)。 -
启用在MySQL服务器可以写入的任何目录中创建新文件。这包括服务器的数据目录,该目录包含权限表的实现文件。
-
启用使用《
DATA DIRECTORY
》或《INDEX DIRECTORY
》表选项的《CREATE TABLE
》语句。
作为安全措施,服务器不会覆盖现有文件。
要限制文件可以读取和写入的位置,请将《
secure_file_priv
》系统变量设置为特定的目录。请参阅服务器系统变量。 -
-
启用您可以授予或撤销其他用户拥有的权限。
-
《
INDEX
》启用创建或删除索引的语句。
INDEX
适用于现有表。如果您对表具有CREATE
权限,可以在CREATE TABLE
语句中包含索引定义。 -
启用将数据插入数据库的表。
INSERT
也用于ANALYZE TABLE
、OPTIMIZE TABLE
和REPAIR TABLE
维护语句。 -
启用明确的
LOCK TABLES
语句,以锁定您具有SELECT
权限的表。这包括写锁,防止其他会话读取锁定的表。 -
PROCESS
权限控制对服务器中执行中的线程信息(即,关于会话正在执行的语句的信息)。使用SHOW PROCESSLIST
语句、mysqladmin processlist命令、信息架构PROCESSLIST
表和性能架构processlist
表可以访问以下内容:Note性能_schema
threads
表也提供线程信息,但是表访问使用不同的权限模型。请参阅第29.12.22.8节,“The threads 表”。PROCESS
权限还启用了SHOW ENGINE
语句的使用、访问INFORMATION_SCHEMA
InnoDB
表(名称以INNODB_
开头的表)和访问INFORMATION_SCHEMA
FILES
表。 -
允许一个用户模拟或成为另一个用户。请参阅第8.2.19节,“Proxy Users”。
-
创建外键约束需要
REFERENCES
权限的父表。 -
RELOAD
允许以下操作:-
使用
FLUSH
语句。 -
使用mysqladmin 命令,等效于
FLUSH
操作:flush-hosts
,flush-logs
,flush-privileges
,flush-status
,flush-tables
,refresh
,和reload
。reload
命令告诉服务器重新加载授权表。flush-privileges
是reload
的同义词。refresh
命令关闭并重新打开日志文件,并刷新所有表。其他flush-
命令执行类似于xxx
refresh
,但更具体,可能在某些情况下更好。例如,如果您想刷新日志文件,flush-logs
是比refresh
更好的选择。 -
使用mysqldump的选项,执行各种
FLUSH
操作:--flush-logs
和--source-data
。
-
-
启用
SHOW BINARY LOG STATUS
、SHOW REPLICA STATUS
和SHOW BINARY LOGS
语句。 -
启用账户请求在复制源服务器上对数据库进行的更新,使用
SHOW REPLICAS
、SHOW RELAYLOG EVENTS
和SHOW BINLOG EVENTS
语句。这权限也需要使用mysqlbinlog选项--read-from-remote-server
(-R
)和--read-from-remote-source
。授予用于复制服务器连接到当前服务器的账户的权限。 -
启用从表中选择行的权限。
SELECT
语句需要SELECT
权限,只有实际访问表时才需要。一些SELECT
语句不访问表,可以在没有权限的情况下执行。例如,可以使用SELECT
作为简单的计算器,来评估不引用表的表达式:SELECT 1+1; SELECT PI()*2;
需要
SELECT
特权的其他语句也可以读取列值。例如,对于SELECT
语句需要在UPDATE
语句的右侧col_name
=expr
赋值语句中引用列名,或者在DELETE
或UPDATE
语句的WHERE
子句中列名。 -
允许账户通过
SHOW DATABASE
语句查看数据库名称。没有这个特权的账户只能查看他们有权限的数据库,并且不能使用语句,如果服务器以--skip-show-database
选项启动。Caution因为任何静态全局特权都被认为是所有数据库的特权,所以任何静态全局特权都允许用户使用
SHOW DATABASES
语句或通过SCHEMATA
表中的INFORMATION_SCHEMA
数据库,除了数据库级别部分撤销的数据库。 -
允许使用
SHOW CREATE VIEW
语句。这特权也需要用于EXPLAIN
。 -
允许使用
SHUTDOWN
和RESTART
语句、mysqladmin shutdown命令和mysql_shutdown()
C API函数。 -
SUPER
是一个非常强大和广泛的权限,应该谨慎地授予。如果一个帐户需要执行SUPER
操作的子集,可以考虑授予动态权限,每个权限都具有更有限的能力。请参阅Dynamic Privilege Descriptions。NoteSUPER
已经弃用,预计将在未来的 MySQL 版本中删除。请参阅Migrating Accounts from SUPER to Dynamic Privileges。SUPER
影响以下操作和服务器行为:-
启用在运行时更改系统变量:
-
启用服务器配置更改全局系统变量,以使用
SET GLOBAL
和SET PERSIST
。对应的动态权限是
SYSTEM_VARIABLES_ADMIN
。 -
启用设置受限制的会话系统变量,需要特殊权限。
对应的动态权限是
SESSION_VARIABLES_ADMIN
。
-
-
启用更改全局事务特性(请参阅Section 15.3.7, “SET TRANSACTION Statement”)。
对应的动态权限是
SYSTEM_VARIABLES_ADMIN
。 -
启用帐户启动和停止复制,包括 Group Replication。
对应的动态权限是
REPLICATION_SLAVE_ADMIN
对于常规复制,GROUP_REPLICATION_ADMIN
对于 Group Replication。 -
启用使用
CHANGE REPLICATION SOURCE TO
和CHANGE REPLICATION FILTER
语句。对应的动态权限是
REPLICATION_SLAVE_ADMIN
。 -
启用二进制日志控制,通过
PURGE BINARY LOGS
和BINLOG
语句。对应的动态权限是
BINLOG_ADMIN
。 -
启用设置授权ID执行视图或存储程序时的有效身份。具有该权限的用户可以在视图或存储程序的
DEFINER
属性中指定任何帐户。对应的动态权限是
SET_ANY_DEFINER
和ALLOW_NONEXISTENT_DEFINER
。 -
启用使用
CREATE SERVER
、ALTER SERVER
和DROP SERVER
语句。 -
启用使用mysqladmin debug命令。
-
启用InnoDB加密密钥轮换。
对应的动态权限是
ENCRYPTION_KEY_ADMIN
。 -
启用版本令牌函数。
对应的动态权限是
VERSION_TOKEN_ADMIN
。 -
启用授予和撤销角色,使用
GRANT
语句的WITH ADMIN OPTION
子句,以及非空<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
特权来创建或更改存储函数,如果启用二进制日志记录,详见第27.7节,“Stored Program Binary Logging”。 -
-
启用触发器操作。您必须对该表拥有该特权,以便创建、删除、执行或显示该表的触发器。
当触发器激活(由具有执行
INSERT
、UPDATE
或DELETE
语句权限的用户激活)时,触发器执行需要该用户仍然拥有该表的TRIGGER
特权。 -
启用对表中的行进行更新。
-
本权限指定符表示“无权限。”它用于在全局级别使用
GRANT
指定子句,如WITH GRANT OPTION
,而不指定特定的帐户权限列表中。SHOW GRANTS
显示USAGE
,表示帐户在权限级别上没有权限。
动态权限是在运行时定义的,而不是静态权限,它们是服务器的一部分。以下列表描述了MySQL中的每个动态权限。
大多数动态权限是在服务器启动时定义的。其他的由特定的组件或插件定义,如权限描述中所示。在这种情况下,权限除非定义它的组件或插件启用,否则不可用。
某些SQL语句可能具有比这里所示的更具体的权限要求。如果是这样,语句的描述将提供详细信息。
-
启用安全检查,以防止操作使存储对象变为孤儿或使当前孤儿对象被采纳。没有这个权限,任何尝试创建孤儿SQL过程、函数或视图都会导致错误。使用
CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TRIGGER
、CREATE EVENT
或CREATE VIEW
也需要SET_ANY_DEFINER
,以便使定义器不同于当前用户。详细信息,请见孤儿存储对象。
-
为双密码功能,权限启用了对
ALTER USER
和SET PASSWORD
语句的RETAIN CURRENT PASSWORD
和DISCARD OLD PASSWORD
子句的使用,以便对自己的账户进行操作。这权限是必要的,因为大多数用户只需要一个密码。如果账户需要对所有账户进行操作,可以授予
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
权限。关于双密码的使用,详见第8.2.15节,“密码管理”。
-
允许查询被“abort”项在审核日志过滤器中阻止。这权限由第8.4.5节,“MySQL Enterprise Audit”定义。
使用
SYSTEM_USER
权限创建的账户将自动分配AUDIT_ABORT_EXEMPT
权限。同时,对于已经存在的账户,如果在升级过程中没有分配该权限,也将分配该权限。因此,拥有SYSTEM_USER
权限的账户可以用来恢复系统在审核配置错误后。 -
启用审核日志配置。这权限由第8.4.5节,“MySQL Enterprise Audit”定义。
-
启用执行
LOCK INSTANCE FOR BACKUP
语句和访问性能_schemalog_status
表。Note除了
BACKUP_ADMIN
之外,SELECT
权限在log_status
表中也需要。BACKUP_ADMIN
权限在升级到MySQL 8.4的过程中自动授予具有RELOAD
权限的用户。 -
系统变量
authentication_policy
对CREATE USER
和ALTER USER
语句中的身份验证相关子句施加一定的限制。拥有AUTHENTICATION_POLICY_ADMIN
权限的用户不受这些限制的约束(出现警告语句)。关于
authentication_policy
的约束详细信息,请查看该变量的描述。 -
通过
PURGE BINARY LOGS
和BINLOG
语句来控制二进制日志。 -
启用设置系统变量
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
是激活 MySQL 服务器离线模式的必要条件,该模式通过将offline_mode
系统变量的值设置为ON
来实现。The
CONNECTION_ADMIN
权限使得拥有该权限的管理员可以绕过这些系统变量的影响:-
init_connect
:服务器不执行init_connect
系统变量的内容,当CONNECTION_ADMIN
客户端连接时。 -
max_connections
:服务器接受来自CONNECTION_ADMIN
客户端的连接,即使max_connections
系统变量配置的连接限制已经达到。 -
offline_mode
:在离线模式下(offline_mode
启用),服务器不在下一个客户端请求时终止CONNECTION_ADMIN
客户端连接,并接受来自CONNECTION_ADMIN
客户端的新连接。 -
read_only
:CONNECTION_ADMIN
客户端的更新操作可以在read_only
系统变量启用时进行。该操作适用于明确的表更新和账户管理语句,如GRANT
和REVOKE
,这些语句隐式更新表。
Group Replication 组成员需要
CONNECTION_ADMIN
权限,以避免在其中一个服务器被置于离线模式时终止 Group Replication 连接。如果 MySQL 通信栈在使用(group_replication_communication_stack = MYSQL
),那么没有该权限,一个处于离线模式的成员将被从组中剔除。 -
-
启用
InnoDB
加密密钥轮换。 -
启用用户管理防火墙规则的权限。这权限由
MYSQL_FIREWALL
插件定义;见第8.4.7节,“MySQL Enterprise Firewall”。 -
拥有该权限的用户免受防火墙限制。该权限由
MYSQL_FIREWALL
插件定义;见第8.4.7节,“MySQL Enterprise Firewall”。 -
启用用户更新自己的防火墙规则。这权限由
MYSQL_FIREWALL
插件定义;见第8.4.7节,“MySQL Enterprise Firewall”。 -
启用
FLUSH OPTIMIZER_COSTS
语句。 -
启用
FLUSH PRIVILEGES
语句。 -
启用使用
FLUSH STATUS
语句。 -
启用使用
FLUSH TABLES
语句。 -
启用使用
FLUSH USER_RESOURCES
语句。 -
启用账户开始和停止Group Replication使用
START GROUP REPLICATION
和STOP GROUP REPLICATION
语句,改变全局设置的group_replication_consistency
系统变量,并使用group_replication_set_write_concurrency()
和group_replication_set_communication_protocol()
函数。授予用于管理服务器的成员的账户。 -
允许账户用于Group Replication的组通信连接。必须授予恢复用户,当MySQL通信栈用于Group Replication(
group_replication_communication_stack=MYSQL
)时。 -
启用账户激活和停用redo日志归档。
-
启用使用
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
语句来启用或禁用redo日志记录。 -
启用了帐户添加和删除字典项的功能,使用
masking_dictionary_term_add()
和masking_dictionary_term_remove()
组件函数。帐户还需要这个动态特权来删除一个完整的字典,使用masking_dictionary_remove()
函数,该函数删除了当前在mysql.masking_dictionaries
表中的指定字典的所有项。请参见第8.5章,“MySQL Enterprise Data Masking and De-Identification”.
-
启用了用户或角色的共享和同步在所有启用了
NDB
存储引擎的MySQL服务器上。这个特权只有在启用了NDB
存储引擎时可用。对给定用户或角色的任何更改或撤销的特权将立即与所有连接的MySQL服务器同步(SQL节点)。您应该注意,在多个SQL节点上执行的多个语句可能不一定会在同一个顺序执行。因此,强烈建议在单个指定的SQL节点上进行所有用户管理操作。
NDB_STORED_USER
是一个全局特权,必须使用ON *.*
来授予或撤销。对这个特权的任何其他范围设置将导致错误。这个特权可以授予大多数应用程序和管理用户,但不能授予系统保留帐户,如mysql.session@localhost
或mysql.infoschema@localhost
。拥有
NDB_STORED_USER
特权的用户将在NDB
中存储(并且在所有SQL节点上共享),同样,拥有这个特权的角色的用户也将在NDB
中存储。但是,仅授予角色的用户NDB_STORED_USER
特权的用户将不会在NDB
中存储;每个NDB
存储用户都需要授予这个特权。关于在
NDB
中的详细信息,请参见第25.6.13章,“Privilege Synchronization and NDB_STORED_USER”. -
启用了
OPTIMIZE LOCAL TABLE
和OPTIMIZE NO_WRITE_TO_BINLOG TABLE
语句。 -
对无密码用户账户应用此权限:
-
在创建账户时,执行
CREATE USER
语句创建无密码账户的用户必须拥有PASSWORDLESS_USER_ADMIN
权限。 -
在复制上下文中,
PASSWORDLESS_USER_ADMIN
权限适用于复制用户,并启用ALTER USER ... MODIFY
语句对配置为无密码身份验证的用户账户的复制。
关于无密码身份验证的信息,请见WebAuthn Passwordless Authentication.
-
-
对拥有
SYSTEM_VARIABLES_ADMIN
权限的用户,PERSIST_RO_VARIABLES_ADMIN
启用使用SET PERSIST_ONLY
语句将全局系统变量持久化到数据目录中的mysqld-auto.cnf
选项文件中。这条语句类似于SET PERSIST
语句,但不会修改运行时的全局系统变量值。这使SET PERSIST_ONLY
语句适用于配置只读系统变量,可以在服务器启动时设置。 -
启用帐户以
PRIVILEGE_CHECKS_USER
的身份在复制通道上执行,执行 mysqlbinlog 输出的BINLOG
语句。授予使用CHANGE REPLICATION SOURCE TO
语句的帐户,以为复制通道提供安全上下文,并处理复制通道上的错误。除REPLICATION_APPLIER
权限外,还需要授予帐户执行由复制通道接收的交易或在 mysqlbinlog 输出中的交易,以便更新受影响的表。更多信息,请参见 第19.3.3节,“复制权限检查”。 -
启用帐户连接到复制源服务器,使用
START REPLICA
和STOP REPLICA
语句,使用CHANGE REPLICATION SOURCE TO
和CHANGE REPLICATION FILTER
语句。授予用于连接到当前服务器的复制源服务器的帐户。该权限不适用于组复制;使用GROUP_REPLICATION_ADMIN
。 -
启用资源组管理,包括创建、修改和删除资源组,以及将线程和语句分配给资源组。具有该权限的用户可以执行与资源组相关的任何操作。
-
启用将线程和语句分配给资源组。具有该权限的用户可以使用
SET RESOURCE GROUP
语句和RESOURCE_GROUP
优化器提示。 -
启用授予和撤销角色,使用
WITH ADMIN OPTION
子句的GRANT
语句,以及非空<graphml>
元素内容的结果来自ROLES_GRAPHML()
函数。需要将mandatory_roles
系统变量的值设置。 -
启用持有人查看敏感系统变量的值在性能架构表
global_variables
、session_variables
、variables_by_thread
和persisted_variables
,以便于发出SELECT
语句以返回它们的值,并跟踪它们的更改在会话跟踪器中。没有这个特权的用户不能查看或跟踪这些系统变量的值。请参阅敏感系统变量的持久化。 -
启用连接到网络接口,该接口仅允许管理员连接(请参阅第7.1.12.1节,“连接接口”)。
-
对于大多数系统变量,设置会话值不需要特殊特权,可以由任何用户在当前会话中进行。对于一些系统变量,设置会话值可能会在当前会话之外产生影响,因此是受限制的操作。对于这些变量,
SESSION_VARIABLES_ADMIN
特权启用用户设置会话值。如果系统变量受限制,需要特殊特权来设置会话值,变量描述中将指出该限制。例如包括
binlog_format
、sql_log_bin
和sql_log_off
。《
SESSION_VARIABLES_ADMIN
》特权是SYSTEM_VARIABLES_ADMIN
和SUPER
特权的子集。拥有这两个特权的用户也可以设置受限的会话变量,并且隐式地拥有SESSION_VARIABLES_ADMIN
特权,不需要明确授予SESSION_VARIABLES_ADMIN
特权。 -
允许在执行视图或存储程序时设置有效身份验证ID。拥有该特权的用户可以将任何帐户指定为
CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TRIGGER
、CREATE EVENT
、ALTER EVENT
、CREATE VIEW
和ALTER VIEW
的定义者身份验证ID。否则,只能指定有效身份验证ID。存储程序在指定帐户的权限下执行,因此请遵循第27.6节,“存储对象访问控制”中的风险最小化指南。
-
允许用户访问所有存储程序(存储过程和函数)的定义和属性,即使用户不是该程序的定义者身份验证ID。这包括:
-
信息Schema
ROUTINES
表的内容。 -
SHOW CREATE FUNCTION 和 SHOW CREATE PROCEDURE 语句。
SHOW_ROUTINE
可以代替授予具有更受限的范围的权限,以允许访问存储程序定义。 (即管理员可以撤销对所有用户的全局SELECT
权限,并授予SHOW_ROUTINE
代替。) 这样可以使账户备份存储程序而不需要广泛的权限。 -
-
拥有该权限的用户的查询不受Rewriter插件的重写(见Section 7.6.4, “Rewriter 查询重写插件”)。
该权限应该授予执行管理或控制语句的用户,以及PRIVILEGE_CHECKS_USER账户(见Section 19.3.3, “Replication 权限检查”),用于从复制源应用语句。
-
《
SYSTEM_USER
》权限将系统用户与常规用户区分开来:-
拥有
SYSTEM_USER
权限的用户是系统用户。 -
没有
SYSTEM_USER
权限的用户是常规用户。
《
SYSTEM_USER
》权限对用户的其他权限和账户保护都有影响:-
系统用户可以修改系统和常规账户。即,拥有适当权限执行某操作的用户由于拥有
SYSTEM_USER
权限,可以执行该操作的系统账户。系统账户只能由系统用户拥有适当权限的用户修改,而不是常规用户。 -
常规用户拥有适当权限可以修改常规账户,但不能修改系统账户。常规账户可以由系统和常规用户拥有适当权限的用户修改。
这也意味着,拥有
SYSTEM_USER
特权的用户创建的数据库对象不能被没有该特权的用户修改或删除。这也适用于由拥有该特权的定义者的存储程序。更多信息,请见第8.2.11节,“Account Categories”。
使用
SYSTEM_USER
特权保护的系统账户不能被普通账户修改,但是拥有SYSTEM_USER
特权的账户可以直接修改该系统架构中的授权表。为了获得完整的保护,不要将普通账户授予该架构的权限。请见Protecting System Accounts Against Manipulation by Regular Accounts。如果使用Section 8.4.5, “MySQL Enterprise Audit”中的
SYSTEM_USER
特权的账户,可以自动获得AUDIT_ABORT_EXEMPT
特权,这使得他们的查询可以在配置了“abort”项的过滤器将其阻止的情况下继续执行。拥有SYSTEM_USER
特权的账户可以因此被用来在审核配置错误后重新获取系统访问权限。 -
-
影响以下操作和服务器行为:
-
启用实时系统变量更改:
-
启用服务器配置更改到全局系统变量中使用
SET GLOBAL
和SET PERSIST
。 -
启用服务器配置更改到全局系统变量中使用
SET PERSIST_ONLY
,如果用户同时拥有PERSIST_RO_VARIABLES_ADMIN
特权。 -
启用设置受限制的会话系统变量,这些变量需要特殊特权。实际上
SYSTEM_VARIABLES_ADMIN
隐含SESSION_VARIABLES_ADMIN
没有明确授予SESSION_VARIABLES_ADMIN
特权。
-
-
启用对全局事务特征的更改(见第15.3.7节,“SET TRANSACTION 语句”)。
-
-
启用用户在
table_encryption_privilege_check
启用时override默认加密设置;见定义加密默认值。 -
启用遥测日志配置。这权限由
TELEMETRY_LOG_ADMIN
定义的插件,通过MySQL HeatWave on AWS部署。 -
启用privileged连接。连接到服务器时,privileged连接忽略事务限制,允许连接到服务器以增加事务限制、删除限制或杀死正在运行的事务。这权限不默认授予任何用户。要建立privileged连接,用户必须具有
TP_CONNECTION_ADMIN
权限。privileged连接可以执行语句并在事务限制定义的限制下启动事务。privileged连接将被置于
Admin
线程组中。见privileged连接。 -
设置
gtid_next
系统变量到AUTOMATIC:
或TAG
UUID:
的 replication源服务器上。另外,在源服务器上至少需要一个TAG
:NUMBERSYSTEM_VARIABLES_ADMIN
、SESSION_VARIABLES_ADMIN
或REPLICATION_APPLIER
权限来设置gtid_next
到这些值之一。必须将
REPLICATION_CHECKS_APPLIER
和REPLICATION_APPLIER
权限授予REPLICATION_CHECKS_APPLIER
,以便将gtid_next
设置为AUTOMATIC:
。这将在启动复制应用程序线程时进行检查。TAG
此外,还需要授予设置
gtid_purged
服务器系统变量的权限。有关使用标记GTIDs的更多信息,请查看
gtid_next
的描述,以及第19.1.4节,“在线更改GTID模式”。 -
启用版本令牌函数的执行。这权限由
version_tokens
插件定义;请查看第7.6.6节,“版本令牌”。 -
启用
XA RECOVER
语句的执行;请查看第15.3.8.1节,“XA事务SQL语句”。在MySQL 8.4之前,任何用户都可以执行
XA RECOVER
语句,以便发现未完成的XA事务的XID值,从而可能导致其他用户提交或回滚XA事务。在MySQL 8.4中,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 中动态权限的工作机制。讨论使用术语 “components” 但同样适用于插件。
服务器管理员应该了解哪些服务器组件定义动态权限。对于 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
选项)。 -
动态权限分配在
global_grants
中是持久的。它们不会在服务器关闭时被删除。
示例:以下语句授予用户u1
控制复制(包括 Group Replication)在复制服务器上,并修改系统变量的权限:
GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN
ON *.* TO 'u1'@'localhost';
授予的动态权限在SHOW GRANTS
语句的输出和INFORMATION_SCHEMA
USER_PRIVILEGES
表中的输出中出现。
对于GRANT
和REVOKE
在全局级别,任何命名的权限,如果不能被静态识别,会被检查当前注册的动态权限,如果找到,授予。否则,出现错误,以表示未知权限标识符。
对于GRANT
和REVOKE
在全局级别,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
删除前准备好账户:
-
执行以下查询以确定授予
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
查询应该产生一个空结果集。