【问题标题】:Doesn't batch writing WAL files in databases negate the purporse of WAL files?在数据库中批量写入 WAL 文件不会否定 WAL 文件的用途吗?
【发布时间】:2021-10-02 12:03:56
【问题描述】:
我正在阅读有关数据库的信息,但我无法理解有关 WAL 文件的一件事。它们的存在是为了确保事务的可靠性和可恢复性,然而,显然,为了提高性能,WAL 文件是分批写入而不是立即写入的。在我看来,这看起来很矛盾,并且否定了 WAL 文件的目的。如果 WAL 提交之间发生崩溃会发生什么?这与根本没有 WAL 而只是定期对数据库本身进行 fsync 有何不同?
【问题讨论】:
标签:
database
postgresql
database-design
transactions
wal
【解决方案1】:
我没有太多想法,只是在寻找这方面的信息,因为这对我来说似乎很有趣。
如果有些忍者发现我的解释不正确,请纠正我。我现在理解的是,WAL文件是在commit之前写入的,然后一旦确认事务数据在WAL上,就确认事务。
批量完成的是将这些 WAL 数据移动到堆和索引,真实表中。
预写式日志记录 (WAL) 是一种确保数据完整性的标准方法。在大多数(如果不是全部)有关事务处理的书籍中都可以找到详细的描述。简而言之,WAL 的核心概念是只有在记录了这些更改之后才写入对数据文件(表和索引所在的位置)的更改,也就是说,在描述更改的日志记录被刷新到永久存储之后。 strong> 如果我们遵循这个过程,我们不需要在每次事务提交时将数据页刷新到磁盘,因为我们知道在发生崩溃时我们将能够使用日志恢复数据库:任何未完成的更改可以从日志记录中重做已应用于数据页的数据。 (这是前滚恢复,也称为 REDO。)
https://www.postgresql.org/docs/current/wal-intro.html