PostgreSQL9.6:新增 pg_stat_progress_vacuum 视图监控 VACUUM

关于 Pg_stat_progress_vacuum

备注:pg_stat_progress_vacuum 视图的每一行对应一个运行中的VACUUM后台进程, 重要字段 phase 表示 VACUUM 进程的过程,VACUUM 阶段详见以下:

Vacuum 的几个阶段

备注:接下来通过一个简单的实验查看VACUUM后台进程的阶段。

模拟测试

创建测试表

1
2
3
4
5
francs=> create table test_big2(id int4,name character varying(64),create_time timestamp(0) without time zone default clock_timestamp());
CREATE TABLE

francs=> insert into test_big2(id,name) select n, n||'_vacuum' from generate_series(1,5000000) n;
INSERT 0 5000000

备注:创建一张 500 万记录的测试表。

会话一: VACUUM 表 test_big2

1
2
francs=> vacuum analyze test_big2;
VACUUM 过程中

会话二:监控 VACUUM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
postgres=# select * from pg_stat_progress_vacuum ;
(0 rows)
postgres=# \watch 1
Fri May 27 16:36:05 2016 (every 1s)
-[ RECORD 1 ]------+--------------
pid | 19427
datid | 16386
datname | francs
relid | 16445
phase | scanning heap
heap_blks_total | 34478
heap_blks_scanned | 1712
heap_blks_vacuumed | 0
index_vacuum_count | 0
max_dead_tuples | 291
num_dead_tuples | 0
省略。。。
Fri May 27 16:36:33 2016 (every 1s)
-[ RECORD 1 ]------+--------------
pid | 19427
datid | 16386
datname | francs
relid | 16445
phase | scanning heap
heap_blks_total | 34478
heap_blks_scanned | 31612
heap_blks_vacuumed | 0
index_vacuum_count | 0
max_dead_tuples | 291
num_dead_tuples | 0

备注:只看到 VACUUM 进程处于 scanning heap 状态,并且 heap_blks_scanned 一直在涨直到VAUUM结束,通过这个字段和 heap_blks_total 可以估算 VACUUM 进程的进度。

会话一:删除一部分记录再执行 VACUUM

1
2
3
4
5
6
7
8
francs=> create index idx_test_big2_id on test_big2 using btree (id);
CREATE INDEX

francs=> delete from test_big2 where id > 4000000;
DELETE 1000000

francs=> vacuum analyze test_big2;
VACUUM 进程执行过程中,表越大,VACUUM耗时越长。

会话二:监控 VACUUM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
postgres=# select * from pg_stat_progress_vacuum ;
(0 rows)
postgres=# \watch 2
Fri May 27 16:39:46 2016 (every 2s)
-[ RECORD 1 ]------+------------------
pid | 19427
datid | 16386
datname | francs
relid | 16445
phase | vacuuming indexes
heap_blks_total | 34478
heap_blks_scanned | 34478
heap_blks_vacuumed | 0
index_vacuum_count | 0
max_dead_tuples | 10033098
num_dead_tuples | 1000000
Fri May 27 16:39:49 2016 (every 2s)
-[ RECORD 1 ]------+--------------------
pid | 19427
datid | 16386
datname | francs
relid | 16445
phase | cleaning up indexes
heap_blks_total | 34478
heap_blks_scanned | 34478
heap_blks_vacuumed | 34478
index_vacuum_count | 1
max_dead_tuples | 10033098
num_dead_tuples | 1000000

备注:删除索引后执行VACUUM过程中,可以查看到 phase 开始处于 vacuuming indexes 阶段,之后进入 cleaning up indexes 阶段,并且 num_dead_tuples 为 100 万。

对于数据量较大的生产库,如果开启了 autovacuum,通常大表的 VACUUM 周期较长,之前几乎无法判断表级别的 VACUM 进程进度,9.6 版本pg_stat_progress_vacuum 视图的出现可以监控表级别 VACUUM 进程的进度,对于 VACUUM 的监控提供了较大的方便。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%