您的位置:首页 > 数据库

SQL Server 备份与恢复之一:事务日志

2012-06-13 08:20 309 查看
本文主要来源于Microsoft《SQL Server 2008 R2联机丛书》。转裁请注明出处。
  本节中的主题提供了解事务日志如何用于保证数据库的数据完整性,以及如何用于数据恢复所需的基本体系结构信息。
一、事务日志逻辑体系结构
  SQL Server 事务日志按逻辑运行,就好像事务日志是一串日志记录一样。每条日志记录由一个日志序列号 (LSN) 标识。每条新日志记录均写入日志的逻辑结尾处,并使用一个比前面记录的 LSN 更高的 LSN。
  日志记录按创建时的串行序列存储。每条日志记录都包含其所属事务的 ID。对于每个事务,与事务相关联的所有日志记录通过使用可提高事务回滚速度的向后指针挨个链接在一个链中。
  数据修改的日志记录或者记录所执行的逻辑操作,或者记录已修改数据的前像和后像。前像是执行操作前的数据副本;后像是执行操作后的数据副本。
  操作的恢复步骤取决于日志记录的类型:
(1)记录逻辑操作
若要前滚逻辑操作,请再次执行该操作。

若要回滚逻辑操作,请执行相反的逻辑操作。

(2)记录前像和后像
若要前滚操作,请应用后像。

若要回滚操作,请应用前像。

  许多类型的操作都记录在事务日志中。这些操作包括:
每个事务的开始和结束。

每次数据修改(插入、更新或删除)。这包括系统存储过程或数据定义语言 (DDL) 语句对包括系统表在内的任何表所做的更改。

每次分配或释放区和页。

创建或删除表或索引。

  回滚操作也记录在日志中。每个事务都在事务日志中保留空间,以确保存在足够的日志空间来支持由显式回滚语句或遇到错误引起的回滚。保留的空间量取决于在事务中执行的操作,但通常等于用于记录每个操作的空间量。事务完成后将释放此保留空间。
  日志文件中从必须存在以确保数据库范围内成功回滚的第一条日志记录到最后写入的日志记录之间的部分称为日志的活动部分,即“活动日志”。这是进行数据库完整恢复所需的日志部分。永远不能截断活动日志的任何部分。

二、事务日志物理体系结构
  事务日志是一种回绕的文件。例如,假设有一个数据库,它包含一个分成四个虚拟日志文件的物理日志文件。当创建数据库时,逻辑日志文件从物理日志文件的始端开始。新日志记录被添加到逻辑日志的末端,然后向物理日志的末端扩张。日志截断将释放记录全部在最小恢复日志序列号 (MinLSN) 之前出现的所有虚拟日志。“MinLSN”是成功进行数据库范围内回滚所需的最早日志记录的日志序列号。下图所示为4个虚拟日志文件的日志文件。



  当逻辑日志的末端到达物理日志文件的末端时,新的日志记录将回绕到物理日志文件的始端。如下图所示。



  这个循环不断重复,只要逻辑日志的末端不到达逻辑日志的始端。如果经常截断旧的日志记录,始终为到下一个检查点前创建的所有新日志记录保留足够的空间,则日志永远不会填满。
  但是,如果逻辑日志的末端真的到达了逻辑日志的始端,如果未启用 FILEGROWTH 设置,或保存日志文件的磁盘的可用空间比 growth_increment 中指定的数量少,则会出现 9002 错误。
  如果日志包含多个物理日志文件,则逻辑日志在回绕到首个物理日志文件始端之前,将沿着所有物理日志文件移动。

三、检查点(Checkpoint)
  检查点将脏数据页从当前数据库的缓冲区高速缓存刷新到磁盘上。



这最大限度地减少了数据库完整恢复时必须处理的活动日志部分。 在完整恢复时,需执行下列操作:
前滚系统停止之前尚未刷新到磁盘上的日志记录修改信息。

回滚与未完成的事务(如没有 COMMIT 或 ROLLBACK 日志记录的事务)相关联的所有修改。

检查点在数据库中执行下列过程:
将记录写入标记检查点起点的日志文件。

将为检查点记录的信息存储在检查点日志记录链内。

如果数据库使用简单恢复模式,则标记在 MinLSN 前重用的空间。

将所有脏日志和数据页写入磁盘。

将标记检查点结束的记录写入日志文件。

将这条链起点的 LSN 写入数据库启动页。

  SQL Server 数据库引擎将生成自动检查点。 自动检查点之间的间隔基于使用的日志空间量以及自上一个检查点以来经历的时间。 如果只在数据库中进行了很少的修改,自动检查点之间的时间间隔可能变化很大并且很长。 如果修改了大量数据,自动检查点也会经常出现。
  如果数据库使用的是简单恢复模式,自动检查点将截断事务日志中没有使用的部分。 但是,如果数据库使用的完整恢复模式或大容量日志恢复模式,自动检查点则不会截断日志。

四、活动日志
  日志文件中从 MinLSN 到最后写入的日志记录这一部分称为日志的活动部分,或者称为“活动日志”。 这是进行数据库完整恢复所需的日志部分。 永远不能截断活动日志的任何部分。 所有的日志记录都必须从 MinLSN 之前的日志部分截断。
  下图显示了具有两个活动事务的结束事务日志的简化版本。 检查点记录已压缩成单个记录。



  LSN 148 是事务日志中的最后一条记录。 在处理 LSN 147 处记录的检查点时,Tran 1 已经提交,而 Tran 2 是唯一的活动事务。 这就使 Tran 2 的第一条日志记录成为执行最后一个检查点时处于活动状态的事务的最旧日志记录。 这使 LSN 142(Tran 2 的开始事务记录)成为 MinLSN。

五、预写事务日志
  SQL Server 使用预写日志 (WAL),此日志确保在将关联的日志记录写入磁盘后再将数据修改写入磁盘。这维护了事务的 ACID (原子、一致、隔离和持久)属性。
  若要了解预写日志的工作原理,最重要的是了解如何将修改的数据写入磁盘。SQL Server 维护当必须检索数据时,将数据页读入的缓冲区高速缓存。数据修改不是直接在磁盘上进行,而是修改高速缓冲存储器中的页副本。直到数据库中出现检查点,或者必须将修改写入磁盘才能使用缓冲区来容纳新页时,才将修改写入磁盘。将修改后的数据页从高速缓冲存储器写入磁盘的操作称为刷新页。在高速缓存中修改但尚未写入磁盘的页称为“脏页”。
  对缓冲区中的页进行修改时,将在记录修改的日志高速缓存中生成一条日志记录。在将关联的脏页从高速缓冲存储器刷新到磁盘之前,必须将这条日志记录写入磁盘。如果在写入日志记录前刷新脏页,则该脏页便会在磁盘上创建修改。如果服务器在将日志记录写入磁盘前失败,则不能回滚此修改。SQL Server 具有防止在写入关联的日志记录前刷新脏页的逻辑。日志记录将在提交事务时写入磁盘。
  注意: 某些 IDE SATA 驱动器在将数据写入磁盘之前将数据写入缓存在内部内存中。这样会导致预写日志无法正确工作。如果正在运行 SQL Server 的计算机使用这些磁盘类型之一,则应启用 enable_force_flush 选项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: