使用 pg_dump 处理大量的表?

使用 pg_dump 处理大量的表?

我正在处理一个可以包含数千个表的数据库系统。问题是,当我尝试使用 备份它时pg_dump,有时会收到以下错误:

pg_dump: WARNING:  out of shared memory
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.
pg_dump: The command was: LOCK TABLE public.foo IN ACCESS SHARE MODE

我当然可以增加max_locks_per_transaction设置。但问题是表的数量可能会有所不同。我不想每次出现故障时都要不断重新查看此设置(假设我们注意到了故障,因为这是在一个 cron 作业中!)。

解决这个问题的最佳方法是什么?目前,我正在编写一个 Perl 脚本,它将列出所有表,然后调用pg_dump“块”来限制表锁的数量,但我相信我可以做得更好。

答案1

如果您想要一致的备份,则必须增加max_locks_per_transaction。

通过脚本分块执行将使备份不一致如果您有并发访问,这可能不是您想要的。

另一个选择是使用 PITR 并进行文件系统级备份。这不会在数据库中删除任何锁。

相关内容