我有一个带有 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,所以完全被难住了。
因为 PostgreSQL 必须在对表进行任何更改之前写入 WAL,所以它需要空闲磁盘空间才能删除内容并释放更多磁盘空间。
如果您让磁盘填满,您将无法从 PostgreSQL 中恢复。甚至
TRUNCATE
仍然必须写信给 WAL。因此,您必须释放该卷上的一些空间,或扩展该卷。如果您的 PostgreSQL 日志文件在
pg_log
数据目录中,您可以安全地删除其中一些并重新启动 Pg。不要删除或。_ 这些不是服务器错误日志,它们是数据库、事务日志和提交日志的关键部分。
pg_xlog
pg_clog
关于在紧急情况下释放磁盘空间的更多想法:
SELECT
,COPY IN
,COPY OUT
,CREATE INDEX
, ...):不保证会有所帮助,但在某些情况下可能会有所帮助。Pg_Cancel_Backend(<PID>)
您已经打开了特权会话,或者只是kill -s INT -- <PID>
其他情况,请使用。Pg_Terminate_Backend(<PID>)
您已经打开了特权会话,或者只是kill -s TERM -- <PID>
其他情况,请使用。pg_prewarm
模块:SET pg_prewarm.autoprewarm_interval = 0
如果您已经打开了特权会话,请运行。rm -f <PGDATA>/autoprewarm.blocks
pg_stat_statements
模块,并打开一个特权会话:SELECT Pg_Stat_Statements_Reset()
。SELECT Pg_Stat_Reset()
。(要明确一点:这些都是临时措施,不是长期甚至短期的解决方案!)