8.2 访问控制和账户管理
8.2.1 账户用户名和密码
8.2.2 MySQL 提供的权限
8.2.3 授权表
8.2.4 指定账户名称
8.2.5 指定角色名称
8.2.6 访问控制,第一阶段:连接验证
8.2.7 访问控制,第二阶段:请求验证
8.2.8 添加账户、分配权限和删除账户
8.2.9 保留账户
8.2.10 使用角色
8.2.11 账户类别
8.2.12 使用部分撤销限制权限
8.2.13 权限更改何时生效
8.2.14 分配账户密码
8.2.15 密码管理
8.2.16 服务器处理过期密码
8.2.17 可插拔认证
8.2.18 多因素认证
8.2.19 代理用户
8.2.20 账户锁定
8.2.21 设置账户资源限制
8.2.22 解决连接到 MySQL 的问题
8.2.23 基于 SQL 的账户活动审计
MySQL 允许创建账户,允许客户端用户连接到服务器并访问服务器管理的数据。 MySQL 权限系统的主要功能是对来自特定主机连接的用户进行身份验证,并将该用户与数据库上的权限(如SELECT
、INSERT
、UPDATE
和DELETE
)关联起来。其他功能包括授予管理操作的权限。
为了控制哪些用户可以连接,每个账户可以分配身份验证凭据,如密码。 MySQL 账户的用户界面包括 SQL 语句,如CREATE USER
、GRANT
和REVOKE
。参见第 15.7.1 节,“账户管理语句”。
MySQL 权限系统确保所有用户只能执行其被允许的操作。作为用户,当你连接到 MySQL 服务器时,你的身份由你连接的主机和你指定的用户名确定。连接后发出请求时,系统根据你的身份和你想要做的事情授予权限。
MySQL 在识别你时考虑你的主机名和用户名,因为没有理由假设给定的用户名属于所有主机上的同一个人。例如,从office.example.com
连接的用户joe
不一定是从home.example.com
连接的用户joe
。MySQL 通过使你能够区分在不同主机上具有相同名称的用户来处理这个问题:你可以为从office.example.com
连接的joe
授予一组连接权限,为从home.example.com
连接的joe
授予另一组连接权限。要查看特定账户有哪些权限,使用SHOW GRANTS
语句。例如:
SHOW GRANTS FOR 'joe'@'office.example.com'; SHOW GRANTS FOR 'joe'@'home.example.com';
在内部,服务器将权限信息存储在mysql
系统数据库的授权表中。MySQL 服务器在启动时将这些表的内容读入内存,并基于内存中的授权表副本做出访问控制决策。
当你运行连接到服务器的客户端程序时,MySQL 访问控制涉及两个阶段:
第一阶段: 服务器根据你的身份接受或拒绝连接,并根据你是否能通过提供正确密码验证你的身份。
第二阶段: 假设你可以连接,服务器会检查你发出的每个语句,以确定你是否有足够的权限执行它。例如,如果你尝试从数据库中的表中选择行或删除数据库中的表,服务器会验证你是否具有表的SELECT
权限或数据库的DROP
权限。
有关每个阶段发生的详细描述,请参见第 8.2.6 节,“访问控制,阶段 1:连接验证”和第 8.2.7 节,“访问控制,阶段 2:请求验证”。有关诊断与权限相关问题的帮助,请参见第 8.2.22 节,“连接到 MySQL 时出现问题的故障排除”。
如果你的权限在连接时被更改(无论是由你自己还是其他人),这些更改不一定会立即生效于你发出的下一条语句。有关服务器何时重新加载授权表的详细信息,请参见第 8.2.13 节,“权限更改何时生效”。
有一些事情你不能通过 MySQL 权限系统做到:
- 你不能明确指定某个用户应被拒绝访问。也就是说,你不能明确匹配一个用户然后拒绝连接。
- 你不能指定用户有权限在数据库中创建或删除表,但不能创建或删除数据库本身。
- 密码对一个账户全局有效。你不能将密码与特定对象(如数据库、表或例程)关联起来。
8.2.1 账户用户名和密码
MySQL 将账户存储在mysql
系统数据库的user
表中。账户根据用户名称和用户可以连接到服务器的客户端主机或主机来定义。有关user
表中账户表示的信息,请参见 第 8.2.3 节,“授权表”。
一个账户可能还有身份验证凭据,比如密码。这些凭据由账户身份验证插件处理。MySQL 支持多种身份验证插件。其中一些使用内置身份验证方法,而其他一些则启用使用外部身份验证方法进行身份验证。参见 第 8.2.17 节,“可插拔身份验证”。
MySQL 和您的操作系统在使用用户名称和密码方面有几个区别:
- 用户名,用于 MySQL 身份验证目的,与 Windows 或 Unix 中用于登录的用户名无关。在 Unix 上,默认情况下,大多数 MySQL 客户端尝试使用当前 Unix 用户名作为 MySQL 用户名登录,但这仅仅是为了方便。默认设置可以轻松覆盖,因为客户端程序允许使用
-u
或--user
选项指定任何用户名。这意味着任何人都可以尝试使用任何用户名连接到服务器,因此除非所有 MySQL 账户都有密码,否则无法以任何方式使数据库安全。任何指定了没有密码的账户的用户名的人都可以成功连接到服务器。 - MySQL 用户名称最长可达 32 个字符。操作系统用户名称可能具有不同的最大长度。
警告
MySQL 用户名称长度限制是硬编码在 MySQL 服务器和客户端中的,试图通过修改mysql
数据库中表的定义来规避它不起作用。
除了通过第三章,“升级 MySQL”中描述的过程之外,您绝对不应以任何方式更改mysql
数据库中表的结构。试图以任何其他方式重新定义 MySQL 系统表会导致未定义和不受支持的行为。服务器可以忽略由于这些修改而变得畸形的行。 - 为使用内置身份验证方法的账户验证客户端连接,服务器使用存储在
user
表中的密码。这些密码与用于登录操作系统的密码不同。您用于登录 Windows 或 Unix 机器的“外部”密码与您用于访问该机器上的 MySQL 服务器的密码之间没有必要的联系。
如果服务器使用其他插件对客户端进行身份验证,插件实现的身份验证方法可能会或可能不会使用存储在user
表中的密码。在这种情况下,可能还会使用外部密码进行 MySQL 服务器的身份验证。 - 存储在
user
表中的密码使用特定于插件的算法进行加密。 - 如果用户名和密码只包含 ASCII 字符,则无论字符集设置如何,都可以连接到服务器。要在用户名或密码包含非 ASCII 字符时启用连接,客户端应用程序应使用
MYSQL_SET_CHARSET_NAME
选项和适当的字符集名称作为参数调用mysql_options()
C API 函数。这会导致使用指定的字符集进行身份验证。否则,除非服务器默认字符集与身份验证默认值中的编码相同,否则身份验证将失败。
标准的 MySQL 客户端程序支持一个--default-character-set
选项,会导致调用mysql_options()
如上所述。此外,支持字符集自动检测,如第 12.4 节,“连接字符集和校对规则”所述。对于不基于 C API 的连接器,可能会提供类似于mysql_options()
的等效选项供使用。请查阅连接器文档。
前述注意事项不适用于ucs2
、utf16
和utf32
,这些字符集不被允许作为客户端字符集。
MySQL 安装过程会使用初始root
账户填充授权表,如第 2.9.4 节,“保护初始 MySQL 账户”所述,该节还讨论了如何为其分配密码。之后,通常使用CREATE USER
、DROP USER
、GRANT
和REVOKE
等语句设置、修改和删除 MySQL 账户。参见第 8.2.8 节,“添加账户、分配权限和删除账户”,以及第 15.7.1 节,“账户管理语句”。
要使用命令行客户端连接到 MySQL 服务器,根据要使用的账户,指定用户名和密码选项如下所示:
$> mysql --user=finley --password *db_name*
如果您喜欢简短选项,命令如下:
$> mysql -u finley -p *db_name*
如果在命令行上省略了--password
或-p
选项后面的密码值(如上所示),客户端会提示输入密码。或者,密码可以在命令行上指定:
$> mysql --user=finley --password=*password* *db_name* $> mysql -u finley -p*password* *db_name*
如果使用-p
选项,则-p
和后面的密码值之间不能有空格。
在命令行上指定密码应被视为不安全。请参见第 8.1.2.1 节,“密码安全的最终用户指南”。为了避免在命令行上输入密码,可以使用选项文件或登录路径文件。请参见第 6.2.2.2 节,“使用选项文件”,以及第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。
有关指定用户名、密码和其他连接参数的附加信息,请参见第 6.2.4 节,“使用命令选项连接到 MySQL 服务器”。
8.2.2 MySQL 提供的权限
授予 MySQL 账户的权限确定账户可以执行哪些操作。MySQL 权限在适用的上下文和操作级别上有所不同:
- 管理权限使用户能够管理 MySQL 服务器的操作。这些权限是全局的,因为它们不针对特定数据库。
- 数据库权限适用于数据库及其中的所有对象。这些权限可以针对特定数据库授予,也可以全局授予,以便适用于所有数据库。
- 对于诸如表、索引、视图和存储过程等数据库对象的权限可以针对数据库中的特定对象授予,也可以针对数据库中给定类型的所有对象(例如,数据库中的所有表)或全局授予所有数据库中给定类型的所有对象。
权限还有静态(内置到服务器中)或动态(在运行时定义)的区别。权限是静态还是动态会影响其是否可以授予用户账户和角色。有关静态和动态权限之间的区别,请参阅静态与动态权限。
关于账户权限的信息存储在mysql
系统数据库的授权表中。有关这些表的结构和内容的描述,请参阅第 8.2.3 节,“授权表”。MySQL 服务器在启动时将授权表的内容读入内存,并在第 8.2.13 节,“权限更改生效时”所示的情况下重新加载它们。服务器基于内存中的授权表副本做出访问控制决策。
重要
一些 MySQL 版本对授权表进行更改以添加新的权限或功能。为确保您能够利用任何新功能,每次升级 MySQL 时都要将授权表更新到当前结构。请参阅第三章,升级 MySQL。
以下各节总结了可用权限,提供了每个权限的更详细描述,并提供了使用指南。
- 可用权限摘要
- 静态权限描述
- 动态权限描述
- 授权指南
- 静态权限与动态权限
- 从 SUPER 迁移账户到动态权限
可用权限摘要
下表显示了在 GRANT
和 REVOKE
语句中使用的静态权限名称,以及授予表格中与每个权限相关联的列名以及权限适用的上下文。
表 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 |
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 |
“无权限”的同义词 | 服务器管理 |
Privilege | Grant Table Column | Context |
下表显示了在GRANT
和REVOKE
语句中使用的动态权限名称,以及权限适用的上下文。
表 8.3 GRANT 和 REVOKE 的可允许动态权限
Privilege | Context |
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 |
服务器管理 |
FLUSH_USER_RESOURCES |
服务器管理 |
GROUP_REPLICATION_ADMIN |
复制管理 |
GROUP_REPLICATION_STREAM |
复制管理 |
INNODB_REDO_LOG_ARCHIVE |
重做日志归档管理 |
INNODB_REDO_LOG_ENABLE |
重做日志管理 |
MASKING_DICTIONARIES_ADMIN |
服务器管理 |
NDB_STORED_USER |
NDB 集群 |
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_USER_ID |
服务器管理 |
SHOW_ROUTINE |
服务器管理 |
SKIP_QUERY_REWRITE |
服务器管理 |
SYSTEM_USER |
服务器管理 |
SYSTEM_VARIABLES_ADMIN |
服务器管理 |
TABLE_ENCRYPTION_ADMIN |
服务器管理 |
TELEMETRY_LOG_ADMIN |
用于 AWS 上 MySQL HeatWave 的遥测日志管理 |
TP_CONNECTION_ADMIN |
线程池管理 |
VERSION_TOKEN_ADMIN |
服务器管理 |
XA_RECOVER_ADMIN |
服务器管理 |
权限 | 上下文 |
静态权限描述
静态权限是内置到服务器中的,与在运行时定义的动态权限相对。以下列表描述了 MySQL 中每个静态权限的可用性。
特定的 SQL 语句可能具有比此处指示的更具体的权限要求。如果是这样,那么相关语句的描述将提供详细信息。
ALL
,ALL PRIVILEGES
这些权限标识符是“在给定权限级别下可用的所有权限”的简写(除了GRANT OPTION
)。例如,在全局或表级别授予ALL
将授予所有全局权限或所有表级权限。ALTER
允许使用ALTER TABLE
语句更改表的结构。ALTER TABLE
还需要CREATE
和INSERT
权限。重命名表需要在旧表上具有ALTER
和DROP
权限,在新表上具有CREATE
和INSERT
权限。ALTER ROUTINE
允许使用更改或删除存储例程(存储过程和函数)的语句。对于授予权限的范围内的例程,以及用户不是例程DEFINER
的用户的例程,还允许访问除例程定义之外的例程属性。CREATE
允许使用创建新数据库和表的语句。CREATE ROLE
允许使用CREATE ROLE
语句。(CREATE USER
权限也允许使用CREATE ROLE
语句。)请参阅 Section 8.2.10, “Using Roles”。CREATE ROLE
和DROP ROLE
权限不像CREATE USER
那样强大,因为它们只能用于创建和删除帐户。它们不能像CREATE USER
那样用于修改帐户属性或重命名帐户。请参阅用户和角色的互换性。CREATE ROUTINE
允许使用创建存储例程(存储过程和函数)的语句。对于授予权限的范围内的例程,以及用户不是被命名为例程DEFINER
的用户的例程,还可以访问除例程定义之外的例程属性。CREATE TABLESPACE
允许使用创建、修改或删除表空间和日志文件组的语句。CREATE TEMPORARY TABLES
允许使用CREATE TEMPORARY TABLE
语句创建临时表。
会话创建临时表后,服务器不会对表进行进一步的权限检查。创建会话可以对表执行任何操作,例如DROP TABLE
,INSERT
,UPDATE
或SELECT
。更多信息,请参阅 Section 15.1.20.2, “CREATE TEMPORARY TABLE Statement”。CREATE USER
允许使用ALTER USER
,CREATE ROLE
,CREATE USER
,DROP ROLE
,DROP USER
,RENAME USER
和REVOKE ALL PRIVILEGES
语句。CREATE VIEW
允许使用CREATE VIEW
语句。DELETE
允许从数据库中删除表中的行。DROP
允许使用删除(移除)现有数据库、表和视图的语句。在分区表上使用ALTER TABLE ... DROP PARTITION
语句需要DROP
权限。对于TRUNCATE TABLE
也需要DROP
权限。DROP ROLE
允许使用DROP ROLE
语句。(CREATE USER
权限也允许使用DROP ROLE
语句。)参见第 8.2.10 节,“使用角色”。CREATE ROLE
和DROP ROLE
权限不如CREATE USER
强大,因为它们只能用于创建和删除账户。它们不能像CREATE USER
那样修改账户属性或重命名账户。参见用户和角色的互换性。EVENT
允许使用创建、修改、删除或显示事件调度器事件的语句。EXECUTE
允许使用执行存储例程(存储过程和函数)的语句。对于权限被授予的范围内的例程以及用户不是例程DEFINER
的用户,还允许访问例程定义之外的例程属性。FILE
影响以下操作和服务器行为:
- 使用
LOAD DATA
和SELECT ... INTO OUTFILE
语句以及LOAD_FILE()
函数在服务器主机上读写文件。拥有FILE
权限的用户可以读取服务器主机上任何世界可读或 MySQL 服务器可读的文件。(这意味着用户可以读取任何数据库目录中的文件,因为服务器可以访问这些文件。) - 允许在 MySQL 服务器具有写入权限的任何目录中创建新文件。这包括包含实现权限表的文件的服务器数据目录。
- 允许使用
DATA DIRECTORY
或INDEX DIRECTORY
表选项用于CREATE TABLE
语句。
- 作为安全措施,服务器不会覆盖现有文件。
要限制可以读取和写入文件的位置,请将secure_file_priv
系统变量设置为特定目录。请参阅第 7.1.8 节,“服务器系统变量”。 GRANT OPTION
允许您向其他用户授予或撤销您自己拥有的权限。INDEX
允许使用创建或删除(移除)索引的语句。INDEX
适用于现有表。如果您对表具有CREATE
权限,可以在CREATE TABLE
语句中包含索引定义。INSERT
允许向数据库中的表插入行。INSERT
也适用于ANALYZE TABLE
、OPTIMIZE TABLE
和REPAIR TABLE
表维护语句。LOCK TABLES
允许使用显式的LOCK TABLES
语句来锁定具有SELECT
权限的表。这包括使用写锁,阻止其他会话读取被锁定的表。PROCESS
PROCESS
权限控制对服务器内执行的线程信息的访问(即会话执行的语句的信息)。可以通过SHOW PROCESSLIST
语句、mysqladmin processlist命令、信息模式PROCESSLIST
表和性能模式processlist
表访问线程信息,具体如下:
- 拥有
PROCESS
权限的用户可以访问所有线程的信息,甚至包括其他用户的线程。 - 没有
PROCESS
权限,非匿名用户可以访问自己的线程信息,但不能访问其他用户的线程信息,匿名用户则无法访问线程信息。
- 注意
性能模式threads
表还提供线程信息,但表访问使用不同的权限模型。请参阅第 29.12.21.8 节,“The threads Table”。PROCESS
权限还允许使用SHOW ENGINE
语句,访问INFORMATION_SCHEMA
InnoDB
表(名称以INNODB_
开头的表),以及(从 MySQL 8.0.21 开始)访问INFORMATION_SCHEMA
FILES
表。 PROXY
允许一个用户冒充或成为另一个用户。请参阅第 8.2.19 节,“Proxy Users”。REFERENCES
创建外键约束需要父表的REFERENCES
权限。RELOAD
RELOAD
使以下操作生效:
- 使用
FLUSH
语句。 - 使用mysqladmin命令等同于
FLUSH
操作:flush-hosts
,flush-logs
,flush-privileges
,flush-status
,flush-tables
,flush-threads
,refresh
和reload
。reload
命令告诉服务器重新加载授权表到内存中。flush-privileges
是reload
的同义词。refresh
命令关闭并重新打开日志文件并刷新所有表。其他flush-*
xxx*
命令执行类似于refresh
的功能,但更具体,可能在某些情况下更可取。例如,如果要刷新日志文件,flush-logs
比refresh
更好。 - 使用mysqldump选项执行各种
FLUSH
操作:--flush-logs
和--master-data
。 - 使用
RESET MASTER
和RESET REPLICA
(或在 MySQL 8.0.22 之前,RESET SLAVE
)语句。
REPLICATION CLIENT
允许使用SHOW MASTER STATUS
、SHOW REPLICA STATUS
和SHOW BINARY LOGS
语句。复制从服务器
允许帐户请求在复制源服务器上对数据库进行的更新,使用SHOW REPLICAS
(或在 MySQL 8.0.22 之前,SHOW SLAVE HOSTS
)、SHOW RELAYLOG EVENTS
和SHOW BINLOG EVENTS
语句。还需要此权限才能使用mysqlbinlog选项--read-from-remote-server
(-R
)、--read-from-remote-source
和--read-from-remote-master
。将此权限授予由副本用于连接到当前服务器作为其复制源服务器的帐户。SELECT
允许从数据库中选择表中的行。只有当SELECT
语句实际访问表时,才需要SELECT
权限。一些SELECT
语句不访问表,可以在没有任何数据库权限的情况下执行。例如,您可以使用SELECT
作为一个简单的计算器来评估不涉及表的表达式:
SELECT 1+1; SELECT PI()*2;
- 还需要
SELECT
权限用于读取列值的其他语句。例如,在UPDATE
语句中,需要为在*col_name
=expr
*赋值右侧引用的列或在DELETE
或UPDATE
语句的WHERE
子句中命名的列。
用于EXPLAIN
中使用的表或视图需要SELECT
权限,包括视图定义中的任何基础表。 显示数据库
通过发出SHOW DATABASE
语句,使账户能够查看数据库名称。没有此权限的账户只能看到他们拥有某些权限的数据库,并且如果服务器是使用--skip-show-database
选项启动的,则根本无法使用该语句。
注意
因为任何静态全局权限被视为所有数据库的权限,任何静态全局权限使用户可以使用SHOW DATABASES
或通过检查INFORMATION_SCHEMA
的SCHEMATA
表来查看所有数据库名称,除了通过部分撤销在数据库级别限制的数据库。SHOW VIEW
允许使用SHOW CREATE VIEW
语句。此权限也适用于与EXPLAIN
一起使用的视图。SHUTDOWN
允许使用SHUTDOWN
和RESTART
语句,mysqladmin shutdown命令,以及mysql_shutdown()
C API 函数。SUPER
SUPER
是一个强大且影响深远的权限,不应轻易授予。如果一个账户只需要执行SUPER
操作的子集,可能可以通过代替授予一个或多个动态权限来实现所需的权限集,每个动态权限都提供更有限的功能。请参阅动态权限描述。注意SUPER
已被弃用,您应该期望它在将来的 MySQL 版本中被移除。请参阅从 SUPER 迁移到动态权限的账户迁移。SUPER
影响以下操作和服务器行为:
- 允许在运行时更改系统变量:
- 允许对全局系统变量进行服务器配置更改,使用
SET GLOBAL
和SET PERSIST
。
相应的动态权限是SYSTEM_VARIABLES_ADMIN
。 - 允许设置需要特殊权限的受限会话系统变量。
对应的动态特权是SESSION_VARIABLES_ADMIN
。
- 参见 Section 7.1.9.1,“系统变量特权”。
- 启用对全局事务特性的更改(参见 Section 15.3.7,“SET TRANSACTION 语句”)。
对应的动态特权是SYSTEM_VARIABLES_ADMIN
。 - 启用帐户启动和停止复制,包括组复制。
对于常规复制,对应的动态特权是REPLICATION_SLAVE_ADMIN
,对于组复制是GROUP_REPLICATION_ADMIN
。 - 启用使用
CHANGE REPLICATION SOURCE TO
语句(从 MySQL 8.0.23 开始)、CHANGE MASTER TO
语句(在 MySQL 8.0.23 之前)和CHANGE REPLICATION FILTER
语句。
对应的动态特权是REPLICATION_SLAVE_ADMIN
。 - 通过
PURGE BINARY LOGS
和BINLOG
语句实现二进制日志控制。
对应的动态特权是BINLOG_ADMIN
。 - 启用在执行视图或存储程序时设置有效授权 ID。拥有此特权的用户可以在视图或存储程序的
DEFINER
属性中指定任何帐户。
对应的动态特权是SET_USER_ID
。 - 启用使用
CREATE SERVER
、ALTER SERVER
和DROP SERVER
语句。 - 启用mysqladmin debug命令的使用。
- 启用
InnoDB
加密密钥轮换。
对应的动态特权是ENCRYPTION_KEY_ADMIN
。 - 启用执行版本令牌函数。
对应的动态特权是VERSION_TOKEN_ADMIN
。 - 启用授予和撤销角色,使用
GRANT
语句的WITH ADMIN OPTION
子句,以及ROLES_GRAPHML()
函数结果中的非空元素内容。
相应的动态特权是ROLE_ADMIN
。 - 允许控制不允许非
SUPER
账户的客户端连接:
- 允许使用
KILL
语句或mysqladmin kill命令终止属于其他账户的线程。(一个账户始终可以终止自己的线程。) - 当
SUPER
客户端连接时,服务器不执行init_connect
系统变量内容。 - 即使达到由
max_connections
系统变量配置的连接限制,服务器也会接受来自SUPER
客户端的一个连接。 - 处于离线模式(启用
offline_mode
)的服务器不会在下一个客户端请求时终止SUPER
客户端连接,并接受来自SUPER
客户端的新连接。 - 当
read_only
系统变量启用时,可以执行更新操作。这适用于显式表更新,以及使用诸如GRANT
和REVOKE
等更新表的账户管理语句。
- 前述连接控制操作对应的动态特权是
CONNECTION_ADMIN
。
- 如果启用了二进制日志记录,您可能还需要
SUPER
特权来创建或更改存储函数,如 Section 27.7, “Stored Program Binary Logging”中所述。 TRIGGER
启用触发器操作。您必须对表具有此特权才能为该表创建、删除、执行或显示触发器。
当触发器被激活(由具有执行INSERT
、UPDATE
或DELETE
语句权限的用户激活,与触发器相关联的表),触发器执行要求定义触发器的用户仍然对表具有TRIGGER
特权。UPDATE
允许更新数据库中表中的行。USAGE
此特权说明符代表“无特权”。它在全局级别与GRANT
一起使用,用于指定诸如WITH GRANT OPTION
之类的子句,而不在特权列表中命名特定帐户特权。SHOW GRANTS
显示USAGE
以指示帐户在特权级别上没有特权。
动态特权描述
动态特权在运行时定义,与内置于服务器中的静态特权相对。以下列表描述了 MySQL 中每个可用的动态特权。
大多数动态特权在服务器启动时定义。其他特权由特定组件或插件定义,如特权描述中所示。在这种情况下,除非启用定义它的组件或插件,否则该特权不可用。
特定的 SQL 语句可能具有比此处指示的更具体的特权要求。如果是这样,相关语句的描述提供详细信息。
APPLICATION_PASSWORD_ADMIN
(在 MySQL 8.0.14 中添加)
对于双密码功能,此特权允许使用RETAIN CURRENT PASSWORD
和DISCARD OLD PASSWORD
子句,适用于您自己的帐户的ALTER USER
和SET PASSWORD
语句。大多数用户只需要一个密码,因此需要此特权来操作自己的次要密码。
如果要允许帐户操作所有帐户的次要密码,则应授予CREATE USER
特权,而不是APPLICATION_PASSWORD_ADMIN
。
有关双密码使用的更多信息,请参见第 8.2.15 节,“密码管理”。AUDIT_ABORT_EXEMPT
(在 MySQL 8.0.28 中添加)
允许在审计日志过滤器中由“中止”项目阻止的查询。此特权由audit_log
插件定义;请参见第 8.4.5 节,“MySQL 企业审计”。
在 MySQL 8.0.28 或更高版本中创建的带有SYSTEM_USER
权限的帐户在创建时会自动分配AUDIT_ABORT_EXEMPT
权限。在进行 MySQL 8.0.28 或更高版本的升级过程中,如果没有现有帐户被分配该权限,则具有SYSTEM_USER
权限的现有帐户也会被分配AUDIT_ABORT_EXEMPT
权限。因此,具有SYSTEM_USER
权限的帐户可用于在审核配置错误后恢复对系统的访问。AUDIT_ADMIN
启用审核日志配置。此权限由audit_log
插件定义;请参阅第 8.4.5 节,“MySQL 企业审计”。BACKUP_ADMIN
启用执行LOCK INSTANCE FOR BACKUP
语句和访问性能模式log_status
表。
注意
除了BACKUP_ADMIN
权限外,还需要对log_status
表的SELECT
权限才能访问。
在从早期版本升级到 MySQL 8.0 时,具有RELOAD
权限的用户在执行就地升级时会自动被授予BACKUP_ADMIN
权限。AUTHENTICATION_POLICY_ADMIN
(MySQL 8.0.27 中新增)authentication_policy
系统变量对CREATE USER
和ALTER USER
语句中的身份验证相关子句的使用施加了一定的约束。具有AUTHENTICATION_POLICY_ADMIN
权限的用户不受这些约束的限制。(对于否则不允许的语句会发出警告。)
有关authentication_policy
强加的约束的详细信息,请参阅该变量的描述。BINLOG_ADMIN
通过PURGE BINARY LOGS
和BINLOG
语句启用二进制日志控制。BINLOG_ENCRYPTION_ADMIN
启用设置系统变量binlog_encryption
,该变量激活或停用二进制日志文件和中继日志文件的加密。这种能力不是由BINLOG_ADMIN
、SYSTEM_VARIABLES_ADMIN
或SESSION_VARIABLES_ADMIN
权限提供的。相关的系统变量binlog_rotate_encryption_master_key_at_startup
,在服务器重新启动时自动旋转二进制日志主密钥,不需要此权限。CLONE_ADMIN
启用执行CLONE
语句。包括BACKUP_ADMIN
和SHUTDOWN
权限。CONNECTION_ADMIN
启用使用KILL
语句或mysqladmin kill 命令来终止属于其他账户的线程。 (一个账户始终可以终止自己的线程。)启用设置与客户端连接相关的系统变量,或绕过与客户端连接相关的限制。从 MySQL 8.0.31 开始,需要CONNECTION_ADMIN
权限来激活 MySQL 服务器的离线模式,这是通过将offline_mode
系统变量的值更改为ON
来完成的。CONNECTION_ADMIN
权限使具有该权限的管理员可以绕过这些系统变量的影响:
init_connect
: 当CONNECTION_ADMIN
客户端连接时,服务器不会执行init_connect
系统变量内容。max_connections
: 即使达到由max_connections
系统变量配置的连接限制,服务器也会接受来自CONNECTION_ADMIN
客户端的一个连接。offline_mode
:处于离线模式的服务器(启用了offline_mode
)不会在下一个客户端请求时终止CONNECTION_ADMIN
客户端连接,并接受来自CONNECTION_ADMIN
客户端的新连接。read_only
:即使启用了read_only
系统变量,也可以执行来自CONNECTION_ADMIN
客户端的更新。这适用于显式表更新,以及更新隐式更新表的账户管理语句,如GRANT
和REVOKE
。
- Group Replication 组成员需要
CONNECTION_ADMIN
特权,以便在涉及的服务器中的一个处于离线模式时,Group Replication 连接不会被终止。如果使用 MySQL 通信堆栈(group_replication_communication_stack = MYSQL
),没有此特权,处于离线模式的成员将被从组中驱逐。 ENCRYPTION_KEY_ADMIN
启用InnoDB
加密密钥轮换。FIREWALL_ADMIN
启用用户管理任何用户的防火墙规则。此特权由MYSQL_FIREWALL
插件定义;参见第 8.4.7 节,“MySQL 企业防火墙”。FIREWALL_EXEMPT
(MySQL 8.0.27 中添加)
拥有此特权的用户不受防火墙限制。此特权由MYSQL_FIREWALL
插件定义;参见第 8.4.7 节,“MySQL 企业防火墙”。FIREWALL_USER
启用用户更新其自己的防火墙规则。此特权由MYSQL_FIREWALL
插件定义;参见第 8.4.7 节,“MySQL 企业防火墙”。FLUSH_OPTIMIZER_COSTS
(MySQL 8.0.23 中添加)
启用FLUSH OPTIMIZER_COSTS
语句的使用。FLUSH_STATUS
(MySQL 8.0.23 中添加)
启用FLUSH STATUS
语句的使用。FLUSH_TABLES
(MySQL 8.0.23 中添加)
启用FLUSH TABLES
语句的使用。FLUSH_USER_RESOURCES
(MySQL 8.0.23 中添加)
允许使用FLUSH USER_RESOURCES
语句。GROUP_REPLICATION_ADMIN
允许账户启动和停止组复制,使用START GROUP REPLICATION
和STOP GROUP REPLICATION
语句,更改group_replication_consistency
系统变量的全局设置,并使用group_replication_set_write_concurrency()
和group_replication_set_communication_protocol()
函数。授予此权限给用于管理属于复制组的服务器的账户。GROUP_REPLICATION_STREAM
允许用户账户用于建立组复制的组通信连接。当 MySQL 通信堆栈用于组复制时(group_replication_communication_stack=MYSQL
),必须授予恢复用户此权限。INNODB_REDO_LOG_ARCHIVE
允许账户激活和停用重做日志归档。INNODB_REDO_LOG_ENABLE
允许使用ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
语句启用或禁用重做日志。MySQL 8.0.21 中引入。
参见禁用重做日志。MASKING_DICTIONARIES_ADMIN
允许账户使用masking_dictionary_term_add()
和masking_dictionary_term_remove()
组件函数添加和移除字典术语。账户还需要此动态权限使用masking_dictionary_remove()
函数移除完整字典,该函数会移除mysql.masking_dictionaries
表中与命名字典相关的所有术语。
请参阅 第 8.5 节,“MySQL 企业数据脱敏和去标识化”。NDB_STORED_USER
使用户或角色及其权限能够在所有加入给定 NDB 集群的NDB
启用的 MySQL 服务器之间共享和同步。此特权仅在启用NDB
存储引擎时可用。
对给定用户或角色的权限更改或撤销会立即与所有连接的 MySQL 服务器(SQL 节点)同步。您应该注意,不能保证来自不同 SQL 节点的影响权限的多个语句以相同顺序在所有 SQL 节点上执行。因此,强烈建议所有用户管理都从一个指定的 SQL 节点进行。NDB_STORED_USER
是一个全局特权,必须使用ON *.*
进行授予或撤销。尝试为此特权设置任何其他范围将导致错误。这个特权可以授予大多数应用程序和管理用户,但不能授予系统保留帐户,如mysql.session@localhost
或mysql.infoschema@localhost
。
被授予NDB_STORED_USER
特权的用户存储在NDB
中(因此被所有 SQL 节点共享),具有此特权的角色也是如此。仅仅被授予具有NDB_STORED_USER
的角色的用户 不 存储在NDB
中;每个NDB
存储的用户必须显式授予该特权。
有关在NDB
中如何工作的更详细信息,请参阅 第 25.6.13 节,“特权同步和 NDB_STORED_USER”。NDB_STORED_USER
特权从 NDB 8.0.18 开始提供。PASSWORDLESS_USER_ADMIN
(在 MySQL 8.0.27 中添加)此特权适用于无密码用户帐户:
- 对于帐户创建,执行
CREATE USER
创建无密码帐户的用户必须具有PASSWORDLESS_USER_ADMIN
特权。 - 在复制环境中,
PASSWORDLESS_USER_ADMIN
特权适用于复制用户,并允许为配置为无密码身份验证的用户帐户复制ALTER USER ... MODIFY
语句。
- 有关无密码身份验证的信息,请参阅 FIDO 无密码身份验证。
PERSIST_RO_VARIABLES_ADMIN
对于还具有SYSTEM_VARIABLES_ADMIN
的用户,PERSIST_RO_VARIABLES_ADMIN
允许使用SET PERSIST_ONLY
将全局系统变量持久化到数据目录中的mysqld-auto.cnf
选项文件中。此语句类似于SET PERSIST
,但不修改运行时全局系统变量值。这使得SET PERSIST_ONLY
适用于配置只能在服务器启动时设置的只读系统变量。
参见 第 7.1.9.1 节,“系统变量权限”。REPLICATION_APPLIER
启用账户作为复制通道的PRIVILEGE_CHECKS_USER
,并在mysqlbinlog输出中执行BINLOG
语句。授予此权限给通过CHANGE REPLICATION SOURCE TO
(从 MySQL 8.0.23 开始)或CHANGE MASTER TO
(在 MySQL 8.0.23 之前)分配的账户,以为复制通道提供安全上下文,并处理这些通道上的复制错误。除了REPLICATION_APPLIER
权限外,您还必须为账户授予执行复制通道接收的事务或包含在mysqlbinlog输出中的所需权限,例如更新受影响的表。有关更多信息,请参见 第 19.3.3 节,“复制权限检查”。REPLICATION_SLAVE_ADMIN
允许帐户连接到复制源服务器,使用START REPLICA
和STOP REPLICA
语句启动和停止复制,并使用CHANGE REPLICATION SOURCE TO
语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO
语句(在 MySQL 8.0.23 之前)以及CHANGE REPLICATION FILTER
语句。授予此特权给由副本使用的帐户,以连接到当前服务器作为其复制源服务器。此特权不适用于组复制;对于组复制,请使用GROUP_REPLICATION_ADMIN
。RESOURCE_GROUP_ADMIN
允许资源组管理,包括创建、修改和删除资源组,以及将线程和语句分配给资源组。拥有此特权的用户可以执行与资源组相关的任何操作。RESOURCE_GROUP_USER
允许将线程和语句分配给资源组。拥有此特权的用户可以使用SET RESOURCE GROUP
语句和RESOURCE_GROUP
优化提示。ROLE_ADMIN
允许授予和撤销角色,使用GRANT
语句的WITH ADMIN OPTION
子句,以及ROLES_GRAPHML()
函数结果中的非空元素内容。需要设置
mandatory_roles
系统变量的值。
MySQL8 中文参考(二十四)(2)https://developer.aliyun.com/article/1566153