我在使用 postgresql "could not write block .... of temporary file no space left on device ..."出错



我正在运行一个非常大的查询,它在表中插入了很多行,在一些较小的查询中划分了近800万行,但在某个时刻出现了错误:"I geta error"无法写入块。。。。的临时文件设备上没有剩余空间。。。"使用postgresql"。我不知道每次查询后是否需要删除临时文件,以及如何删除,或者是否与其他问题有关。

感谢

好。由于仍有一些事实遗漏,试图回答可能澄清问题:

磁盘空间似乎不足。很可能是因为您的磁盘空间不足。例如,检查Linux/Unix df -h

为了向您展示这是如何发生的:如果有一个可能有3个整数的表,那么仅数据就将占用大约12Byte。在另一个答案中,欧文提到了23Byte,并链接到手册以获取更多信息。此外,行之间可能需要一些填充等。所以做一点数学运算:

即使使用3整数,我们也会以每行大约40字节结束。考虑到您想要插入8000000,这将总计320000000Byte或~300MB(仅针对我们的3整数示例,非常粗略)。

现在,在这个表上有几个索引,索引在插入过程中也会增长。另外,另一个方面可能是表和索引上的膨胀,这些膨胀可以用真空吸尘器清除。

那么解决方案是什么:

  1. 为数据库提供更多磁盘空间
  2. 将插入物再分开一点,确保它们之间有真空

插入数据或索引(创建)总是需要temp_tablespace,它决定了临时表和索引的位置,以及用于排序大型数据集等目的的临时文件。根据您的错误,这意味着您的temp_tablespace位置不足以容纳磁盘空间。

要解决此问题,您可能需要以下两种方法:
1.重新分类您的temp_tablespace所在的空间,默认为/PG_DATA/base/pgsql_tmp

2.如果您的temp_tablespace空间仍然不足以进行临时存储,您可以为该数据库创建另一个临时表空间:

create tablespace tmp_YOURS location '[your enough space location';
alter database yourDB set temp_tablespaces = tmp_YOURS ;
GRANT ALL ON TABLESPACE tmp_YOURS to USER_OF_DB;

然后断开会话并重新连接。

这个错误很容易解释。您正在运行一个大查询,但没有足够的磁盘空间。如果postgresql安装在/opt。。。检查是否有足够的空间运行查询。如果未限制输出以确认您正在获得预期的输出,然后继续运行查询并将输出写入文件。

相关内容

最新更新