PostgreSQL pg_stat_reset清除track_counts的隐患

标签

PostgreSQL , track_counts , 统计信息 , pg_stat_reset


背景

PostgreSQL数据库的statstic模块有一些计数器,用于统计每个表被插入、更新、删除的记录数。

通过这些视图,可以查看计数器统计到的一些计数:

postgres=# \dv pg_stat*
                     List of relations
   Schema   |            Name             | Type |  Owner
------------+-----------------------------+------+----------
 pg_catalog | pg_stat_activity            | view | postgres
 pg_catalog | pg_stat_all_indexes         | view | postgres
 pg_catalog | pg_stat_all_tables          | view | postgres
 pg_catalog | pg_stat_archiver            | view | postgres
 pg_catalog | pg_stat_bgwriter            | view | postgres
 pg_catalog | pg_stat_database            | view | postgres
 pg_catalog | pg_stat_database_conflicts  | view | postgres
 pg_catalog | pg_stat_progress_vacuum     | view | postgres
 pg_catalog | pg_stat_replication         | view | postgres
 pg_catalog | pg_stat_ssl                 | view | postgres
 pg_catalog | pg_stat_subscription        | view | postgres
 pg_catalog | pg_stat_sys_indexes         | view | postgres
 pg_catalog | pg_stat_sys_tables          | view | postgres
 pg_catalog | pg_stat_user_functions      | view | postgres
 pg_catalog | pg_stat_user_indexes        | view | postgres
 pg_catalog | pg_stat_user_tables         | view | postgres
 pg_catalog | pg_stat_wal_receiver        | view | postgres
 pg_catalog | pg_stat_xact_all_tables     | view | postgres
 pg_catalog | pg_stat_xact_sys_tables     | view | postgres
 pg_catalog | pg_stat_xact_user_functions | view | postgres
 pg_catalog | pg_stat_xact_user_tables    | view | postgres
 pg_catalog | pg_statio_all_indexes       | view | postgres
 pg_catalog | pg_statio_all_sequences     | view | postgres
 pg_catalog | pg_statio_all_tables        | view | postgres
 pg_catalog | pg_statio_sys_indexes       | view | postgres
 pg_catalog | pg_statio_sys_sequences     | view | postgres
 pg_catalog | pg_statio_sys_tables        | view | postgres
 pg_catalog | pg_statio_user_indexes      | view | postgres
 pg_catalog | pg_statio_user_sequences    | view | postgres
 pg_catalog | pg_statio_user_tables       | view | postgres
 pg_catalog | pg_stats                    | view | postgres

例如表相关的计数:

postgres=# \d pg_stat_all_tables
                      View "pg_catalog.pg_stat_all_tables"
       Column        |           Type           | Collation | Nullable | Default
---------------------+--------------------------+-----------+----------+---------
 relid               | oid                      |           |          |
 schemaname          | name                     |           |          |
 relname             | name                     |           |          |
 seq_scan            | bigint                   |           |          |
 seq_tup_read        | bigint                   |           |          |
 idx_scan            | bigint                   |           |          |
 idx_tup_fetch       | bigint                   |           |          |
 n_tup_ins           | bigint                   |           |          |
 n_tup_upd           | bigint                   |           |          |
 n_tup_del           | bigint                   |           |          |
 n_tup_hot_upd       | bigint                   |           |          |
 n_live_tup          | bigint                   |           |          |
 n_dead_tup          | bigint                   |           |          |
 n_mod_since_analyze | bigint                   |           |          |
 last_vacuum         | timestamp with time zone |           |          |
 last_autovacuum     | timestamp with time zone |           |          |
 last_analyze        | timestamp with time zone |           |          |
 last_autoanalyze    | timestamp with time zone |           |          |
 vacuum_count        | bigint                   |           |          |
 autovacuum_count    | bigint                   |           |          |
 analyze_count       | bigint                   |           |          |
 autoanalyze_count   | bigint                   |           |          |

查看某张表的计数,例如

