首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于大多数表,pg_stat_user_tables具有n_live_tup =0和last_autonalyze = null --为什么没有对表进行分析?

对于大多数表,pg_stat_user_tables具有n_live_tup =0和last_autonalyze = null --为什么没有对表进行分析?
EN

Database Administration用户
提问于 2023-02-13 17:25:48
回答 1查看 319关注 0票数 0

零和零在自动真空中的可能含义是什么?_数,最后一次_自真空和自分析_在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的表(尽管从来没有对它们进行分析)。

代码语言:javascript
运行
复制
        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复制崩溃,这是一个特定的数据库(这篇文章不是关于这个数据库的)。

代码语言:javascript
运行
复制
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

修复崩溃是一个单独的话题,但对于这个问题,我想知道:

  1. 监控这种情况的最好方法是什么?我们可以扫描日志中的关键字,但似乎最好是直接检查正在重置的统计信息,因为这将捕获这一点以及其他错误。只是手动在至少一个表上运行分析,然后定期轮询analyze_count = 0,还是有更好的方法?
  2. 如果我们确实检测到统计数据被重置(由于崩溃),那么手工analyze重新填充统计数据似乎是个好主意,对吗?但是为什么PG在从崩溃中恢复之后不自动完成这个任务呢?
  3. 或者也许只是定期进行分析是个好主意,比如说,每周,甚至是晚上?(目前在这个DB上花费的时间比备份少了200秒!)
EN

回答 1

Database Administration用户

回答已采纳

发布于 2023-02-14 06:48:30

有几种可能的解释:

  • 崩溃重置了统计数据
  • 有人调用pg_stat_reset()或相关函数来重置统计信息。
  • 数据库使用pg_upgrade进行了升级,此后没有人运行ANALYZE

若要检查最后一次重置数据库的统计信息的时间,请运行

代码语言:javascript
运行
复制
SELECT pg_stat_get_db_stat_reset_time(oid)
FROM pg_database
WHERE datname = current_database();

如果为NULL,则统计信息从未显式重置。

您的进一步调查表明,您的目录数据损坏,这使数据库每天崩溃。如果你有一个好的备份,恢复它。否则,立即删除数据库并对所有文件执行冷备份。您可以尝试通过使用PostgreSQL选项启动-P来解决问题,然后尝试将索引重新构建为超级用户:

代码语言:javascript
运行
复制
REINDEX INDEX pg_catalog.pg_class_oid_index;

目标是使数据库处于可以成功转储它的状态。然后在好的硬件上将其还原到新创建的集群中。不要继续使用这个集群,即使它看起来又很好。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/323452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档