1.服务器版本

cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)

2.数据库版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.36-log |
+------------+
1 row in set (0.00 sec)

3.问题现象

一主两从三个实例,假设A为主,B,C为A的从库。在B实例上通过如下语句能够查到当天有对test表的增加字段操作,但是在A,C实例上通过同样的语句确查不到同样的加字段语句。

select DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN from performance_schema.events_statements_summary_by_digest where lower(DIGEST_TEXT) like 'alter%test%';

4.问题原因

出现这种情况有两种可能

1) 没有开启 statements_digest 功能

mysql> select * from setup_consumers where NAME='statements_digest';
+-------------------+---------+
| NAME              | ENABLED |
+-------------------+---------+
| statements_digest | YES     |
+-------------------+---------+
#ENABLED 为 YES 表示开启了该功能

2)performance_schema.events_statements_summary_by_digest 表已达到最大保存条数限制

下面是从库C上查询的结果(A实例一样的原因)
mysql> show variables like 'performance_schema_digests_size';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| performance_schema_digests_size | 10000 |
+---------------------------------+-------+
1 row in set (0.00 sec)
#该参数控制 performance_schema.events_statements_summary_by_digest 保存的最大记录数,超过该最大值,不会再保存新的sql语句分类

mysql> select count(*) from performance_schema.events_statements_summary_by_digest;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.02 sec)
#该表已经达到指定的最大保存值

mysql> show global status like 'Performance_schema_digest_lost';
+--------------------------------+-----------+
| Variable_name                  | Value     |
+--------------------------------+-----------+
| Performance_schema_digest_lost | 170099501 |
+--------------------------------+-----------+
1 row in set (0.01 sec)
#该变量表示events_statements_summary_by_digest多少语句没有保存

#本人遇到的问题就是 events_statements_summary_by_digest 已经存满了,导致新的sql分类被丢弃(按理说10000 已经是个挺大的数字了,基本够用,只能说当前环境的业务不同的sql类型太多了)

5.问题处理

找到原因,那处理起来就简单了。在主库truncate events_statements_summary_by_digest,重新记录

11-09 08:23