磁盘上没有剩余空间 (PostgreSQL)

磁盘上没有剩余空间 (PostgreSQL)

我试图将 55GB SQL 文件写入我的数据库。以前每次都会崩溃。我删除了日志并进行了一些清理以使服务器运行,但事务从未完成。后来,我清空了我正在写入的所有表(我有一个备份),但即使在那之后,当我尝试写入 SQL 文件时,它在一系列成功插入后给了我这个错误 - 无法写入文件“pg_subtrans” /14C6" 位于偏移量 106496 处:设备上没有剩余空间。

有办法解决这个问题吗?是否还有与 PGSQL 相关的日志需要清理?我读过移动 pg_xlog 可能会有帮助?我应该尝试这个吗?

任何帮助将不胜感激。

谢谢!

df -h为了可读性,从注释中重新格式化的输出。

Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_zarkin-lv_root   574G  540G 4.3G  100% /
/dev/sda1                       194M  35M  150M  19%  /boot
tmpfs                           5.9G  928K 5.9G  1%   /dev/shm
/dev/mapper/smeidc0-smeisky0    7.2T  5.2T 2.0T  73%  /smeidc/sky0
/dev/md0                        7.2T  6.5T 400G  95%  /smeidc/backup

答案1

我试图将 55GB SQL 文件写入我的数据库。 [...] 设备上没有剩余空间。有办法解决这个问题吗?

不。

在加载之前,您应该为您的应用程序提供足够的数据量。

我知道这个答案有点简洁,所以在下面添加一些新手级别的提示。

我的磁盘空间去哪儿了?

任何 postgres 表使用的总磁盘空间是物理模型的结果,包括:

  • 包含表行的表块
  • 索引块(如果有索引)
  • 事务日志(又名 WAL 或 xlog,一段时间后就会消失)

表行的物理大小取决于数据类型以及数据压缩的程度。有大约。每行有 22 字节的开销,因此如果您有约 100 字节的原始压缩数据,则您的行将占用约 122 字节。

索引的物理大小更难预测,它取决于索引字段和索引类型。

如何在批量更新期间减少磁盘使用?

为了最大限度地减少磁盘开销,请遵循 PostgreSQL 文档中的官方性能提示:

批量更新后如何减少磁盘使用?

以下是一些有助于缩小 PostgreSQL 数据库大小的知识:

  • 如果你想清除整个表,请注意 SQLDELETE并不总是清理文件。使用TRUNCATE,不要DELETE完全删除表内容。

  • 如果您无法完全清除表,并且需要删除大量行子集(50% 或更多),则运行以下命令非常有用VACUUM FULL或者 CLUSTERDELETE 之后的命令,用于收缩表。

  • 为事务日志(pg_xlog 目录)保留的数据量可以通过以下方式控制postgres 服务器设置

  • 可以借助以下命令检测未使用的数据库、表和索引系统视图(pg_stat_database、pg_stat_user_tables、pg_stat_user_indexes)

相关内容