【问题标题】:PostgreSQL : could not write to file "pg_wal/xlogtemp no space left device due to autovacuumPostgreSQL:无法写入文件“pg_wal/xlogtemp 由于 autovacuum 没有剩余空间设备
【发布时间】:2021-10-02 11:35:49
【问题描述】:

最近,在我的 PostgreSQL 日志中,我发现:

2021-09-30 08:33:37.242 CEST [4183904] 恐慌:无法写入文件“pg_wal/xlogtemp.4183904”:设备上没有剩余空间 2021-09-30 08:33:37.242 CEST [4183904] 上下文:关系基础/238033/270693 的写入块 413931 2021-09-30 08:33:46.609 CEST [1376] 日志:服务器进程(PID 4183904)被信号 6 终止:中止 2021-09-30 08:33:46.609 CEST [1376] 详细信息:失败的进程正在运行:autovacuum:VACUUM public.public_components_versions_files

我的问题是为什么进程 autovacuum 会导致写入关系块(表上的索引),知道 autovacuum 不会回收空间.... 信息库/238033/270693 是表 public_components_versions_files 的索引,因此 autovacuum (public_components_versions_files) 尝试为索引写入块(public_components_versions_files 上的索引)

postrgesql 版本 12.8

所以也许,这个自动清理会将空间返回给操作系统,因为表末尾的一个或多个页面变得完全空闲,并且可以轻松获得排他表锁

提前谢谢你。

干杯,

阿迪尔

【问题讨论】:

  • 您所看到的似乎与将空间归还给操作系统无关。试图在它们不相关时强迫它们相关是没有意义的。
  • 好的,为什么autovaccum进程失败,尝试写入块,这就是问题所在,autovacuum会删除表和索引中的死行版本并标记可供将来重用的空间,这种行为(写入临时块)真空满时可见
  • 去除死元组还是需要可恢复的,所以还是需要生成WAL。 PANIC 消息很清楚,它无法写入 WAL,因为“设备上没有剩余空间”。
  • 感谢@jjanes 的支持,你说的对,明白了,vacuum 也生成WAL

标签: postgresql


【解决方案1】:

VACUUM 写入表(它修改它),但它不扩展表。但是,由于所有数据修改都必须记录在预写日志中,VACUUM 的修改也必须记录。

PostgreSQL 写入事务日志的空间不足,而不是修改表。

【讨论】:

  • 谢谢@laurenz Albe
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 2019-10-16
  • 2013-12-14
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2017-09-07
相关资源
最近更新 更多