11.5 登记日志文件: ~) ^/ B f& m: Q& X b0 }& k
11.5.1 日志文件的格式和内容8 r; @, k9 d8 T" ?8 {( @
日志文件是记录每个事务对数据库更新操作的文件,数据库系统在运行过程中,DBMS负责将所有事务的更新操作登记到日志文件中,也就是说日志文件是系统自动维护的。
5 R8 Q Y( g* _, ^6 p, i# _1、以记录为单位的日志文件:其内容包括每个事务的开始标记、结束标记和所有更新操作;每个日志记录的内容包括:事务标识、操作类型、操作对象、更新前数据的旧值,和更新后数据的新值;) K8 M) I- O% n. y' L; O$ S
2、数据块为单位的日志文件:将更新前的整个数据块和更新后的整个数据块全部放在了日志文件中;( |/ }/ |% G' `1 D& ?. L; |, _
11.5.2 日志文件的作用5 B& x) S; L7 N5 N
1、事务故障恢复和系统故障恢复必须使用日志文件
# z4 x6 u) T/ Z4 l(1)故障恢复的两个基本操作:UNDO和REDO. |3 n u+ X6 _' x& y6 `
(A) UNDO的作用是撤销事务,具体步骤:
7 ]4 k$ ?7 [5 w2 u, ]* Q(a) 反向扫描日志文件,找到需要撤销的事务的更新操作;
) ?: P- f9 O5 q6 h0 _" y8 J( k(b) 对事务的更新操作执行逆操作;
0 m( g$ ^6 m9 {, h(c) 继续反向查找该事务的其他更新操作,并执行相应的逆操作;. T9 K G8 C/ g. ^# S2 w, D0 H% h
(d) 重复执行步骤(C),直至遇到该事务开始记录。5 m/ M f6 P% ^6 N5 R
(B) REDO的作用是重做事务,具体步骤:. w- F2 |9 J3 K! |& {- y8 T
(a) 正向扫描日志文件,找到需要重做的事务的更新操作;
1 M% ^; u9 C" k6 I(b) 对事务重新执行日志文件登记的操作,即将日志文件中“更新后的值”写入数据库;
3 P0 ?" `' U7 h5 i: E- f% n(c) 继续正向查找该事务的其他更新操作,并重新执行,将日志文件中“更新后的值”写入数据库;" s. ^3 B6 D2 d. q5 Z
(d) 重复执行步骤(C),直至遇到该事务的提交记录。1 s# u! E8 n5 d& P. C) x3 B
(1) 事务故障恢复:只需把相应的事务作撤销UNDO即可;: h0 w5 O. J% S9 {2 |' q
(2) 系统故障恢复:9 E7 E5 n$ d) e& k& _5 |
(A) 正向扫描日志文件,找到系统故障前发生的所有事务,如果该事务没有完成,将其事务标记加入撤销队列,如果该事务已经完成,则将其事务标记加入重做队列;7 Q: z) \5 N h* L
(B) 对撤销队列中的所有事务作撤销操作UNDO;
3 v% g& U) L3 o# X) m(C) 对重做队列中的所有事务作重做操作REDO。
) ]& P0 C5 ]( t& m; a/ t1 U2、在动态转储方式中必须建立日志文件1 C: l: o3 s4 `1 S2 a* p' ]# ~( G
1、 在静态转储方式中,也可以建立日志文件9 V1 {) X* `1 p0 N
11.5.3 登记日志文件的原则& }# r* k7 ^) O' F3 U
1、 登记的次序严格按并行事务执行的时间次序;
) k+ |8 \0 e! B5 ]2 h% J8 f2、 必须先写日志文件,后写数据库/ L6 f* ]' `8 S, G$ h
11.6 具有检查点的恢复技术
8 r& r. W5 i C1 m11.6.1 检查点的作用$ e* e) c, ~6 P2 n' V* S
检查点最大限度地减少数据库完全恢复时所必须执行的日志部分;
5 i" z1 `0 g# C7 Z# q( o1 i9 [11.6.2 检查点的引入
- t* Y) [9 o+ \5 N$ j) g: i2 w4 y1、在日志文件中增加一类新的记录—检查点记录,增加一个“重新开始文件”,并让恢复子系统在登录日志文件期间动态地维护日志. ?; D, x* ]9 F2 k
2、检查点记录的内容:
; M( t. W( P3 c(1) 建立检查点时刻所有正在执行的事务清单;# W! r2 B5 F* ]
(2) 这些事务最近一个日志记录的地址。
. {3 M8 H* S) r. B0 V1 Q; R3、“重新开始文件”用来记录各个检查点在日志文件中的地址;
; ^ e7 G2 S1 Z1 z8 r2、 动态维护日志文件的方法是周期性地执行如下操作:建立检查点、保存数据库状态,具体步骤:1 Q& g: P) j+ k Y1 g4 j/ K+ D
(1) 将当前日志缓冲中的所有日志记录写入磁盘的日志文件上;4 T1 ?; g6 j* N( {' M% G) g
(2) 在日志文件中写入一个检查点记录;
' S5 e. |4 k, h) K(3) 将当前数据缓冲的所有数据记录写入磁盘的数据库中;- f K y$ v/ u/ }$ B+ o
(4) 把检查点记录在日志文件中的地址写入一个“重新开始文件”;1 l& S7 g/ s! @: j
3、 恢复子系统可以定期或不定期地建立检查点来保存数据库状态;
) Z8 y- o+ s: i( X3 O' I4、 使用检查点方法可以改善恢复效率,事务在检查点前已经提交,则不必执行REDO操作。 |