7.1.9.1 系统变量权限
系统变量可以具有全局值,影响服务器的整个操作,会话值,影响当前会话,或者两者:
-
对于动态系统变量,可以使用
SET
语句更改其全局或会话运行值(或两者),以影响当前服务器实例的操作。有关动态变量的信息,请见第7.1.9.2节,“动态系统变量”。 -
对于某些全局系统变量,可以使用
SET
语句将其值持久化到mysqld-auto.cnf
文件中,以影响服务器的操作在后续启动时。有关持久化系统变量和mysqld-auto.cnf
文件的信息,请见第7.1.9.3节,“持久化系统变量”。 -
对于持久化全局系统变量,可以使用
RESET PERSIST
语句将其值从mysqld-auto.cnf
文件中删除,以影响服务器的操作在后续启动时。
本节描述了为系统变量分配值的操作所需的权限。这包括影响运行值的操作,以及影响持久化值的操作。
要设置一个全局系统变量,使用SET
语句与适当的关键字。这些权限适用:
-
要设置一个全局系统变量的运行值,使用
SET GLOBAL
语句,该语句需要SYSTEM_VARIABLES_ADMIN
权限(或弃用的SUPER
权限)。 -
要将一个全局系统变量持久化到
mysqld-auto.cnf
文件中(并设置运行值),使用SET PERSIST
语句,该语句需要SYSTEM_VARIABLES_ADMIN
或SUPER
权限。 -
为了将全局系统变量持久化到
mysqld-auto.cnf
文件(不设置运行时值),使用SET PERSIST_ONLY
语句,该语句需要SYSTEM_VARIABLES_ADMIN
和PERSIST_RO_VARIABLES_ADMIN
特权。SET PERSIST_ONLY
可以用于动态和只读系统变量,但特别有用于持久化只读变量,因为SET PERSIST
不能用于只读变量。 -
一些全局系统变量是持久化受限的(见第7.1.9.4节,“Nonpersistible and Persist-Restricted System Variables”)。为了持久化这些变量,使用
SET PERSIST_ONLY
语句,该语句需要前述的特权。此外,您还需要使用加密连接连接到服务器,并提供SSL证书,其中的主题值由persist_only_admin_x509_subject
系统变量指定。
要从mysqld-auto.cnf
文件中删除持久化的全局系统变量,使用RESET PERSIST
语句。这些特权适用:
-
对于动态系统变量,
RESET PERSIST
需要SYSTEM_VARIABLES_ADMIN
或SUPER
特权。 -
对于只读系统变量,
RESET PERSIST
需要SYSTEM_VARIABLES_ADMIN
和PERSIST_RO_VARIABLES_ADMIN
特权。 -
对于持久化受限变量,
RESET PERSIST
不需要使用加密连接连接到服务器。
如果一个全局系统变量有任何例外的权限要求,变量描述中将指出这些例外。例如,default_table_encryption
和 mandatory_roles
需要额外的权限。这些额外的权限适用于设置全局运行值的操作,但不是设置持久值的操作。
要设置一个会话系统变量的运行值,请使用SET SESSION
语句。与设置全局运行值不同,设置会话运行值通常不需要特殊权限,可以由任何用户在当前会话中进行。对于一些系统变量,设置会话值可能会在当前会话之外产生影响,因此是受限制的操作,仅能由拥有特殊权限的用户进行:
-
所需的权限是
SESSION_VARIABLES_ADMIN
。Note任何拥有
SYSTEM_VARIABLES_ADMIN
或SUPER
的用户实际上拥有SESSION_VARIABLES_ADMIN
,因此不需要被授予SESSION_VARIABLES_ADMIN
权限。
如果一个会话系统变量受限制,变量描述中将指出该限制。例如,binlog_format
和 sql_log_bin
。设置这些变量的会话值将影响当前会话的二进制日志记录,但也可能会对服务器复制和备份的完整性产生更广泛的影响。
SESSION_VARIABLES_ADMIN
允许管理员最小化用户可能之前被授予SYSTEM_VARIABLES_ADMIN
或 SUPER
的权限,以便他们能够启用受限制的会话系统变量。假设管理员创建了以下角色,以便授予设置受限制的会话系统变量的能力:
CREATE ROLE set_session_sysvars;
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO set_session_sysvars;
任何被授予set_session_sysvars
角色的用户(并且该角色处于活动状态)可以设置受限制的会话系统变量。然而,这个用户也可以设置全局系统变量,这可能是不可取的。
通过将角色修改为拥有SESSION_VARIABLES_ADMIN
而不是SYSTEM_VARIABLES_ADMIN
,可以将角色权限减少到仅能设置受限制的会话系统变量。要修改角色,请使用以下语句:
GRANT SESSION_VARIABLES_ADMIN ON *.* TO set_session_sysvars;
REVOKE SYSTEM_VARIABLES_ADMIN ON *.* FROM set_session_sysvars;
修改角色将立即生效:任何被授予 set_session_sysvars
角色的账户现在不再拥有SYSTEM_VARIABLES_ADMIN
权限,并且不能在没有明确授予权限的情况下设置全局系统变量。类似的GRANT
/REVOKE
序列可以应用于任何被直接授予SYSTEM_VARIABLES_ADMIN
权限的账户,而不是通过角色授予权限。