postgres=# select * from pg_stat_all_tables where relname='test1';
-[ RECORD 1 ]-------+-------
relid               | 31129
schemaname          | public
relname             | test1
seq_scan            | 0
seq_tup_read        | 0
idx_scan            |
idx_tup_fetch       |
n_tup_ins           | 0
n_tup_upd           | 0
n_tup_del           | 0
n_tup_hot_upd       | 0
n_live_tup          | 0
n_dead_tup          | 0
n_mod_since_analyze | 0
last_vacuum         |
last_autovacuum     |
last_analyze        |
last_autoanalyze    |
vacuum_count        | 0
autovacuum_count    | 0
analyze_count       | 0
autoanalyze_count   | 0

通过reset函数,可以对这些计数清零。

Function Return Type Description
pg_stat_reset() void Reset all statistics counters for the current database to zero (requires superuser privileges by default, but EXECUTE for this function can be granted to others.)
pg_stat_reset_shared(text) void Reset some cluster-wide statistics counters to zero, depending on the argument (requires superuser privileges by default, but EXECUTE for this function can be granted to others). Calling pg_stat_reset_shared('bgwriter') will zero all the counters shown in the pg_stat_bgwriter view. Calling pg_stat_reset_shared('archiver') will zero all the counters shown in the pg_stat_archiver view.
pg_stat_reset_single_table_counters(oid) void Reset statistics for a single table or index in the current database to zero (requires superuser privileges by default, but EXECUTE for this function can be granted to others)
pg_stat_reset_single_function_counters(oid) void Reset statistics for a single function in the current database to zero (requires superuser privileges by default, but EXECUTE for this function can be granted to others)

清零有什么后果呢?

autovacuum launcher进程依赖计数器

autovacuum launcher进程,在一个autovacuum_naptime周期内,轮询所有的database内的计数,并根据计数以及设置的阈值(表级、或全库级阈值)判断是否需要对表实施vacuum或analyze的动作。

vacuum threshold = vacuum base threshold + vacuum scale factor * number of tuples

analyze threshold = analyze base threshold + analyze scale factor * number of tuples

如果计数器被清零,可能无法及时对表进行垃圾回收或analyze。

例子

1、配置参数,便于观察。

vi postgresql.conf

autovacuum = on
log_autovacuum_min_duration = 0
autovacuum_max_workers = 5
autovacuum_naptime = 5s

2、生效参数:pg_ctl reload

3、建立一个测试表

create table test1(id int);

4、观察日志

 tail -f -n 1 postgresql-Wed.csv

5、写入批量数据

postgres=# insert into test1 select generate_series(1,100000);

超过自动analyze的阈值,观察到自动触发了analyze。

2017-11-01 13:39:02.853 CST,,,25591,,59f95df6.63f7,1,,2017-11-01 13:39:02 CST,4/1074,1912083,日志,00000,"自动分析表 ""postgres.public.test1""的系统使用情况: CPU: user: 0.01 s, system: 0.00 s, elapsed: 0.02 s",,,,,,,,"do_analyze_rel, analyze.c:688",""

6、更新批量数据

postgres=# update test1 set id=1;

超过自动vacuum和analyze的阈值,观察到自动触发了vacuum和analyze。

2017-11-01 13:39:32.972 CST,,,25599,,59f95e14.63ff,1,,2017-11-01 13:39:32 CST,4/1088,0,日志,00000,"自动清理表""postgres.public.test1"":索引扫描:0
页面:0 被移除,885 保留,0 由于被占用而跳过,0 被跳过的已被冻结
tuples: 100003 removed, 100003 remain, 0 are dead but not yet removable, oldest xmin: 1912085
缓冲区使用:1795次命中,2次失效,4次脏
平均读取率:0.835 MB/s,平均写入率:1.670 MB/s
系统用法:CPU: user: 0.01 s, system: 0.00 s, elapsed: 0.01 s",,,,,,,,"lazy_vacuum_rel, vacuumlazy.c:402",""    

