第 11 章 交易日志 交易日志
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
SQL Server 中的每个 数据库都有一个事务日志,除数据文件外,还以一个或多个事务日志文件的形式实现。事务日志存储数据库中所做更改的信息,允许 SQL Server 在意外关闭或崩溃时将数据库恢复到事务一致的状态。数据库中的每一次数据修改都会存储在事务日志中,而低事务日志延迟对于良好的系统性能至关重要。
在本章中,我将介绍 SQL Server 如何记录事务以及事务日志的内部工作原理。接下来,我将介绍事务日志配置的几种最佳实践,并讨论如何解决 "事务日志已满 "的情况。最后,我将讨论如何排除事务日志性能不足的故障。
事务日志内部结构
SQL Server 使用事务日志将每个数据库保持在事务一致的状态,这意味着在事务中完成的数据修改必须全部提交或回滚。SQL Server 绝不允许只应用未提交事务中的一个子集更改,从而导致数据在事务上不一致。
事务日志可保证一致性。它存储数据修改和某些内部操作产生的日志记录流。每条日志记录都有一个唯一的、自动递增的日志序列号(LSN),并描述数据更改。它包括受影响行、数据的新旧版本、执行修改的事务等信息。
每个数据页都会保留修改它的最后一条日志记录的 LSN。在恢复过程中,SQL Server 可以比较日志记录和数据页的 LSN,并找出最近的更改是否保存到了数据文件中。日志记录中存储的信息足以在需要时撤销或重做操作。
SQL Server 使用超前写入日志(WAL),它保证日志记录总是在脏数据页保存到数据库之前写入日志文件。眼尖的读者可能会注意到,在第 3 章中,我提到日志记录是与数据修改同步保存的,而数据页是在检查点过程中异步保存的。虽然从概念上讲这是正确的,但在这里我将说得更精确一些:SQL Server 将日志记录缓存在称为日志缓冲区的小型内存缓存中,分批写入日志记录,以减少日志写入 I/O 操作的次数。
每个 数据库都有自己的日志缓冲区,由称为日志块的 60 KB 结构组成。每个日志缓冲区(和数据库)最多可有 128 个日志块。SQL Server 在一次 I/O 操作中将日志块写入日志文件。但是,它并不总是等到日志块写满。日志写入 I/O 操作的典型大小从 512 字节到 60 KB 不等。
遗憾的是,SQL Server 文档中的术语并不一致,经常将日志块称为日志缓冲区。请记住,SQL Server 在将日志记录写入磁盘之前,会将其缓存在内存中。
数据修改和事务记录
让我们更详细地了解 SQL Server 如何修改数据 。图 11-1显示了一个具有空日志缓冲区和事务日志的数据库。日志中最后一个事务的 LSN 为 7314。
假设有两个活动事务:T1 和T2 。这两个事务的BEGIN TRAN 日志记录已保存在日志中,不会显示在图表中。
图 11-1. 数据修改和事务记录:初始状态
假设事务T1 更新了页面上的一条记录(1:24413)。该操作会生成一条新的日志记录,并将其放入日志缓冲区。它还会更新数据页,将其标记为脏页,并更改页眉中的 LSN。图 11-2对此进行了说明。
此时,日志记录尚未保存到日志文件(通常称为硬化)。只要数据页没有保存到数据文件中,就不会产生任何问题。如果 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access