0

我正在使用 CloudSQL - GCP 的 postgresql12 版本。

我们目前正在输入数十亿的数据,我们不希望输入在中间被中断。

但是,我在 CloudSQL 标志中将 autovacuum 设置设置为关闭,但它似乎每天都会自动完成。

随着 autovacuum 的进行,使用 python sqlalchemy 的输入会导致错误。

sqlalchemy.exc.OperationalError: (psycopg2.errors.ProgramLimitExceeded) multixact "members" limit exceeded
DETAIL: This command would create a multixact with 2 members, but the remaining space is only enough for 1 member.
HINT: Execute a database-wide VACUUM in database with OID 16427 with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings.

解决办法是什么?

4

1 回答 1

1

解决方案是按照提示进行操作。这对于防止您的数据库遭受数据损坏是必要的。根本原因是 multixact 包含事务编号,如果这些编号环绕(在大约 20 亿个事务之后),某些表行可能会突然看起来被锁定。

正如文档所说:

作为一种安全设备,对于 multixact-age(参见第 25.1.5.1 节)大于 autovacuum_multixact_freeze_max_age 的任何表,都会进行积极的真空扫描。此外,如果 multixacts 成员占用的存储空间超过 2GB,则会更频繁地对所有表进行激进的真空扫描,从那些具有最旧 multixact-age 的表开始。即使名义上禁用了 autovacuum,这两种激进扫描也会发生。

显然,数据库为了防止最坏的情况发生而一次又一次地拼命启动的那些 autovacuum 运行并没有成功。您应该查看日志文件以找出原因。

把停机时间,保存你的数据库。然后找出为什么反环绕自动真空首先失败并解决该问题。并启用自动真空!如果需要,您可以在将数据加载到其中时暂时在单个表上禁用它。

于 2021-11-19T06:39:01.570 回答