与零和零在自动真空中的可能含义是什么?_数,最后一次_自真空和自分析_在PostgreSQL中计数?类似,除了在我的例子中,它是PostgreSQL 15.1,没有删除-数据只被插入。
我有一个DB,它有一些分区表,也有一些非分区表。一些分区有数亿行,但是对于它们来说,n_live_tup是0,而vacuum_count、autovacuum_count、analyze_count、autoanalyze_count都是0。
只有最近创建的两个表(两个分区)分别具有autoanalyze_count =1和4,并且n_live_tup > 0。但是,还有一些n_live_tup >0的表(尽管从来没有对它们进行分析)。
select relname, n_live_tup, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze, vacuum_count, autovacuum_count, analyze_count, autoanalyze_count
from pg_catalog.pg_stat_user_tables
where schemaname = 'myschema'
请注意,n_live_tup for event_59在这里大错特错,而且该表实际上有超过11亿行(这是最大的行)。
我尝试按照链接问题中的建议设置log_autovacuum_min_duration = 0
,但到目前为止,它似乎还没有记录任何内容。
为什么我的桌子不被分析?
编辑1:现在连这些表的统计信息都被重置了:
自- pg_postmaster_start_time()
返回2023-02-13 17:02:32.365095+00
(即我重新启动服务器时)以来,服务器没有崩溃。正如您在第一个屏幕截图中所看到的,在此之后不久就会运行自动分析。日志显示它在20:10:18再次运行,但是尽管如此,所有的分析/真空计数都是0,并且n_live_tup已经减少了。
我手动运行了analyze event_241
,n_live_tup变得准确了。之后我重新启动了PG,这并没有重新设置计数,所以我不知道为什么它会在一夜之间被重置。
编辑2:事实证明,当pg_dump备份运行时,服务器每晚都会崩溃,但显然没有重启postmaster进程,因为pg_postmaster_start_time()
一直返回相同的值。我可以很容易地通过pg_dumping复制崩溃,这是一个特定的数据库(这篇文章不是关于这个数据库的)。
2023-02-17 09:04:16.607 UTC [27083] postgres@problematic_database LOG: connection authorized: user=postgres database=problematic_database application_name=pg_dump
2023-02-17 09:04:16.609 UTC [27083] postgres@problematic_database PANIC: could not open critical system index 2662
2023-02-17 09:04:16.610 UTC [11922] LOG: server process (PID 27083) was terminated by signal 6: Aborted
2023-02-17 09:04:16.610 UTC [11922] LOG: terminating any other active server processes
2023-02-17 09:04:16.645 UTC [11922] LOG: all server processes terminated; reinitializing
2023-02-17 09:04:17.176 UTC [27945] LOG: database system was interrupted; last known up at 2023-02-17 09:03:24 UTC
修复崩溃是一个单独的话题,但对于这个问题,我想知道:
analyze_count = 0
,还是有更好的方法?analyze
重新填充统计数据似乎是个好主意,对吗?但是为什么PG在从崩溃中恢复之后不自动完成这个任务呢?发布于 2023-02-14 06:48:30
有几种可能的解释:
pg_stat_reset()
或相关函数来重置统计信息。pg_upgrade
进行了升级,此后没有人运行ANALYZE
。若要检查最后一次重置数据库的统计信息的时间,请运行
SELECT pg_stat_get_db_stat_reset_time(oid)
FROM pg_database
WHERE datname = current_database();
如果为NULL,则统计信息从未显式重置。
您的进一步调查表明,您的目录数据损坏,这使数据库每天崩溃。如果你有一个好的备份,恢复它。否则,立即删除数据库并对所有文件执行冷备份。您可以尝试通过使用PostgreSQL选项启动-P
来解决问题,然后尝试将索引重新构建为超级用户:
REINDEX INDEX pg_catalog.pg_class_oid_index;
目标是使数据库处于可以成功转储它的状态。然后在好的硬件上将其还原到新创建的集群中。不要继续使用这个集群,即使它看起来又很好。
https://dba.stackexchange.com/questions/323452
复制相似问题