2017-11-01 13:39:32.989 CST,,,25599,,59f95e14.63ff,2,,2017-11-01 13:39:32 CST,4/1089,1912085,日志,00000,"自动分析表 ""postgres.public.test1""的系统使用情况: CPU: user: 0.01 s, system: 0.00 s, elapsed: 0.01 s",,,,,,,,"do_analyze_rel, analyze.c:688",""

7、更新批量数据,并同时清零计数器。

postgres=# update test1 set id=1;select pg_stat_reset();

计数器被清零

postgres=# select * from pg_stat_all_tables where relname='test1';
-[ RECORD 1 ]-------+-------
relid               | 31129
schemaname          | public
relname             | test1
seq_scan            | 0
seq_tup_read        | 0
idx_scan            |
idx_tup_fetch       |
n_tup_ins           | 0
n_tup_upd           | 0
n_tup_del           | 0
n_tup_hot_upd       | 0
n_live_tup          | 0
n_dead_tup          | 0
n_mod_since_analyze | 0
last_vacuum         |
last_autovacuum     |
last_analyze        |
last_autoanalyze    |
vacuum_count        | 0
autovacuum_count    | 0
analyze_count       | 0
autoanalyze_count   | 0

计数器清零后,autovacuum不会触发vacuum和analyze。

小结

计数器清零会影响autovacuum launcher发起vacuum和analyze,导致一些表实际上已经超过分析或垃圾回收的阈值,但是不会被触发。严重时,可能导致表膨胀,或统计信息不准确。

《PostgreSQL AWR报告》

pg_awr里面涉及到计数器的默认清理,我会在后期改掉,默认不清理。

参考

《PostgreSQL pg_stat_ pg_statio_ 统计信息(scan,read,fetch,hit)源码解读》

https://www.postgresql.org/docs/10/static/routine-vacuuming.html#autovacuum

https://www.postgresql.org/docs/10/static/runtime-config-statistics.html#guc-track-counts

时间: 2024-08-02 16:13:36

PostgreSQL pg_stat_reset清除track_counts的隐患的相关文章

PostgreSQL 按需切片的实现(TimescaleDB插件自动切片功能的plpgsql schemaless实现)

标签 PostgreSQL , schemaless , 自动切片 , track_count , 计数器 , udf , plpgsql , timescaledb 背景 TimescaleDB是PostgreSQL的一款时序数据库插件,其中自动切片是一个非常深入人心的功能. http://www.timescale.com/ 实际上PostgreSQL plpgsql也可以实现类似的功能,当然,前提是需要使用schemaless的模式. schemaless的设计思路和应用举例: <Post

瑞星加强互联网安全防范群众需谨慎关注

硅谷网10月29日讯,近期,一则内容为"紧急通知!大家注意:如果收到<钓鱼岛开战啦>的图片,请不要打开,立即删除,现在已经确认,这是一种 新的电脑病毒,攻击个人电脑,会使电脑丧失一切信息, 请大家复制并转发!"的消息在微博.QQ群.论坛中疯狂传播,引起网民的很大恐慌.瑞星安全专家表示,这是一条不实谣言,目前尚未有消息中所述病毒在网上大规模流传. 据瑞星安全专家介绍,由于最近钓鱼岛事件广泛受到国人的关注,网上关于钓鱼岛的相关视频.图片也非常热门,一些http://www.al

计算机病毒谣言恐吓网民

近日,一则"2011年度工资调整方案的网址带毒,永远删不掉"的消息通过电子邮件和QQ群疯狂传播,引起网民 的极大恐慌.瑞星安全专家表示,这是个流传了近10年的网络谣言,早在2001年就在网上出现类似内容的帖子.根据瑞星云安全系统的监测,目前网络安全情况并无明显异常. 谣言邮件的主要内容为:"'2011年度工资调整方案'的网址在任何环境下都不要打开,有病毒,应立即删除.如果打开,你会失去电脑上的一切东西,--其目标是摧毁个人电脑,这次病毒猛烈仅次于灰鸽子.熊猫烧香 ,是永远也删

