sys 系统库 笔记(二)—— 配置表与其触发器

相对performance_schema而言,sys 系统库的配置要简单很多,核心只有一个sys_config表,另外有sys_config_insert_set_user和sys_config_update_set_user两个触发器,下面分别介绍。

 

一、 sys_config表

该表包含sys系统库的配置选项,每个配置选项一行。可以通过客户端更新此表来持久化配置,server重启不会丢失。

select * from sys_config;
+--------------------------------------+-------+---------------------+--------+
| variable                             | value | set_time            | set_by |
+--------------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables         | OFF   | 2016-11-09 11:21:12 | NULL   |
| diagnostics.include_raw              | OFF   | 2016-11-09 11:21:12 | NULL   |
| ps_thread_trx_info.max_length        | 65535 | 2016-11-09 11:21:12 | NULL   |
| statement_performance_analyzer.limit | 100   | 2016-11-09 11:21:12 | NULL   |
| statement_performance_analyzer.view  | NULL  | 2016-11-09 11:21:12 | NULL   |
| statement_truncate_len               | 64    | 2016-11-09 11:21:12 | NULL   |
+--------------------------------------+-------+---------------------+--------+
6 rows in set (0.00 sec)

1. sys_config表字段含义

  • variable:配置项名称
  • value:配置项值
  • set_time:该行配置最近修改时间
  • set_by:最近一次修改改行配置的帐户名。如果自server安装sys 系统库以来该行配置从未被更改过,则该列值为NULL

 

2. sys_config表与用户定义配置选项

为了减少对sys_config表直接读取,sys 系统库中的视图、存储过程在需要使用时,会优先检查对应的用户定义配置选项(二者名称类似,例如表中的diagnostics.include_raw选项,对应用户定义配置选项是@sys.diagnostics.include_raw)。如果当前会话存在用户定义的配置选项,会优先使用,否则将使用sys_config表中的配置选项值。从sys_config表中读取配置选项值之后,会将其更新到用户定义配置选项中。

示例:statement_truncate_len配置选项控制format_statement()函数返回的语句的最大长度,默认值为64。如果要临时将当前会话的值更改为32,可以设置对应的@sys.statement_truncate_len用户自定义配置选项:

-- statement_truncate_len配置选项默认是64,直接调用format_statement()函数返回是64字节长度,在未调用任何涉及到该配置选项的函数之前,该自定义变量值为NULL,此时函数需要从表中查询默认值
admin@localhost : sys 11:47:37> select @sys.statement_truncate_len;
+-----------------------------+
| @sys.statement_truncate_len |
+-----------------------------+
| NULL                        |
+-----------------------------+
1 row in set (0.00 sec)

SET @stmt = 'SELECT variable, value, set_time, set_by FROM sys_config';
Query OK, 0 rows affected (0.00 sec)

SELECT format_statement(@stmt);
+----------------------------------------------------------+
| format_statement(@stmt)                                  |
+----------------------------------------------------------+
| SELECT variable, value, set_time, set_by FROM sys_config |
+----------------------------------------------------------+
1 row in set (0.01 sec)

-- 调用过一次format_statement()函数之后,表中的默认值会被更新到该自定义配置选项中
select @sys.statement_truncate_len;
+-----------------------------+
| @sys.statement_truncate_len |
+-----------------------------+
| 64                          |
+-----------------------------+
1 row in set (0.00 sec)

-- 在会话级别中修改为32
set @sys.statement_truncate_len = 32;
Query OK, 0 rows affected (0.00 sec)

select @sys.statement_truncate_len;
+-----------------------------+
| @sys.statement_truncate_len |
+-----------------------------+
|                          32 |
+-----------------------------+
1 row in set (0.00 sec)

-- 再次调用format_statement(),发现返回结果中的长度缩短了,说明使用了session级别修改的值32
SELECT format_statement(@stmt);
+-----------------------------------+
| format_statement(@stmt)          |
+-----------------------------------+
| SELECT variabl ... ROM sys_config |
+-----------------------------------+
1 row in set (0.00 sec)

要停止使用用户定义的配置选项并恢复使用sys_config表中的值,可以将会话中的配置选项设置为NULL,或者结束当前会话重新开启。

SET @sys.statement_truncate_len = NULL;
SELECT format_statement(@stmt);
+----------------------------------------------------------+
| format_statement(@stmt)                                  |
+----------------------------------------------------------+
| SELECT variable, value, set_time, set_by FROM sys_config |
+----------------------------------------------------------+

3.  配置项含义

select * from sys_config;
+--------------------------------------+-------+---------------------+--------+
| variable                             | value | set_time            | set_by |
+--------------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables         | OFF   | 2016-11-09 11:21:12 | NULL   |
| diagnostics.include_raw              | OFF   | 2016-11-09 11:21:12 | NULL   |
| ps_thread_trx_info.max_length        | 65535 | 2016-11-09 11:21:12 | NULL   |
| statement_performance_analyzer.limit | 100   | 2016-11-09 11:21:12 | NULL   |
| statement_performance_analyzer.view  | NULL  | 2016-11-09 11:21:12 | NULL   |
| statement_truncate_len               | 64    | 2016-11-09 11:21:12 | NULL   |
+--------------------------------------+-------+---------------------+--------+
6 rows in set (0.00 sec)

