PostgreSQL抱怨共享内存,但是共享内存似乎还可以


13

我一直在通过PostgreSQL服务器进行密集的模式删除和创建,但是现在抱怨..:

WARNING:  out of shared memory
ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

但是问题仍然存在,如果PostgreSQL仅用重新启动service postgresql restart,我怀疑max_locks_per_transaction不会进行任何调整。

我有点疏远,因为此错误的故障排除列表对我不起作用。

更多信息1409291350:缺少一些细节,但我保留了核心SQL结果。

postgres=# SELECT version();
PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2,
 64-bit

和:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty

2
PostgreSQL版本来自SELECT version()?有趣的问题...
克雷格·林格2014年

2
“我怀疑max_locks_per_transaction不会调整任何内容。” -嗯,你为什么会怀疑呢?您是否尝试过按照提示的建议进行操作?
Josh Kupershmidt 2014年

您是否尝试过按照提示的建议进行操作?max_locks_per_transaction = 64 # min 10到目前为止,我在/etc/postgresql/9.3/main/postgresql.conf中没有评论。
2014年

1
开头的默认max_locks_per_transaction为64-取消注释该行并没有有效地对其进行更改。
yieldsfalsehood

1
可以有效增加到128个解决问题,实际上允许操作继续。
2014年

Answers:


11

您对密集删除和创建的评论,以及关于增加max_locks_per_transaction的通知,暗示您在同一事务中删除和创建许多对象。每个锁都导致一个锁,每个锁都需要少量的共享内存。因此,max_locks_per_transaction限制了您可以在一个事务中持有的锁的数量(以防止任何一个事务使用所有共享内存)。

您可以稍微增加该限制(我建议不要将其设置为任意大,否则您将遇到实际实际耗尽总共享内存的单独情况),也可以进行丢弃并分批创建事务或一次丢弃/每笔交易创建。

编辑:显然我对max_locks_per_transaction的工作方式有误。根据文档,可用锁的总数为max_locks_per_transaction *(max_connections + max_prepared_transactions)-任何一个事务的容纳量都可以超过max_locks_per_transaction,只要在各处保留的锁的数量小于该总值即可。


我的工作流程包括(1)转储模式X,(2)删除另一个模式Y,以及(3)在模式名称Y上还原X。据我所知,直到今天,我已经进行了几周的活动,而今天步骤(2)失败。步骤(2)主要包括DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public,这些是抛出警告,错误和提示的语句。
2014年

将最大锁数从64增加到128,可以继续进行工作流。还没有掌握所有内部信息,但是我想在DROP SCHEMA和CREATE SCHEMA句子之间进行提交将具有类似的缓解效果。
2014年

现在,我认识到很多天我得到了一个小的模式增加,并且这个问题与那些小的模式增加之一完全匹配。从现在开始,作为一般策略,我将对HINT进行更多考虑。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.