日志在关系数据库中起着至关重要的作用,它们确保数据完整性,支持从故障中恢复,并维护事务一致性。当数据库处理事务(如插入、更新或删除数据)时,它会在将更改应用到实际数据文件之前,将每项更改记录在日志文件中。这种方法通常称为预写式日志 (WAL),它确保系统崩溃时不会丢失任何已提交的事务。日志还通过提供在恢复期间撤销未完成事务或重做已提交事务的方法,强制执行 ACID 属性(原子性、一致性、隔离性、持久性)。如果没有日志,数据库在意外关闭或错误中将面临数据损坏或丢失的风险。
数据库日志通常存储事务ID、操作类型、修改前的数据(用于回滚)和修改后的数据(用于重做)等详细信息。例如,如果用户更新表中的一行,日志会记录旧值(以便在需要时撤销更改)和新值(以便在崩溃后重新应用)。这种双重记录使数据库能够处理两个关键场景:回滚未提交的事务(例如,如果用户取消了操作)以及重新应用在故障发生前未完全写入磁盘的已提交事务。日志是顺序的、只追加的,这使得它们在繁重的工作负载下也能高效写入且持久。
为了优化恢复,数据库使用检查点——数据库状态的周期性快照——来限制崩溃后需要处理的日志数据量。例如,SQL Server 的事务日志和 Oracle 的 redo/undo 日志与检查点配合使用,以减少恢复时间。除了崩溃恢复,日志还支持复制(通过将日志发送到副本)和审计(通过查看历史更改)等功能。例如,PostgreSQL 的预写式日志 (WAL) 被用于复制和时间点恢复。通过提供可靠的更改记录,日志成为数据库在实际场景中保持可靠性和一致性的基石。