处理PostgreSQL中已满的磁盘空间


14

我有一个带PostgreSQL 9.3.10后端的Django Web应用程序(坐在Linux操作系统中)。我遇到了磁盘已满错误,因此,即使我尝试截断表,也会出现以下错误:

ERROR:  could not extend file "base/30137/33186048": No space left on device
HINT:  Check free disk space.

我无法轻松地向服务器添加更多磁盘空间,也无法删除此VM上的内容。但是,有几个表可能会被截断,但似乎我现在也不能截断它们。

谁能给我关于我在这里可以做什么的建议?这给我的生产服务器带来了沉重的打击,我在这里有点意外DBA,所以完全不知所措。


如果可以(临时)删除索引,则可以回收一些空间...截断表,然后重新创建它
joanolo

Answers:


9

因为PostgreSQL必须在对表进行任何更改之前写WAL,所以它需要可用的磁盘空间才能删除内容并释放更多的磁盘空间。

如果让磁盘填满,则无法从PostgreSQL中恢复。甚至TRUNCATE还必须写信给WAL。

因此,您必须在卷上释放一些空间,或扩展卷。如果您的PostgreSQL日志文件位于pg_logdata目录中,则可以安全地删除其中一些文件并重新启动Pg。

不要删除pg_xlogpg_clog。这些不是服务器错误日志,它们是数据库,事务日志和提交日志的关键部分。


为什么TRUNCATE必须写wal,WAL中的条目是什么样的?
埃文·卡罗尔

“截断不会记录完整的数据,仅记录截断发生的事实。为了能够回滚它,底层文件一直保留到事务提交为止。” 【来源】(postgresql.org/message-id/...所以截断在墙条目是超小的单纯字节如果这是需要的空间负载的全部,你很可能通过得到它。rm -rf /tmp/*或者删除你的vimrc。
埃文卡罗尔

@EvanCarroll rm -rf /tmp/*...可以删除您可能还想要的东西,例如应用程序套接字等。最好是更具选择性。至于所需的空间,你是对的,这是最少的-一个8K空表+ WAL项为截形,XID分配几KB,提交记录,等等
克雷格·林格
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.