在RHEL 7上运行PostgreSQL版本12系统具有28G内存和12G共享内存数据库在磁盘上使用超过6T有些行大约有3亿行。
将我的数据库从版本9移动到版本12,并且正在新数据库上运行测试。我们有一个过程在临时表中生成摘要数据,然后查询临时表中的不同内容,然后删除临时表-这比多次运行非常相似的查询快得多。
他们的查询与此类似:
CREATE TEMPORARY TABLE
XXX
AS
SELECT
COUNT(t.id) AS count,
t.tagged AS tagged,
t.tag_state AS tag_state,
t.error AS error,
td.duplicate AS duplicate
FROM
ttt t
INNER JOIN tweet_data td ON (td.tweet_id = t.id)
GROUP BY
t.tagged,
t.tag_state,
t.error,
td.duplicate;
请注意,这在V9上可以正常工作,但是,我没有在V9上非常仔细地观看过它,以了解它的作用。在V12上,共享内存使用量增长缓慢,然后在大约15分钟后迅速上升,增长到大约12G,然后试图使其更大并失败:
错误是:错误:无法将共享内存段“ /PostgreSQL.868719775”的大小调整为2147483648字节:设备上没有剩余空间
一时兴起,我们只运行了select语句而未创建临时表,并且在共享内存增加时它也失败了,但是错误消息说它被管理员杀死了。
我目前正在针对数据库运行真空,以查看是否有帮助。
最大的担忧是,这在V9上确实有效,但在V12上失败。我也知道,他们的查询引擎与V9相比非常不同,并且在V12中是新的。
我有些疯狂的希望,分阶段运行真空会有所作为。使用pg_upgrade迁移了数据。
vacuumdb -U postgres -p 5431 --all --analyze-in-stages
我不知道是否创建了临时表,但是在运行真空后,我们再次运行了完整查询,创建了临时表,它也失败了。
有什么想法吗?我是尝试更多共享内存的唯一选择吗?
这些共享内存段用于工作进程与parallel query之间的通信。
PostgreSQL似乎资源紧张,虽然错误是症状而不是问题的原因,但是您可以通过禁用此语句的并行查询来改善这种情况:
SET max_parallel_workers_per_gather = 0;
然后您的查询将花费更多时间,但是使用更少的资源,这可能足以解决问题。
从长远来看,您应该检查您的配置,这可能在内存或连接数量上过于慷慨,但我无法从此处进行诊断。