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,重新记录