我正在处理一个可以有数千个表的数据库系统。问题是,当我尝试使用 备份它时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
“块”以限制表锁的数量,但我敢打赌我可以做得更好。
如果你想要一个一致的备份,你必须增加 max_locks_per_transaction。
如果您具有并发访问权限,则从脚本中分块执行备份会使备份不一致,这可能不是您想要的。
您的另一个选择是使用 PITR 并进行文件系统级备份。这根本不会取出数据库中的任何锁。