Postgresql | 设备上没有剩余空间

23

在运行 PostgreSQL 数据库的批处理过程时,我遇到了空间问题。

然而,df -h 命令显示机器有足够的空间。

输入图像描述

以下是确切的错误信息。

org.springframework.dao.DataAccessResourceFailureException: PreparedStatementCallback; SQL [INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; ERROR: could not extend file "base/16388/16452": No space left on device
  Hint: Check free disk space.
这个问题是由什么引起的? 编辑 postgres数据目录位于/var/opt/rh/rh-postgresql96/lib/pgsql/data
df -h /var/opt/rh/rh-postgresql96/lib/pgsql/data
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda2      100G   63G   38G  63% /

2
你的数据目录在哪里?(在 psql 中运行 show data_directory; 命令即可查看) - user330315
数据目录是 /var/opt/rh/rh-postgresql96/lib/pgsql/data。 数据目录当前的大小是15GB。 - YogeshR
你应该在 df -h 的输出中包含 that 目录(顺便说一句:你也可以从控制台复制和粘贴文本,不需要使用图像)。 - user330315
@a_horse_with_no_name:编辑了帖子并添加了数据目录的空间。 - YogeshR
而且,由于您正在使用ORM框架,temptable-explosion可能是一些笛卡尔积的结果,这是由于查询中的逻辑错误导致的。 - wildplasser
1个回答

26

很可能存在一些查询会创建大量的临时文件,这些文件会暂时填满硬盘。当查询完成(或失败)后,这些文件将被删除,因此在查看时文件系统有足够的自由空间。

postgresql.conf中设置log_temp_files = 10240(并重新加载),以记录所有超过10 MB的临时文件,然后您可以检查日志文件以确定是否确实是原因。

尝试识别有问题的查询,并进行修复。

如果临时文件不是问题,那么临时表可能是。它们在数据库会话结束时自动删除。您的应用程序使用临时表吗?

另一个可能性是由数据库之外的某些东西创建的文件。


我将log_temp_files设置为10240,但它没有起作用。然后我将其设置为0,并检测到3-4 MB的临时文件。每秒钟会生成5-6个文件。 - YogeshR
嗯,这并不能解释你的空间不足情况(但如果你的内存情况允许的话,提高work_mem可能是个好主意)。也许是临时表?我会更新答案的。 - Laurenz Albe
5
我正在使用docker化的postgres实例,这在我的情况下怎么能够工作? - arilwan
@arilwan 你需要使用卷或主机映射来编辑postgresql.conf文件。(提示:无论如何,您应该这样做。) 或者,构建一个带有编辑过的conf的新镜像。 - duct_tape_coder
1
@arilwan 奇怪的是,对我来说 docker system prune 解决了这个问题。 - Alex Nault
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接