为什么它在GCP上的Cloudsql中即使关闭了autovacuum也能运行



我使用的是CloudSQL-postgresql12版本的GCP。

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

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

随着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.

解决方案是什么?

解决方案是遵循提示。这对于防止数据库遭受数据损坏是必要的。其根本原因是,一个multixact包含事务编号,如果这些编号被环绕(在大约20亿个事务之后(,一些表行可能会突然被锁定。

正如文件所说:

作为一种安全装置,将对多xact年龄(见第25.1.5.1节(大于autovacuum_multixact_freeze_max_age的任何表格进行积极的真空扫描。此外,如果multixact成员占用的存储空间超过2GB,则从最旧multixact年龄的表开始,所有表都会更频繁地进行主动真空扫描。即使自动真空在名义上被禁用,这两种攻击性扫描也会发生。

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

减少停机时间,保存数据库。然后找出防缠绕自动真空吸尘器最初失败的原因并解决这个问题。并启用自动真空!如果你愿意,你可以在一个表上临时禁用它,同时将数据加载到其中

最新更新