预写事务日志

本主题说明预写事务日志在记录对磁盘进行的数据修改中所起的作用。有关事务日志的基本信息,请参阅事务日志概述

SQL Server 使用预写日志 (WAL),此日志确保在将关联的日志记录写入磁盘后再将数据修改写入磁盘。这维护了事务的 ACID 属性。有关事务和 ACID 属性的详细信息,请参阅事务(数据库引擎)

若要了解预写日志的工作原理,最重要的是了解如何将修改的数据写入磁盘。SQL Server 维护当必须检索数据时,将数据页读入的缓冲区高速缓存。数据修改不是直接在磁盘上进行,而是修改高速缓冲存储器中的页副本。直到数据库中出现检查点,或者必须将修改写入磁盘才能使用缓冲区来容纳新页时,才将修改写入磁盘。将修改后的数据页从高速缓冲存储器写入磁盘的操作称为刷新页。在高速缓存中修改但尚未写入磁盘的页称为“脏页”。

对缓冲区中的页进行修改时,将在记录修改的日志高速缓存中生成一条日志记录。在将关联的脏页从高速缓冲存储器刷新到磁盘之前,必须将这条日志记录写入磁盘。如果在写入日志记录前刷新脏页,则该脏页便会在磁盘上创建修改。如果服务器在将日志记录写入磁盘前失败,则不能回滚此修改。SQL Server 具有防止在写入关联的日志记录前刷新脏页的逻辑。日志记录将在提交事务时写入磁盘。

注意注意

某些 IDE SATA 驱动器在将数据写入磁盘之前将数据写入缓存在内部内存中。这样会导致预写日志无法正确工作。如果正在运行 SQL Server 的计算机使用这些磁盘类型之一,则应启用 enable_force_flush 选项。