【问题标题】:Effect of vacuum freeze in PostgresqlPostgresql中真空冷冻的效果
【发布时间】:2021-12-01 05:57:32
【问题描述】:

我在 GCP 上将 postgresql 用于 cloudSQL。

一个表几乎处于插入过程中。 (理论上每天超过1000万)

在数据大约100亿时进行自动清理。

此外,当自动清理运行时,其他进程只能由单个用户使用。

也许是真空冷冻的效果。

具体原因是什么?

并且我决定如果自动清空运行的次数少且频繁,执行周期会更短,因此我将参数修改如下。

autovacuum_freeze_max_age : 2 billion -> 100 million
autovacuum_multixact_freeze_max_age : 2 billion -> 100 million

是否有任何参数需要修改以进一步提高性能?

【问题讨论】:

  • " 其他进程只能由单个用户使用" 任何给定进程总是只能为单个用户提供服务。您看到了什么让您认为只有在吸尘期间才会出现这种情况?
  • 错误短语是:sqlalchemy.exc.OperationalError: (psycopg2.errors.ProgramLimitExceeded) multixact "members" limit exceeded DETAIL: 此命令将创建一个包含 2 个成员的 multixact,但剩余空间仅为足够 0 个成员。错误是在vacuum运行时修改xact id引起的吗?

标签: postgresql vacuum autovacuum


【解决方案1】:

是的,这些是使反环绕自动真空更频繁运行的正确设置,从而使单个运行更小。

如果您将vacuum_freeze_min_age 设置为 0,您可以进一步改进此表的问题,以便在 autovacuum 运行时冻结所有行。

请注意,您可以像这样在单个表上设置这些参数:

ALTER TABLE tab SET (
   autovacuum_freeze_max_age = 100000000,
   autovacuum_multixact_freeze_max_age = 100000000,
   vacuum_freeze_min_age = 0
);

这样更好,因为使用这些参数的默认设置可能会更好地为数据库中的其他表提供服务。

请注意,一个简单的替代方法是升级到 PostgreSQL v13 或更高版本,正是由于这个原因,autovacuum 将更频繁地在仅插入表上运行。

VACUUM 一样,将maintenance_work_mem 设置为高将提高性能。

【讨论】:

  • 感谢您的回答!以上问题中,执行vacuum freeze时,相关表切换为单用户模式是否正确?
  • 不,一切正常。防缠绕真空是一种正常的维护程序。请注意,默认情况下,它不等同于 VACUUM (FREEZE),只有将 vacuum_freeze_min_age 更改为 0。
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2021-12-01
  • 2016-04-10
  • 2016-03-14
  • 1970-01-01
相关资源
最近更新 更多