刘红岩 清华大学 管理科学与工程系 liuhy@sem.tsinghua.edu.cn 第17章 事务管理 刘红岩 清华大学 管理科学与工程系 liuhy@sem.tsinghua.edu.cn
事务管理 主要内容: 事务 并发控制 恢复 并发调度异常 基于封锁的并发控制技术 故障类型 日志 系统故障恢复技术 介质故障恢复技术 Hongyan Liu @ Tsinghua University
事务 Transaction
事务的概念 事务(transaction)是DBMS中的一个程序执行单元,通常由一组存取数据库的操作组成 A transaction is a logical unit of work A transaction is a discrete unit of work that must be completely processed or not processed at all within a computer system Hongyan Liu @ Tsinghua University
事务的性质(ACID) ACID: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) Hongyan Liu @ Tsinghua University
原子性(atomicity) 构成事务的所有操作要么全部执行,反映到数据库中,要么全部不执行,没有对数据库中的数据造成影响。 事务满足了此特性,用户就不必担心由于一个事务的部分操作的执行而对数据库所造成的不正确的状态 Hongyan Liu @ Tsinghua University
一致性(consistency) 一致性:事务所包含的操作应使数据库从一个一致状态转变为另一个一致状态。 在任一时刻,数据库中的所有对象(表、元组、分量等)的当前取值称为此数据库的一个状态。 如果在一个状态下,所有数据库对象的值都满足各自相应的约束条件,则称这个状态为数据库的一个一致状态。否则,就称为一个不一致状态。 为了使事务满足此特性,用户必须正确地定义一个事务所应包含的操作。 Hongyan Liu @ Tsinghua University
隔离性(isolation) 隔离性:在多用户环境下,同一时刻通常有多个事务的操作在交叉执行。事务的隔离性指的是事务的执行不受与其同时执行的其他事务的影响,如同事务是串行执行的。 Hongyan Liu @ Tsinghua University
持久性(durability) 一个事务如果被成功执行,其对数据库的影响是持久的,用户不必担心由于故障的发生使得一个事务的作用没有反映到数据库中。 Hongyan Liu @ Tsinghua University
例子 销售员向一个客户销售100个产品P 查看该产品的库存量S,将欲销售的产品数量100从库存量中扣除, 如果原库存量S大于欲销售量100,则将数据库中的产品销售量Q设为100, 否则,若库存量小于100,将数据库中的当前库存量还原为原来的S。 Hongyan Liu @ Tsinghua University
例子(cont.) Read(S); S=S-100; Write (S) If (S<0) rollback Else Q=100; Write(Q) Commit Read(S) 表示从数据库中将产品P的当前库存量S读出并放到内存的一个缓冲区中的变量S中 write(S)表示将缓冲区中变量S的值写回数据库对象S中 Rollback:回滚,取消该事务当前对数据库所做的所有变化,使数据库回到该事务执行前的状态 commit语句则提交该事务对数据库的所有操作,即将该事务对数据库所做的变化变为永久 Hongyan Liu @ Tsinghua University
例子(cont.) 在上述的产品销售的事务中主要涉及两个操作,一个是将库存量减少100,另一个是增加一个新的销售量100,这样可保证数据库中某个产品的总量(库存量和销量)在销售前后保持不变,等于进货总量,这体现了事务的一致性。 事务中的这两个操作要么都执行,要么都不执行,体现了事务的原子性。 如果在将库存量写回数据库之后发生了故障,销售量没有被写回数据库,则数据库就被转变到一个不一致的状态,因此需要合理的数据库恢复机制以防止这种情况的发生。 Hongyan Liu @ Tsinghua University
例子(cont.) 如果这个事务已告知用户被成功执行,则不管发现什么事情,例如软、硬件故障,该产品的销售量增加了100、库存量减少了100都应该被反映到数据库中。这就是事务的持久性特性的体现。 要保证事务的持久性也需要数据库的恢复系统能够将发生故障时尚未将操作结果体现到数据库中的操作进行适当处理,以便不会丢失数据。 Hongyan Liu @ Tsinghua University
例子(cont.) 若事务T1与T2并发执行,事务的隔离性要求每个事务的执行结果应与这些事务的某一串行执行结果相同,即与先执行T1再执行T2的结果,或者先执行T2再执行T1的结果相同。有效的并发控制可保证隔离性。 Read(S); S=S-100; Write (S) If (S<0) rollback Else Q=100; Write(Q) Commit Read(S); Read(Q) Total=S+Q; Hongyan Liu @ Tsinghua University
并发控制 并发调度异常
调度 多个事务包含的操作之间按照一定顺序执行的方式称为一种调度(schedule)。 如果每个事务的操作与其他事务的操作之间没有交错,是串行执行的,则称为串行调度(serial schedule)。 事务并发执行时,不同事务的操作是交错执行的,称为并发调度(concurrent schedule) Hongyan Liu @ Tsinghua University
并发调度 两个事务的交错调度 T1 T2 Read(A) Write(A) Read(C) Write(C) Read(B) Write(B) Hongyan Liu @ Tsinghua University
串行调度与并发调度 串行调度:将数据库从一个一致状态转换到另一个一致状态。 并发调度: 有利于提高系统吞吐量(system throughput) 一类涉及I/O操作,例如从磁盘读取数据到内存; 另一类是CPU的操作。这两类操作可以并行执行 在一个事务进行I/O操作时,如果允许CPU 处理其他事务的操作,则可以有效降低CPU处于空闲状态的时间 有利于短事务的快速执行 短事务等待长事务的执行 Hongyan Liu @ Tsinghua University
可串行化调度 如果事务的某一并行调度对数据库作用的结果与某一串行调度相同,则认为此调度是正确的,称为可串行化调度(serializable schedule) 对于同一组事务S,对其不同的可串行化调度可能产生不同的结果,DBMS无法保证产生哪一种结果,但每一种都认为是正确的。 Hongyan Liu @ Tsinghua University
并发调度异常 丢失更新异常(lost update anomaly) 读脏数据异常(dirty read anomaly) 不能重复读异常(unrepeatable read anomaly) 出现幻像异常(phantom row anomaly) Hongyan Liu @ Tsinghua University
丢失更新异常 又称重写未提交数据(overwriting uncommitted data),属于写写冲突 例如: A:某产品库存量 Read(A) A=A-100 Write(A) Commit A=A-200 Hongyan Liu @ Tsinghua University
读脏数据异常 T1 T2 Read(A) A=A-100 Write(A) Read(B) B=B+100 Write(B) Commit 又称读未提交的数据(reading uncommitted data)。该异常属于写读异常 T1完成的是销售某产品100个 A:库存量 减少100, B:销量增加100, T2:统计库该产品库存量和销量之和。 Hongyan Liu @ Tsinghua University
不能重复读异常 由读写冲突导致 T1 T2 Read(A) Commit A=A+500 Write(A) Hongyan Liu @ Tsinghua University
提交事务与取消事务 提交事务(committed transactions):事务最终被提交了 取消事务(aborted transaction):事务最终没有提交,而是被取消了(rollback), 取消事务需要将数据库恢复到该事务执行前的状态。 一组事务的一个调度如果涉及取消事务,也会产生上述异常,同时还会导致事务的不可恢复性。 Hongyan Liu @ Tsinghua University
读脏数据、不可恢复调度 T1 T2 Read(A) A=A+100 Write(A) Rollback Read(B) B=B+A Write(B) Commit 事务T2读取的A数据是脏数据 事务T2在T1回滚之前已经被提交,因此由于事务T1 被取消,事务T1 对事务T2 造成的影响无法取消,这种情况称为不可恢复的调度(unrecoverable schedule) Hongyan Liu @ Tsinghua University
级联撤销 T1 T2 Read(A) A=A+100 Write(A) Rollback Read(B) B=B+A Write(B) Commit 当T1被撤销的时候,如果T2没有被提交,那么可以强制撤销事务T2,以恢复B的值,这种技术叫做级联撤销(Cascading Abort) Hongyan Liu @ Tsinghua University
并发控制 基于封锁的并发控制技术
封锁(lock) 封锁:对一个数据库对象进行操作的许可 基本的封锁类型: 一个事务在对某对象进行操作之前必须按照某种封锁协议先获得该对象的某种封锁 基本的封锁类型: 共享锁(share lock,,简称S锁) 共享锁通常是对要读的数对象加的锁,又称读锁。 排它锁( exclusive lock,简称X锁) 排它锁通常是对要写的对象施加的锁,又称写锁。 Hongyan Liu @ Tsinghua University
共享锁和排它锁的相容矩阵 行标题:锁的请求 列标题:已有的锁 True:可以获得请求的锁 False:不能获得请求的锁 S锁 X锁 True Hongyan Liu @ Tsinghua University
严格的两段锁协议 严格的两段锁协议(strict two-phase locking, 简称strict 2PL) Hongyan Liu @ Tsinghua University
例子1 消除不能重复读异常 T1 T2 Slock(A) Read(A) … Commit Unlock(A) 请求Xlock(A) A=A+500 Write(A) 消除不能重复读异常 T1 T2 Read(A) A=A-100 Write(A) Commit A=A-200 Hongyan Liu @ Tsinghua University
例子2 遵守strict 2PL协议的交错调度 strict 2PL协议可解决所有异常,但降低并发度,影响系统性能 T1 T2 Slock(A) Read(A) Xlock(C) Read(C) Write(C) Commit Xlock(B) Read(B) Write(B) 遵守strict 2PL协议的交错调度 strict 2PL协议可解决所有异常,但降低并发度,影响系统性能 Hongyan Liu @ Tsinghua University
两段锁协议 两段锁协议 (two-phase locking, 简称2PL): 规则1(锁的增长阶段):如果一个事务T需要读取一个数据库对象,那么它必须首先获得对该对象的共享锁;如果T需要修改一个数据库对象,那么它必须首先获得对该对象的排他锁; 规则2(锁的缩减阶段):一个事务T释放了一个封锁之后就不能再获得新的封锁。 允许事务对拥有的锁提前释放 Hongyan Liu @ Tsinghua University
两段锁协议与严格的两段锁协议 遵守两段锁协议也可以使调度可串行化,但可能引发级联回滚 若在事务T2执行完Write(A) 之后事务T1 发生故障需要回滚,则将引发事务T2的级联回滚。 T1 T2 Xlock(A) Read(A) Slock(B) Read(B) Write(A) Unlock(A) Hongyan Liu @ Tsinghua University
封锁粒度(granularity) 数据库(database)锁、表(table)级锁、页面(block, page)锁、行级锁及列级锁 封锁粒度越小,并发度越高,管理封锁的代价也越高。 Hongyan Liu @ Tsinghua University
隔离级别(isolation level) SQL92规定的一致性级别包括如下4种: serializable: 可保证调度的可串行化,通常被设为默认隔离级别。 repeatable read: 对数据库中已有的数据库对象允许重复读,即只允许读取已提交的数据对象(元组),在一个事务对同一个元组的两次读取之间其他事务不能对其进行修改。 此隔离级别可避免不能重复读异常,但不能保证调度的可串行化,因为它可能导致幻像(phantom)问题。 Hongyan Liu @ Tsinghua University
隔离级别(isolation level) read committed:只能读取已提交数据,可避免读脏数据异常,但不能避免不可重复读异常。 read uncommitted:允许读取未提交数据,可避免丢失更新异常,但不能避免读脏数据异常 Hongyan Liu @ Tsinghua University
隔离级别(isolation level 丢失更新 读脏 数据 不可 重复读 幻像 serializable Y Repeatable read N read committed Read uncommitted 对于一些不要求精确结果的长事务来说,为了避免占用太多资源,提高并发度,可以采用低级别,如read uncommitted Hongyan Liu @ Tsinghua University
幻像(phantom)问题 T1:查询足球类产品的总销量A和健美类产品的总销量B; T2:首先插入一行一个有关健美类产品的销售记录t1,然后插入一行一个有关足球类产品的销售记录t2。 T1 T2 Slock(A) Read(A) Slock(B) Read(B) Commit Insert(t1) Insert(t2) Hongyan Liu @ Tsinghua University
幻像(phantom)问题 行级锁、表级锁、… T1 T2 Slock(A) Read(A) Slock(B) Read(B) Commit Insert(t1) Insert(t2) 原值:A=100,B=200 T1:A=100 T2:插入健美类产品的销售记录t1,销量20 T1:B=220 T2:插入足球类产品的销售记录t2,销售10 串行: T1、T2 T2、T1 行级锁、表级锁、… Hongyan Liu @ Tsinghua University
set transaction isolation level 1 设置隔离级别 Microsoft SQL Server: set transaction isolation level read committed Sybase将这4个级别编为3、2、1、0。设置read committed的语句为: set transaction isolation level 1 UDB DB2:将4个基本重新命名 Repeatable Read(RR)、Read Stability(RS)、Cursor Stability(CS)、Uncommitted Read(UR) change isolation to CS Hongyan Liu @ Tsinghua University
恢复 简介
数据库恢复管理器 负责保证事务的如下两个特性: 故障:数据库处于不一致或不可用状态 可恢复性(recovery) 原子性 (atomicity) 持久性 (durability) 故障:数据库处于不一致或不可用状态 可恢复性(recovery) 从这些状态恢复到一个可用的一致的状态 Hongyan Liu @ Tsinghua University
计算机的存储介质 易失存储器(volatile storage):内存 非易失存储器(nonvolatile storage) 访问速度快 容量有限 非易失存储器(nonvolatile storage) 磁盘:外存,联机存放大量数据 磁带:脱机存放归档数据 容量大、速度慢 Hongyan Liu @ Tsinghua University
数据访问方式 数据在磁盘上以数据块(block)为单位存储 数据块是内、外存数据交换的基本单位。 数据块的大小可以等于一个或几个磁盘块 磁盘块是磁盘寻址的最小单位(扇区)。 为了便于区别,位于磁盘上的数据块又称物理块 Hongyan Liu @ Tsinghua University
缓冲区 内存中开辟一块空间用于存放从磁盘读取的物理块,其大小至少应等于一个物理块的大小,称缓冲块 所有的缓冲块组成了磁盘缓冲区,或称缓冲池(buffer pool) Hongyan Liu @ Tsinghua University
I/O操作 I/O操作:数据在内、外存的一次数据交换称为一次I/O input(A):数据从物理块A读到缓冲块,称为输入操作; output(B):数据从缓冲块B写回到恰当的物理块,称为输出操作。 Hongyan Liu @ Tsinghua University
读操作 专用工作区:每个事务在开始执行时在内存都有一个专用工作区,用于存放它访问和修改的数据项值。当事务结束时该工作区被释放。 read(X): 一个事务要修改数据项X的值,首先需要将其读到工作区中相应的变量x中存储,这种操作称为读操作,涉及两个可能的操作: 检查缓冲区中是否存在包含数据项X的物理块BX,若无,发出input(Bx)输入命令,将物理块读到缓冲块中; 将BX对应的缓冲块中的X数据项送到工作区的变量x 中 Hongyan Liu @ Tsinghua University
写操作 write(X):完成将工作区中变量x的值送到相应缓冲块中的X数据项: 检查缓冲区中是否存在包含数据项X的物理块BX,若无,发出input(Bx)命令,将物理块读到缓冲块中; 将工作区的变量x的值送到相应缓冲块中的X数据项中 Hongyan Liu @ Tsinghua University
写操作的问题 在write(X)操作:没有发出output(BX)命令 问题: 缓冲区满时回写,提高系统性能 如果一个事务在write(X)之后提交,在output(BX)之前系统发生故障,则数据项X的新值并没有被反映到物理块中,导致数据库处于一个不一致的状态 如果一个事务在write(X)之后,由于缓冲区满发出了output(BX)命令将数据项X的新值反映到了物理块中,但事务尚未结束之前系统发生故障,导致数据库处于一个不一致的状态 Hongyan Liu @ Tsinghua University
强制写和不偷帧的策略 强制写(Force write ):一个事务在提交之前强制所更新的缓冲块写回物理块 poor response time but provides durability 偷帧(Steal buffer-pool frames )允许一个未提交的事务Ti将其更新的缓冲块写回物理块,腾出的缓冲块被另一个事务Tj使用 No Steal Steal Force Trivial No Force Desired if not, big buffer pool, impossible if so, how can we ensure atomicity? Hongyan Liu @ Tsinghua University
恢复 故障类型 Type of crashes
故障类型 系统故障(system crash) 介质故障(media failure) Hongyan Liu @ Tsinghua University
系统故障 系统故障又称软故障(soft crash),是指由于软、硬件原因导致当前运行的一个或多个事务无法正常进行,但并未导致物理介质上的数据遭到破坏的情况。 常见的系统故障原因包括断电,程序逻辑错误,如溢出等 Hongyan Liu @ Tsinghua University
介质故障 又称硬故障(hard crash),指的是由于磁盘等数据库外部存储介质损坏而导致数据库的一部分或全部数据无法访问, 这将影响当前正在访问这些数据的事务的正常执行,从而使数据库处于不一致状态。 常用的恢复方法是基于日志的恢复技术 Hongyan Liu @ Tsinghua University
恢复 日志 Log
日志文件 日志(log, trail, journal)是有关DBMS所执行的操作的一个历史记录。 日志文件是一个记录该历史的物理文件 日志记录:日志序列号(log sequence number,简称LSN) 记录多种操作信息:事务开始(start)、更新操作(update)、事务提交(commit)、事务取消(abort) 以及事务终止(end)等 Hongyan Liu @ Tsinghua University
日志记录 更新日志记录(update log record):记录数据更新操作,记录 事务标识符 要更新的数据项的标识符(数据项在磁盘上的位置) 更新前的旧值 更新后的新值等信息 更新前的值称前像(before-image),更新后的值则称为后像(after-image) Hongyan Liu @ Tsinghua University
日志 每次事务执行写操作之前,必须在数据库修改前生成该写操作的日志记录。 若一个日志记录创建后立即写入稳定存储器(信息永不丢失) 开销:频繁写日志记录(数据块) 实际采用方法:内存开辟日志缓冲区 多个日志记录集中在 日志缓冲区中 为了防止发生故障时内存中的日志记录丢失: 先写日志原则 Hongyan Liu @ Tsinghua University
先写日志原则 先写日志原则 (Write-Ahead Log Protocol, 简称WAL 原则) 一次更新操作的日志记录必须在相关数据块写回磁盘之前已经输出到外存。 Before writing a page to disk, every update log record that describes a change to this page must be forced to stable storage 否则,一个事务更改了数据库,数据写回了磁盘,但相应的记录没有保存到日志文件中,这时发生故障,无法撤销这些更改 Hongyan Liu @ Tsinghua University
先写日志原则(cont.) 先写日志原则 在一个事务提交之前,有关Ti的所有日志记录必须已经输出到外存。 否则,一个事务更改了数据库(但未保存到外存),提交了,但有关这个事务的记录没有保存到日志文件中,这时发生故障,这个事务对数据库的更改无法恢复。(无法重做这些更改) Hongyan Liu @ Tsinghua University
日志管理 IBM UDB DB2提供两种日志管理方式: 循环日志(circular logging) 循环使用固定数目的日志文件来记录日志 被覆盖的日志文件中的日志记录所记录的事务必须都已经结束且被更新数据块已被写回了磁盘 归档日志(archival logging) 又称线性日志(linear logging) 与循环日志的不同在于,归档日志将循环日志覆盖的日志文件归档保存而不进行覆盖。 Hongyan Liu @ Tsinghua University
循环日志 循环日志: 假设通过数据库系统配置参数 (参数 logprimary)设置共有n个主日志文件(primary log file)可供使用,文件编号为1、2、…、n。 每个文件大小也可由用户指定(参数logfilsz) 1 2 3 4 5 8 7 6 Hongyan Liu @ Tsinghua University
归档日志 DB2: 将参数LOGRETAIN设为recovery或将参数USEREXIT设为yes。 由用户指定主日志文件个数(logprimary)和次日志文件个数(logsecond)以及文件大小(logfilsz) 当主日志文件写满时,根据需要创建次日志文件 一旦次日志文件达到了最大,如果仍需要日志空间,系统就会发出错误,所有数据库活动停止 手动或利用USEREXIT参数设置用户出口程序 Hongyan Liu @ Tsinghua University
归档日志 1 非活动的日志文件:日志中的事务均已提交且更新数据已反映到磁盘中的数据库中 2 3 4 5 6 7 8 联机日志文件 活动日志文件 非活动的日志文件:日志中的事务均已提交且更新数据已反映到磁盘中的数据库中 活动日志文件(active log file): 包含尚未提交的事务或更新数据尚未写回磁盘的事务。 联机日志文件:位于活动日志目录的非活动的日志文件 Hongyan Liu @ Tsinghua University
系统故障的恢复 Recovery from system crashes
两种情况 导致数据库处于不一致状态的情况有两种 故障发生时尚未结束的事务,它们的某些更新操作可能已经反映到了数据库中。 故障发生前刚刚结束的事务,它们对数据库的更新可能还没来得及从缓冲区写回磁盘。 这两种情况分别需要进行UNDO和REDO操作。 Hongyan Liu @ Tsinghua University
UNDO UNDO:撤销事务外化(externalized)了的数据库更新操作,使得从数据库的状态来看,这些更新操作好像从来没有被执行过 外化了的数据库更新操作: 更新结果涉及的物理块已从缓冲区写回了磁盘的插入、删除和修改操作 依据:事务的原子性 哪种情况? Hongyan Liu @ Tsinghua University
REDO REDO:重复某些数据库更新操作 依据:事务的持久性 哪些事务UNDO? 哪些REDO? 使得对数据库的更新反映到了磁盘上 无法判断一个结束了的事务的更新操作是否已经外化 无法判断一个尚未结束的事务的更新操作是否已经外化 结果:很多无需UNDO 或REDO的事务在恢复时要进行UNDO和REDO Hongyan Liu @ Tsinghua University
检查点 检查点(check point)机制: 检查点命令按一定周期执行 当前位于数据库缓冲区中的缓冲块强制写回到磁盘上的物理数据库中; 将检查点日志记录写到日志文件中,该日志记录描述当前(执行检查点的时刻)正在执行的事务列表。 检查点命令按一定周期执行 在一个检查点执行之前提交的事务,可以确定其对数据库的更新操作已经外化,因此不必进行REDO操作,从而减少需要进行REDO 的事务个数,也减少需要扫描的日志文件的长度。 Hongyan Liu @ Tsinghua University
确定UNDO和REDO事务列表 … …. checkpoint 从日志文件的尾部开始向前搜索直至遇到第一个检查点记录 UNDO={checkpoint记录中记录的事务列表} REDO=空 … checkpoint …. 然后从此处开始反向搜索,向日志的尾部方向搜索,按以下情况进行处理,直至到达尾部 遇到一个事务开始记录,添加该事务到UNDO列表; 遇到一个事务的提交记录,则将该事务从UNDO事务列表移到REDO事务列表 Hongyan Liu @ Tsinghua University
例17.1 :确定UNDO和REDO事务 时间 检查点(tc) 系统故障(tf) 3、UNDO={T3, T4} REDO={T2} REDO={T2,T4} 1、UNDO={ T2,T3} 2、UNDO={ T2 , T3, T4} 4、UNDO={ T3,T4, T5} REDO={T2}
前滚恢复和后滚恢复 确定UNDO和REDO事务列表之后,进行后滚恢复和前滚恢复 后滚恢复(backward recovery) 前滚恢复 (forward recovery, rollforward) 从最近的检查点开始向后对每个需要REDO的事务利用日志中记录的更新后的新值更新数据项,使之恢复到事务成功执行后的状态。 Hongyan Liu @ Tsinghua University
RESTART DATABASE sample 实用命令 在遇到系统故障之后,对于IBM UDB DB2 数据库,只需执行如下的命令重新启动数据库即可: RESTART DATABASE sample sample为数据库的名子 数据库系统将根据日志自动进行REDO和UNDO操作直至将数据库恢复至一致状态 Hongyan Liu @ Tsinghua University
介质故障的恢复 Recovery from media crashes
介质故障解决方案 导致数据库的一部分或全部数据无法访问 至少需要一个数据库的完整备份 循环日志: 只能将数据库恢复到最近一个数据库备份所在时刻的状态。 归档日志,则在数据库备份所在状态的基础上可以根据归档日志进行前滚恢复(forward recovery,rollforward) Hongyan Liu @ Tsinghua University
备份的类型 备份数据库: 对数据库的全部或部分数据复制到一个或多个设备或目录中保存 IBM UDB DB2: 联机备份(online backup)时允许应用程序在备份的同时访问数据库 脱机备份(offline backup)意味着其他程序不能访问数据库直至备份完毕 IBM UDB DB2: 循环日志:只能进行脱机备份 归档日志,联机备份和脱机备份,单个表空间 Hongyan Liu @ Tsinghua University
备份的类型 全备份(full backup): 将整个数据库进行备份 增量备份(incremental backup) 累积式备份( cumulative backup) 针对自从上次最新的、成功的全备份( full backup)操作以来,更新过的所有数据库数据块的副本 差异式备份( delta backup) 自从上次成功备份(全备份、累积式备份或差异式备份)以来已更改过的所有数据库数据的备份 Hongyan Liu @ Tsinghua University
备份的类型 累积式备份 差异式备份 若周五备份完成之后发生介质故障:上周日+周五 上周日+周一~周五 周日 周一 周二 周三 周四 周五 周六 周日 全备份 周日 周一 周二 周三 周四 周五 周六 周日 全备份 Hongyan Liu @ Tsinghua University
备份操作 备份数据库命令: IBM UDB DB2: 备份的数据库名称、要备份的表空间名称(默认情况下指的是整个数据库)、联机备份还是脱机备份以及备份文件所在的设备或目录名。 IBM UDB DB2: 例17.2: BACKUP DATABASE sample TO d:\dbbackup; 备份文件名将包含备份时刻的时间信息,包括年月日以及时分秒 20061007153620表示备份是在2006年10月7日下午3点36分20秒进行的 BACKUP DATABASE sample TABLESPACE userspace1 ONLINE TO d:\dbbackup; Hongyan Liu @ Tsinghua University
复原操作(1) 复原数据库:利用备份还原数据库的过程 DB2:restore 将例17.2中的备份进行复原的命令如下: 指定备份数据库的名字、备份所在的位置、备份的日期和时间等 将例17.2中的备份进行复原的命令如下: RESTORE DATABASE sample FROM d:\dbbackup TAKEN AT 20061007153620 REPLACE EXISTING 子句replace existing:若sample数据库存在,则其内容将被删除,用备份数据替换。 Hongyan Liu @ Tsinghua University
复原操作(2) 前滚悬挂(rollforward pending)状态 若数据库的参数LOGRETAIN被设为recovery或参数USEREXIT被设为yes,即系统处于前滚恢复活动的状态,执行该复原命令后,系统处于前滚悬挂状态,数据库不可用 执行前滚命令 或: RESTORE DATABASE sample FROM d:\dbbackup TAKEN AT 20061007153620 REPLACE EXISTING WITHOUT ROLLING FORWARD Hongyan Liu @ Tsinghua University
前滚操作 命令rollforward: 将一个处于前滚悬挂状态的数据库或表空间恢复至一个指定的一致状态 利用日志将备份后提交的事务对数据库的更新反映到数据库中 只有在归档日志管理方式下才能执行 Hongyan Liu @ Tsinghua University
前滚:例子 例17.6:前滚数据库到日志尾部 前滚数据库到某一指定时刻 ROLLFORWARD DATABASE sample TO END OF LOGS AND STOP 前滚数据库到某一指定时刻 ROLLFORWARD DATABASE sample TO 2006-10-8-12.20.30 AND STOP 把在此时间之前提交的事务进行前滚,之后的则忽略 Hongyan Liu @ Tsinghua University