没有合适的资源?快使用搜索试试~ 我知道了~
oracle重做日志原理
资源推荐
资源详情
资源评论
重做日志原理
第 11 章 重做日志的 VLF 与 LSN
重做日志保存了数据库中数据的改变记录,其主要作用在于保证数据库的数据安全,
当出现存储介质损坏时,可以把旧的备份文件应用重做日志恢复到数据库出现故障的时刻
以及出现系统故障时(停电或死机),保证数据一致性,前者一般称为介质恢复,后者一般
称为实例恢复。除了重做数据,SQL Server 的重做日志还保存了回滚一个事务所需的数据。
本章主要说明重做日志文件中的 VLF 以及重做记录的 LSN,这是理解重做日志原理的
两个最基本概念。
本章内容主要包括:
VLF 及其状态
VLF 如何循环使用
日志记录 LSN 的含义以及在重做文件中定位日志记录的方法
11.1 VLF 及其状态
SQL Server 把重做日志文件划分为多个 VLF(Virtual Log File,即虚拟日志文件),VLF
的数量以及每个 VLF 的大小由 SQL Server 根据日志文件的大小及增长率确定。
如下图所示,日志文件中的 VLF 被循环使用,当 VLF 中的重做数据不再需要时,可
以被新产生的重做数据覆盖而重用。
图11-1 VLF的循环使用
11.1.1 日志记录
SQL Server 为了完成数据恢复或事务回滚,对数据库中任何数据的修改都会记录在重
做日志文件中。日志文件中的最小单位是日志记录,一条日志记录对应一个使数据库状态
发生变化的操作。与表中的记录一样,日志记录也由多个列构成,每个列对应数据修改操
作的一个属性。
日志文件中的日志记录在某些条件下是不需要的,这些条件包括:
日志记录所在的事务已经提交。
日志记录修改的数据页已经被 checkpoint 进程写入磁盘。
任何数据库备份不再需要这个日志记录。
数据库镜像、数据库复制等环境不再需要读取这个日志记录。
只要这些条件中有一条不满足,则日志记录都是在某些情况下需要的。
为了叙述简单,以下内容均假定数据库未处于镜像、复制的环境中。另外本书有时也
把日志记录称为重做记录。
11.1.2 VLF 的状态
根据存储的日志记录情况,重做文件中的 VLF 可以以下面四种状态之一存在:
active:VLF 中存在属于活动事务的日志记录,活动的事务指未结束的事务。
recoverable:不包含活动事务的日志记录,但数据库此时处于维护一个完整日志
序列的状态,而这些 VLF 还未进行备份,或者数据库处于复制、镜像等需要使用
重做日志传送方式同步数据库间数据的环境时, VLF 中包含未传送的重做数据。
数据库处于维护完整日志序列状态是指,在完整恢复或大容量恢复模式下,已经
执行过全库备份,在这种情况下,经过事务日志备份的 VLF 才可被覆盖。
reusable:VLF 中包含的日志记录都是不再需要的,这种状态也称为可截断。可截
断的意思是其内容可以被新产生的重做数据覆盖。
unused:这个 VLF 从未被使用。
下面两个操作可以把不包含活动事务的 VLF 标记为可截断:
在简单恢复模式下,或者在完整恢复模式及大容量日志恢复模式下从未执行过全
库备份的情况下(其运行方式相当于简单恢复模式),执行了 checkpoint 操作。
在完整恢复模式或大容量日志恢复模式下,若已经执行过全库备份,事务日志备
份会把备份过的、且不包含活动事务的 VLF 标记为可截断。
VLF 标记为可截断后,只是在 VLF 头部系统数据中设置了可截断标记,表示其内容可被
新的重做数据覆盖。
11.1.3 查看 VLF 信息
要查看重做文件中的 VLF 信息,可以使用 dbcc loginfo 命令,显示结果中的每一行表
示日志文件中的一个 VLF 信息。
首先创建测试数据库 testLog。
! "#
$%
&
'
(
) ! "#
*+,
%
执行 dbcc loginfo 命令查看其 VLF 的系统信息。
-
#
./.0*012.0!30-4503
66666666666666666666666666666666666666666666666666666666666666666666666666666666
''($)
'&$))))
'('$)))))
(($&&))))
显示结果中的每个列的含义如下:
FileId:日志文件的物理文件号。如果数据库只有一个日志文件,则此列的值都是
相同的。如果数据库只有 1 个数据文件和 1 个重做日志文件,则重做日志文件为
2 号,数据文件为 1 号。
FileSize:VLF 的大小,以字节为单位。
StartOffset:VLF 在整个日志文件中的起始位置偏移量,以字节为单位。FileSize
即两个 StartOffset 的差。dbcc loginfo 的输出结果以此列为准进行排序。重做日志
文件的前 8192 字节为文件头,其中不包含重做数据,因此第 1 个 VLF 的偏移量
总是从 8192 开始。
FSeqNo:每个 VLF 的唯一逻辑顺序号,表示 VLF 被使用的顺序。FSeqNo 最大的
VLF 表示其正在使用,此值为 0 则表示 VLF 还从未使用。
Status: VLF 的状态。Status 只有 2 和 0 两个可能值,2 表示这个 VLF 为 active 或
recoverable,0 表示这个 VLF 为 reusable 或 unused。如果经过事务日志备份或日志
截断后,某些 VLF 的 status 仍然为 2,则可以推测这些 VLF 中包含活动事务,即
未结束的事务。标记一个 VLF 为可截断,即把其 Status 状态设置为 0。
Parity:用于检测 VLF 是否发生 IO 错误的一个数值,其值在 64 和 128 之间切换。
CreateLSN : VLF 创 建 时 的 LSN 。 随 同 数 据 库 创 建 而 一 起 创 建 的 VLF 的
CreateLSN 都为 0,CreateLSN 相同的 VLF 是同时创建的。
以上查询结果表示 testLog 数据库当前有 4 个 VLF,第 1 个 VLF 的序列号为 44,其他 3
个的序列号为 0,序列号为 0 也表示这些 VLF 还未使用,由其 Status 属性为 0,也可以进一
步验证这 3 个 VLF 还未使用。
上述系统信息保存在每个 VLF 的前 42 字节中,dbcc loginfo 命令即由此处读出数据并
显示。各列在 VLF 中的存储位置如下表所示,表中的字节偏移量由 0 开始计数。
表 11-1 VLF 主要系统数据存储的位置
存储数据 位置偏移量
Parity Byte#1
FseqNo Byte#4~7
Status Byte#8~11
FileSize Byte#16~23
CreateLSN Byte#32~41
也可以直观地用下图表示。
图11-2 VLF头部系统数据含义
11.1.4 重做日志文件的 VLF 个数
日志文件的初始大小最小为 512KB,其实际大小总是 64KB 的整数倍,若创建数据库
时指定的初始大小或增长空间的大小不是 64KB 的整数倍,则会以 64KB 为单位取整。
日志文件中的 VLF 个数由其空间大小决定。创建数据库时,SQL Server 根据日志文件
的初始大小确定其中的 VLF 个数,日志文件的大小需要增长时,也会根据增长部分的大小,
确定新增加的空间中要划分的 VLF 个数,而日志文件增长之前已经存在的 VLF 不会受影
响,每个 VLF 的大小一般会均分其所在空间。
VLF 个数与日志文件大小或增长部分大小之间的关系如下表所示。
表 11-2 VLF 个数与日志文件大小的关系
空间大小 VLF 个数
512KB7size<768KB
2
768KB7size<1MB
3
1MB7size764MB
4
64MB <size 71GB
8
size>1GB 16
下面简单验证一下表中的结果。先看日志文件初始大小对 VLF 个数的影响。
创建测试数据库 testnVLF,其日志文件大小指定为 512KB。
8.
! 8."#
$%
&
'
(8.
) ! 8."#
*9,
%
查看其 VLF 信息。
剩余63页未读,继续阅读
资源评论
yaodemeng1
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功