我将 UNLOGGED 表用于数据仓库样式应用程序中的几个非常大的表。
直到最近,我才明白 UNLOGGED 的意思是“不会写入 WAL”——这反过来意味着最近的更改可能会在进程崩溃/不干净终止时丢失,并且不会有复制
也许我误解了文档中的语言(或者我没有),但是当我最近阅读文档时,我理解这意味着整个表将在不干净的退出时被截断。是对的吗?
问题是,在不干净的退出时,整个表将被截断(根据 PostgreSQL 中 TRUNCATE 的含义),还是像日常使用中那样被截断 - 最后会突然终止,只有最近的行丢失,由于没有 WAL
肯定是后者吧?被完全截断对我来说毫无意义;如果我有一个包含一年数据的 UNLOGGED 表,而今天 postgres 进程出现故障,为什么它会破坏该表的全部内容?
还是我误解了,只是最近的更改(通常可以通过 WAL 或类似地通过备用恢复)会丢失?
官方 PostgreSQL 文档的简介如下,关于截断我们我指的是什么:
如果指定,该表将创建为未记录的表。写入未记录表的数据不会写入预写日志(参见第 30 章),这使得它们比普通表快得多。但是,它们不是崩溃安全的:未记录的表在崩溃或不正常关机后会自动截断。
我不确定我怎么从来没有注意到这种语言,但它让我有些震惊。丢失最近几天有价值的数据对我来说不是问题,但必须从我保留的备份(显然是非 WAL 备份)中恢复整个表(每个表价值约 60GB 的数据)一个简单的进程崩溃是惊人的