执行 pg_dump 时出现共享内存不足错误

Pri*_*iya 1 postgresql psql locking pg-dump

我有一个包含 3 个模式和大约 1200 个表的 postgres 数据库。当我尝试使用命令仅获取其中的 pg_dump 模式时,pg_dump -h localhost -p 5432 -U postgres -d my_test_db -s有时会出现错误

错误:共享内存不足
提示:您可能需要增加 max_locks_per_transaction

这种情况也是随机发生的,当我重新运行相同的查询时,它运行良好。有什么方法可以克服这个问题

小智 5

pg_dump在它转储的每个表上获取共享锁。因此,您需要配置 Postgres 以支持那么多锁。我不清楚您是否有 3 个模式,每个模式有1200 个表 - 这意味着总共 3600 个表,或者是否有 1200 个表分布在 3 个模式中。

引用自手册

共享锁表跟踪max_locks_per_transaction * (max_connections + max_prepared_transactions)对象(例如表)上的锁;因此,在任何时候最多只能锁定这么多不同的对象。该参数控制为每个事务分配的平均对象锁数量;单个事务可以锁定更多对象,只要所有事务的锁都适合锁表

假设所有内容都配置为默认值,您最终会得到64 * (100 + 0) = 6400可以锁定的对象。如果pg_dump这是数据库上唯一运行的东西,那么默认配置应该没问题。

事实上,您偶尔会遇到该错误,这意味着您的并发事务也使用了许多对象锁,因此pg_dump无法分配足够的锁。

尽管如此,您还是应该增加该值以避免“偶尔”的错误。我首先将其增加到 128。