关于 Pg_stat_progress_vacuum
备注:pg_stat_progress_vacuum 视图的每一行对应一个运行中的VACUUM后台进程, 重要字段 phase 表示 VACUUM 进程的过程,VACUUM 阶段详见以下:
Vacuum 的几个阶段
备注:接下来通过一个简单的实验查看VACUUM后台进程的阶段。
模拟测试
创建测试表1
2
3
4
5 create table test_big2(id int4,name character varying(64),create_time timestamp(0) without time zone default clock_timestamp());
CREATE TABLE
insert into test_big2(id,name) select n, n||'_vacuum' from generate_series(1,5000000) n;
INSERT 0 5000000
备注:创建一张 500 万记录的测试表。
会话一: VACUUM 表 test_big21
2francs=> vacuum analyze test_big2;
VACUUM 过程中
会话二:监控 VACUUM1
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
30postgres=
(0 rows)
postgres=
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 进程的进度。
会话一:删除一部分记录再执行 VACUUM1
2
3
4
5
6
7
8francs=> 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耗时越长。
会话二:监控 VACUUM1
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
29postgres=
(0 rows)
postgres=
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 的监控提供了较大的方便。