我在 postgres 文档中找不到答案,尽管一些 DBA 在他们的博客中声称手动分析会构建整个表的统计信息,而 autovacuum 只会更新增量统计信息,但有些 DBA 却说相反。
我知道 autovacuum 是真空的预定版本,并根据我们知道的其他参数进行分析。现在我的问题是 autovacuum 的分析是重建整个表的统计信息还是只更新现有的统计信息(增量)?与同一主题相关的另一个问题是,“默认统计”值是否也适用于 autovacuum 分析?
谢谢,
萨吉斯·P·谢蒂
我在 postgres 文档中找不到答案,尽管一些 DBA 在他们的博客中声称手动分析会构建整个表的统计信息,而 autovacuum 只会更新增量统计信息,但有些 DBA 却说相反。
我知道 autovacuum 是真空的预定版本,并根据我们知道的其他参数进行分析。现在我的问题是 autovacuum 的分析是重建整个表的统计信息还是只更新现有的统计信息(增量)?与同一主题相关的另一个问题是,“默认统计”值是否也适用于 autovacuum 分析?
谢谢,
萨吉斯·P·谢蒂
我在 Debian GNU/Linux 服务器上运行的 PostgreSQL 12.7 数据库中有一个大表(我们称之为big_table
)。这台机器有8 GB的 RAM 和4 个 CPU 核心,并且主要专用于这个 PostgreSQL 服务器。
目前这big_table
有大约1.03 亿行保存时间序列数据(例如,数据不更新,只插入或删除)。几乎每个月,我都会从这个表中删除大约25到3000 万行。那些被删除的行对应于一个连续的时间范围(例如“DELETE ... between 1-Mar and 30-Mar”)。这些DELETE
操作需要 10 分钟到 30 分钟才能完成。这种使用模式的有效期为6个多月。
表大小约为46 GB,该表的索引加起来约为61 GB。
有一个应用程序每隔几秒就向 this 插入 10 行big_table
,另一个面向用户的 Web 应用程序从这个表中读取数据以绘制一些最近的值。
每次我运行DELETE
删除 25 到 30 百万行的操作时(在月底),我都会看到AUTOVACUUM启动并开始工作。
我想检查一些关于这些 AUTOVACUUM 如何在该数据库中运行以下 SQL 查询的统计信息:
SELECT relname, last_vacuum, vacuum_count, autovacuum_count, last_autovacuum, autoanalyze_count, last_autoanalyze
FROM pg_stat_user_tables
WHERE relname = 'big_table' ;
令我惊讶的是,它给出了以下结果:
|relname |last_vacuum|vacuum_count|autovacuum_count|last_autovacuum|autoanalyze_count|last_autoanalyze|
|------------|-----------|------------|----------------|---------------|-----------------|----------------|
|big_Table | |0 |0 | |0 | |
我试图了解以下内容:
autovacuum_count
和auto_analyzecount
零?last_autovacuum
和last_autoanalyze
NULL?不幸的是, https: //www.postgresql.org/docs/12/monitoring-stats.html 上的官方文档对我没有太大帮助。
我有一个问题,我的数据库中的一些大表似乎没有被 autovacuum 守护进程清空。这是我所看到的:
SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC LIMIT 5;
+------------+-----------------------------+------------+------------+-------------------------------+
| schemaname | relname | n_live_tup | n_dead_tup | last_autovacuum |
+------------+-----------------------------+------------+------------+-------------------------------+
| md | calculation_log_item | 35989527 | 3559253 | 2020-07-13 03:41:37.49764-04 |
| audit | transaction_statement | 700356 | 557278 | NULL |
| audit | record_history | 701635 | 438849 | NULL |
| md | program_requirement_state | 193500 | 29204 | 2020-07-14 03:06:02.339032-04 |
| md | calculation_log | 157942 | 11792 | NULL |
+------------+-----------------------------+------------+------------+-------------------------------+
(5 rows)
因此,很明显守护程序正在运行,因为昨晚有值(注意:我在 2020-07-14 发布此消息)。但是,我无法弄清楚为什么 transaction_statement 和 record_history 不是。与活的相比,它们有很多 dead_tuples。
我正在使用 PostgreSQL v11。以下是完整版本信息:
select version();
+---------------------------------------------------------------------------------------------------------------------------------+
| version |
+---------------------------------------------------------------------------------------------------------------------------------+
| PostgreSQL 11.8 (Ubuntu 11.8-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit |
+---------------------------------------------------------------------------------------------------------------------------------+
(1 row)
这可能是什么原因造成的?如果您认为我的问题含糊不清或需要其他信息来回答(例如 postgresql.conf 设置等),请添加评论。
有没有一种好方法可以监控自上次自动清空以来对表的更新/删除次数?我试图找到更新不够频繁的表,以避免autovacuum (to prevent wraparound)
.
我正在考虑使用n_dead_tup
from pg_stat_all_tables
,但这是一个好主意/有更好的方法吗?
我正在使用 Postgres 9.6。
谢谢
我的autovacuum (to prevent wraparound)
一张桌子上发生了将近 4 天的事情。我想知道是否有任何方法可以告诉我它是否跟不上正在发生的更新/删除的数量。
作为参考,我在 Google CloudSQL 上使用 Postgres 9.6。他们有一个已知的问题,即一切都pg_stat_progress_vacuum
返回null
。
我也一直在检查pg_stat_all_tables
并注意到n_dead_tup
我的桌子正在上升而不是下降,但我不确定这个数字是否会意识到正在进行的自动吸尘。
我注意到在我的服务器日志中每 15 秒就会弹出一次类似的内容:
2020-01-30 21:10:30 UTC::@:[24969]:ERROR: XX000: cache lookup failed for type 0
2020-01-30 21:10:30 UTC::@:[24969]:CONTEXT: automatic vacuum of table "myschema.mytable"
2020-01-30 21:10:30 UTC::@:[24969]:LOCATION: get_typlenbyval, lsyscache.c:2036
当我手动运行时,VACUUM ANALYZE myschema.mytable;
它运行时没有任何错误,并且我的日志中的错误消失了。但是,不可避免地,它会在某个时候再次返回。
有问题的表定义如下:
tfs_dev=> \d myschema.mytable;
Table "myschema.mytable"
Column | Type | Collation | Nullable | Default
-------------+-----------+-----------+----------+---------------------------------------------------------------------------
level | text | | not null |
id | integer | | not null | nextval('myschema.mytable_id_seq'::regclass)
text_id | text | | |
name | text | | |
geom | geometry | | |
valid_dates | tstzrange | | | tstzrange(NULL::timestamp with time zone, NULL::timestamp with time zone)
adjacent | integer[] | | |
valence | integer | | |
color | smallint | | | 0
Indexes:
"mytable_pkey" PRIMARY KEY, btree (level, id)
"mytable_text_id_key" UNIQUE CONSTRAINT, btree (text_id)
"mytable_gix" gist (level, geom, id, text_id, name)
"mytable_spgix" spgist (geom)
"mytable_text_id_ix" btree (text_id, level, id, name)
Referenced by:
TABLE "otherschema.othertable" CONSTRAINT "othertable_mytable_fk" FOREIGN KEY (level, level_id) REFERENCES myschema.mytable(level, id)
TABLE "otherschema.othertable2" CONSTRAINT "othertable2_mytable_fk" FOREIGN KEY (level, level_id) REFERENCES myschema.mytable(level, id)
许多其他具有类似错误的帖子似乎是关于一个外部数据包装器,它存在于这个数据库中,但没有这个表/模式。
我正在调查我们的 autovacuum 设置的问题,并last_autoanalyze
试图last_autovacuum
从pg_stat_all_tables
.
我理解 autovacuum 以增量方式工作,批量压缩和清理死元组,然后休眠片刻,等等。那是什么last_autovacuum
意思?autovacuum 是否可能大部分时间都在工作,但时间戳可能永远不会更新(例如,因为无法删除元组)?
我为我们的表看到的许多时间戳都是旧的,即使我相当确定我在某些表上观察到一个正在运行的 autovacuum 线程。
编辑:如果我不清楚,我的问题是:确实last_autovacuum
意味着......
我找不到问题的答案来质疑我在标题中写的内容。Postgres 通过 autovacuum 自动唤醒 vacuum,但是当它是 slave 时,slave 会唤醒 autovacuum 进程吗?
我正在尝试在我的 postgresql 9.5 数据库中设置 autovacuum,但表统计信息没有显示这方面的证据。
在 postgresql.conf 中,autovacuum 已经启用:
autovacuum = on
在设置中,另外,我有 ( select * from pg_settings where category like 'Autovacuum'
)
autovacuum on
autovacuum_analyze_scale_factor 0.1
autovacuum_analyze_threshold 50
autovacuum_freeze_max_age 200000000
autovacuum_max_workers 3
autovacuum_multixact_freeze_max_age 400000000
autovacuum_naptime 60
autovacuum_vacuum_cost_delay 20
autovacuum_vacuum_cost_limit -1
autovacuum_vacuum_scale_factor 0.2
autovacuum_vacuum_threshold 50
如果我执行这个查询:
SELECT schemaname, relname,
last_vacuum ,
last_autovacuum ,
last_analyze ,
last_autoanalyze
FROM pg_stat_all_tables
where schemaname = 'cdi'
我得到这个结果:
relname last_vacuum last_autovacuum last_analyze last_autoanalyze aa 11/11/2017 05:56 04/11/2017 03:24 13/11/2017 23:25 bb 09/10/2017 15:01 04/11/2017 03:55 09/10/2017 15:01 抄送 13/09/2017 13:23 04/11/2017 03:55 11/11/2017 04:12 dd 14/09/2017 10:27 04/11/2017 03:55 12/11/2017 17:09 ee 14/09/2017 10:32 04/11/2017 03:00
ff 11/10/2017 09:20 04/11/2017 03:48 13/11/2017 22:19 gg 04/11/2017 03:55
hh 04/11/2017 03:55
二 04/11/2017 03:16 11/11/2017 06:51 ll 04/11/2017 03:16
mm 04/11/2017 03:55
nn 04/11/2017 03:55
oo 04/11/2017 03:55
pp 04/11/2017 03:00
在我看来没有有效的自动真空
有人可以告诉我一种使 autovacuum 发生的方法吗?
这是我的桌子:
顺序扫描 156 顺序元组读取 5448762930 索引扫描 802121339750 获取的索引元组 800736733206 插入的元组 21907385 元组更新 6190434 删除的元组 190337 元组热更新 3958397 活元组 59641911 死元组 703334 堆块读取 13685226418 堆块命中 786803454925 索引块读取 5104418623 索引块命中 3208275818736 Toast 块读取 0 吐司块命中 0 Toast 索引块读取 0 Toast 索引块命中 0 上次真空 2017-10-11 09:20:22.358935+02 最后一次自动清理 最后分析 2017-11-04 03:48:49.753917+01 最后自动分析 2017-11-13 22:19:08.47618+01 真空计数器1 自动真空计数器 0 分析计数器 10 自动分析计数器 3 表大小 6778 MB Toast 表大小 8192 字节 索引大小 3969 MB
在监视我的数据库上的 autovacuum 活动时,我注意到带有标记的 autovacuum(to prevent wraparound)
似乎比“常规”autovacuum 花费的时间更长。这让我开始尝试了解各种“种类”或 autovacuum 的性能/行为差异。
从文档VACUUM
中,我确定了 autovacuum 可能是一个表的几个不同原因:
表中有需要冻结的旧事务 ( relfrozenxid > min(autovacuum_freeze_max_age, table.autovacuum_freeze_max_age
)。这是“ (to prevent wraparound)
”自动清理。
自上次VACUUM
超过“真空阈值”以来表中废弃的元组数
还有其他我想念的吗?
似乎为手册暴露的“攻击性”旋钮VACUUM
是FREEZE
和DISABLE_PAGE_SKIPPING
。这些不同类型的 autovacuum 是否使用过这些选项,如果使用过,什么时候使用过?