网站牛皮癣死灰复燃 加速乐向挂黑链宣战

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 近日,有网友在微博上爆料,不少使用dedecms搭建的网站被黑,网站被挂上大量黑链;与之相应的是,在百度中搜索"网站被挂黑链",可以找到一百五十多万个搜索结果,大多是网友分享的经历或经验,黑链俨然成为网站上的牛皮癣,很难被根除,总是死灰复燃. 黑链不是指黑色的链接,而是指隐藏的链接,用户直接浏览网站,很难看到黑链;不过,黑

潍坊市公安局破获黑客攻击市互联网主干网特大案件

中介交易 SEO诊断 淘宝客 云主机 技术大厅 7月28日,潍坊市公安局网警支队成功侦破潍坊网通公司城域网遭受攻击特大案件,一举打掉一个通过黑客手段大面积入侵联网电脑,并利用入侵的联网电脑攻击网通主干网的犯罪团伙.此案是我省首例大规模攻击网络运营商城域网,导致全市互联网大面积瘫痪的重大案件,全国极为罕见.工作中,抓获毕某.曲某.朱某等3名犯罪嫌疑人,扣押笔记本电脑及其它设备8台,清除一大社会隐患,取得显著战果.8月30日,3名犯罪嫌疑人被依法逮捕. 7月21日,市公安局网警支队接市网通公司报案称

《请君入瓮——APT攻防指南之兵不厌诈》—第3章3.1节核心竞争力

第3章 网络谍战请君入瓮--APT攻防指南之兵不厌诈 如果说人类的文明史就是一部战争史,那么整个战争史也可以说是"反间谍"的谍报行动(CI)的进化史.经过漫长的战火洗礼,反间谍领域的实践和理论一直在不断的发展和完善.无论当地使用什么语言,位于地球上的哪个地方,世界各地的每个政府都会不惜代价.绞尽脑汁地扫除内部的间谍.值得注意的是,网络在普及之后,也被间谍用来当作他们新的触角:与此同时,全球情报界的各路精英也在积极地应对着这份挑战.在信息时代,人类的生产生活比以往的任何阶段都更加依赖先进

PostgreSQL服务器管理:服务器配置

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 设置参数 1.1. 参数名称和值 所有参数名都是大小写不敏感的.每个参数都可以接受五种类型之一的值: 布尔.字符串.整数. 浮点数或枚举.该类型决定了设置该参数的语法: 布尔: 值可以被写成 on, off, true, false, yes, no, 1, 0 (都是大小写不敏感的)或者这些值的任何无歧义前缀. 字符串: 通常值被包括在单引号内,值内部的任何单引号都需要被双写.不过,如果值是一个简单数字或者 标

PostgreSQL Greenplum crash 后临时表引发的BUG - 暨年龄监控的重要性

PostgreSQL 和 Greenplum 都支持临时表.在使用临时表时,如果数据库crash,临时表不会被自动清除,这样可能会埋下隐患,隐患爆发时是非常危险的.问题在哪呢?因为vacuum freeze不处理其他会话创建的临时表,仅仅处理当前会话创建的临时表.也就是说,没有被清理的临时表,可能导致数据库年龄无法下降.但是PostgreSQL从8.4的版本开始autovacuum进程就有了自动清理未正常删除的TEMP表的功能.并且PostgreSQL从8.4的版本开始如果将来还会继续在同一个t

PostgreSQL、Greenplum 日常监控 和 维护任务

标签 PostgreSQL , Greenplum , Recommended Monitoring and Maintenance Tasks , 监控 , 维护 背景 Greenplum的日常监控点.评判标准,日常维护任务. 展示图层 由于一台主机可能跑多个实例,建议分层展示. 另外,即使是ON ECS虚拟机(一个虚拟机一个实例一对一的形态)的产品形态,实际上也建议分层展示,以示通用性. 主机级图层 1.全局 2.以集群分组 展示图形 1.饼图(正常.警告.严重错误.不可用,占比,数量) 2