sys_config表中的配置选项含义如下(用户定义的配置选项变量相同):

  • diagnostics.allow_i_s_tables:为ON时,diagnostics()存储过程在调用时会扫描INFORMATION_SCHEMA.TABLES表,找到所有基表并与STATISTICS表执行联结查询,扫描每个表的统计信息。如果基表非常多,该操作可能比较昂贵。默认为OFF。此选项为5.7.9中新增
  • diagnostics.include_raw:为ON时,diagnostics()存储过程的输出信息中会包括metrics视图中的原始输出信息。默认为OFF。此选项为5.7.9中新增
  • ps_thread_trx_info.max_length:由ps_thread_trx_info()函数生成的JSON输出结果的最大长度,默认值为65535字节。此选项为5.7.9中新增
  • statement_performance_analyzer.limit:不具有内置限制的视图返回的最大行数,默认值为100。例如statements_with_runtimes_in_95th_percentile视图具有内置限制,只返回平均执行时间为占总执行时间分布的95百分位数的语句。此选项为5.7.9中新增
  • statement_performance_analyzer.view:给statement_performance_analyzer()存储过程当作入参使用的自定义查询或视图名称。如果该选项值包含空格,则将其值解释为查询语句,否则解释为视图名称。默认值为NULL。此选项为5.7.9中新增
  • statement_truncate_len:控制format_statement()函数返回的语句文本的最大长度,超过该长度的语句文本会被截断,默认值为64字节。

其他选项可以被添加到sys_config表中。

-- debug输出通常只能临时启用,因此默认不在sys_config表中。如果所有会话都需要使用,则可以将debug选项insert到sys_config表
INSERT INTO sys_config (variable, value) VALUES('debug', 'ON');
-- 要更改表中的调试配置选项值,可以使用update语句更新
UPDATE sys_config SET value = 'OFF' WHERE variable = 'debug';
-- 为确保当前会话中的存储过程调用时使用表中的更改后的值,需要将相应用户定义变量设为NULL
SET @sys.debug = NULL;

对sys_config表的insert和update操作会触发sys_config_insert_set_user和sys_config_update_set_user触发器。该触发器在5.7.x版本中新增了一个用户mysql.sys,且在定义时指定了DEFINER=mysql.sys@localhost(即该触发器只能用mysql.sys用户调用),因此该用户必须存在,否则对sys_config表操作时就算是超级管理员用户也无法修改,强烈建议不要删除mysql.sys用户。

如果不小心删除了mysql.sys用户 ,可以使用如下语句重新创建(使用create语句创建用户会失败,报错:ERROR 1396 (HY000): Operation CREATE USER failed for 'mysql.sys'@'localhost')。当然,为了方便,你可以删掉这个触发器,然后使用INVOKER='mysql.sys'@'localhost'子句创建,但并不推荐。

grant TRIGGER on sys.* to 'mysql.sys'@'localhost' identified by 'letsg0';
-- 注意:mysql.sys用户初始化默认对表sys.sys_config表只有select权限,无法调用sys_config_insert_set_user和sys_config_update_set_user触发器完成更新set_by字段为当前操作用户名,要实现这个功能,还需要添加insert和update权限
grant select,insert,update on sys.sys_config to 'mysql.sys'@'localhost' identified by 'letsg0';

二、 sys_config_insert_set_user触发器

当对sys_config表执行INSERT语句添加配置选项行时,sys_config_insert_set_user触发器会将sys_config表的set_by列设置为当前用户名。

要使该触发器生效,有如下三个条件:

  • mysql.sys用户必须存在
  • mysql.sys用户对sys.sys_config表需要有添加insert和update权限
  • @sys.ignore_sys_config_triggers自定义变量必须为0,任何非0值将导致该触发器不执行更新set_by字段操作

sys_config_insert_set_user触发器定义语句如下:

DROP TRIGGER IF EXISTS sys_config_insert_set_user;
DELIMITER $$
CREATE DEFINER='mysql.sys'@'localhost' TRIGGER sys_config_insert_set_user BEFORE INSERT on sys_config
FOR EACH ROW
BEGIN
IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN
    SET NEW.set_by = USER();
END IF;
END$$
DELIMITER ;

3. sys_config_update_set_user触发器

当对sys_config表执行UPDATE语句更新配置选项行时,sys_config_update_set_user触发器会将sys_config表的set_by列设置为当前用户名,触发器生效条件同上。

sys_config_update_set_user触发器定义语句如下:

DROP TRIGGER IF EXISTS sys_config_update_set_user;
DELIMITER $$
CREATE DEFINER='mysql.sys'@'localhost' TRIGGER sys_config_update_set_user BEFORE UPDATE on sys_config
FOR EACH ROW
BEGIN
IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN
    SET NEW.set_by = USER();
END IF;
END$$
DELIMITER ;

更多内容参考

https://dev.mysql.com/doc/refman/5.7/en/sys-sys-config-update-set-user.html

https://dev.mysql.com/doc/refman/5.7/en/sys-schema-tables.html

https://dev.mysql.com/doc/refman/5.7/en/sys-sys-config-insert-set-user.html

https://dev.mysql.com/doc/refman/5.7/en/sys-sys-config.html

发布了295 篇原创文章 · 获赞 35 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hehuyi_In/article/details/105315095