《基于日志分析的SQL Server数据库变更数据捕获方法的研究与实现.doc》由会员分享,可在线阅读,更多相关《基于日志分析的SQL Server数据库变更数据捕获方法的研究与实现.doc(35页珍藏版)》请在三一文库上搜索。
1、基于日志分析的SQL Server数据库变更数据捕获方法的研究与实现 摘 摘 要 要摘 摘 要 要传统的数据集成、数据传播和 ETL工具都是周期性把源端大量的数据转移到目标端,已无法满足新的商业需求,如数据仓库的持续更新、接近实时的商业智能以及业务数据存储。基于事务日志的变更数据捕获技术就为这些新 IT业务需求提供了一种新的解决方案。 本文在介绍事务日志原理和数据库恢复技术的基础上,提出了基于日志分析 SQL Server数据库变更数据捕获方法。该方法通过异步读取事务日志,捕获变更数据。主要解决了以下几个问题: 1 防止未捕获变更数据的事务日志被截断; 2 事务部分回滚中补偿日志的问题; 3
2、制定捕获进程重启处理的正确方案,以及如何减少重启的时间; 4 提高捕获进程的效率。关键字:事务日志,SQL Server数据库,变更数据捕获,部分回滚 I Abstract Traditionally, Data Integration, Data Propagation, and ETL extract, transform and load processes run on a periodic basis weekly, daily and use a bulk data movement approach that moves and integrates the entire sou
3、rce data to a target data source. This approach is limited in its ability to deal with new trends and business requirements, some of which include continuous refreshing of a DW, near real-time business intelligence and operational data stores. Based on transaction log Change-Data-Capture CDC technol
4、ogy provides a solution to IT operational challenges and the new business modelsThis paper introduces the principle of transaction logs and database recovery techniques,proposes a change-data-capture method based on SQL Server database log analysisBy means of the asynchronous read transaction log, t
5、his method captures data changes.This thesis addresses the following issues: Firstly, avoid that the transaction logs not captured change data are truncated; Secondly, how to process compensation logs for partial transaction rollbacks; Thirdly, develop the right algorithm for the restart of capture
6、process, and how to reduce restart time; Finally, to improve the efficiency of capture process Keywords: transaction log, SQL Server database, change data capture, partial rollbackIII目 目 录 录目 目 录 录摘 摘 摘 摘要 要 要 要.I ABSTRACTIII 目 目 录 录V 目 目 录 录第 第 第 第一 一 一 一章 章 章 章 绪 绪 绪 绪论 论 论 论1 1.1 课题背景与来源1 1.2 相关研
7、究工作 2 1.3 本文研究意义和主要工作. 2 1.4 论文安排3 第 第 第 第二 二 二 二章 章 章 章 变 变 变 变更 更 更 更数 数 数 数据 据 据 据的 的 的 的捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法. 5 2.1 捕获方法 5 第 第 第 第三 三 三 三章 章 章 章 SQL SERVER 事 事 事 事务 务 务 务日 日 日 日志 志 志 志原 原 原 原理 理 理 理11 3.1 日志文件 11 3.2 日志11 3.3 检查点. 14 3.4 事务日志 15 3.5 ARIES 算法. 20 第 第 第 第四 四 四 四章 章 章 章 事 事
8、 事 事务 务 务 务日 日 日 日志 志 志 志读 读 读 读取 取 取 取方 方 方 方法 法 法 法与 与 与 与解 解 解 解析 析 析 析的 的 的 的研 研 研 研究 究 究 究 23 4.1 读取日志增量的可靠性 23 4.2 原始日志记录解析30 4.3 提高日志的解析效率. 32 第 第 第 第五 五 五 五章 章 章 章 变 变 变 变更 更 更 更数 数 数 数据 据 据 据捕 捕 捕 捕获 获 获 获器 器 器 器的 的 的 的实 实 实 实现 现 现 现与 与 与 与应 应 应 应用 用 用 用. 37 5.1 系统实现平台和开发工具37 5.2 系统的功能描述 37
9、 5.3 系统功能模块划分38 5.4 系统模块实现. 39 第 第 第 第六 六 六 六章 章 章 章 总 总 总 总结 结 结 结与 与 与 与展 展 展 展望 望 望 望 49 参 参 参 参考 考 考 考文 文 文 文献 献 献 献 51 攻 攻读 读硕 硕士 士学 学位 位期 期间 间发 发表 表的 的学 学术 术论 论文 文. 53 攻 攻读 读硕 硕士 士学 学位 位期 期间 间发 发表 表的 的学 学术 术论 论文 文致 致 致 致谢 谢 谢 谢55V第 第 第 第一 一 一 一章 章 章 章 绪 绪 绪 绪论 论 论 论 1.1 课 课 课 课题 题 题 题背 背 背 背景
10、景 景 景与 与 与 与来 来 来 来源 源 源 源在当前的信息化网络时代,随着科学技术的迅猛发展,信息量正呈爆炸方式迅速增长。现在我们能获得大量的信息,但是却不能有效地管理和利用这些信息。特别是大型的全球性企业,信息是它们的 IT基础设施的核心。企业实现信息共享,可以更充分地使用信息,减少资料收集和信息采集等的重复劳动和相应费用。但是,在企业实施信息共享的过程中,由于数据可能来自不同的途径,其数据内容、数据格式和数据质量相差很大,使得数据在各部门不易共享。因此,需要信息集成技术来解决信息共享的问题。信息集成技术是把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中,从而为企业提供全面的
11、数据共享。 1数据仓库是信息集成最常见的应用,其构造方法至少有三种 : 1 数据仓库根据数据源中的当前数据进行周期性地重建。这个方法最常用,数据重建每夜或间隔更长时间进行一次。它的主要缺点是重建过程中需要关闭数据仓库,而且重建数据仓库的时间很长,甚至长于间隔的时间。另一个缺点是数据仓库中的数据可能会非常过时。 2 根据自上次数据仓库被更新以后对数据源所做的更新,对数据仓库中的数据进行周期性地更新。这种方法可能只与少量数据有关。当数据仓库需要在很短的时间内进行更新,而数据仓库很大时,这种方法的优势就很明显。它的缺点是计算数据仓库中的变化,与简单重新构造数据仓库的算法相比,前者较复杂。 3 一个或
12、多个数据源中的每一次变化或一组变化立即反映在数据仓库中。这种方法延时最小,缺点是需要太多的通信和处理。 在处理某些新的商业需求时,例如持续更新数据仓库、及时更新数据仓库,第一种方法就行不通了,第二种方法不能及时更新数据仓库。基于日志分析变更数据捕获技术就是第三种方法中所用的关键技术,它能提供及时更新数据仓库的变更数据。 本课题组研究信息集成的方法,并对其进行改进,使之适应跨组织的大规模数据集成环境,以提高信息收集的效率和实时性。 本文是潘久辉教授主持的“电信企业经营信息集成支撑平台研究与开发”(编号:2007B090400095)课题的一部分,此课题是由暨南大学计算机系高性能数据库课题组共1
13、第一章 绪论 同承担。 1.2 相 相 相 相关 关 关 关研 研 研 研究 究 究 究工 工 工 工作 作 作 作 通常,数据集成系统是从不同的商业数据库中抽取数据进行分析。变更数据捕获方法是一种重要的抽取数据的方法。变更数据捕获方法因为其实现方式不同,其适用情况和效率也大不相同。 变更数据捕获方法的常用实现方式有:触发器、快照差分和事务日志。IBM InfoSphere、 SQL Server 2008 和 Oracle数据库都有变更数据捕获器(Change Data Caputure,CDC)。IBM InfoSphere CDC 使用基于事务日志的技术,IBM InfoSphere D
14、ataStage就使用2 3了快照差分的技术 。Oracle CDC 分两种:同步 CDC 和异步 CDC。Oracle同步 CDC使用基于触发器的技术,异步 CDC 使用基于事务日志技术。SQL Server 2008 CDC 是通过4异步读取事务日志的途径,捕获变更数据 。 由于基于事务日志的捕获方法比其他方法更具优势,基于事务日志的捕获方法成为捕获变更数据的主要趋势。但是,数据库的事务日志极其复杂,实现基于事务日志的捕获方法的难度比较高。 1.3 本 本文 文研 研究 究意 意义 义和 和主 主要 要工 工作 作 本 本文 文研 研究 究意 意义 义和 和主 主要 要工 工作 作目前,在
15、许多行业进行信息集成平台建设中,需要从不同的数据源抽取数据,增量抽取是高效实现机制,捕获变更数据是其关键技术。在数据源应用系统中通常采用 DB2,Oracle,Informix,Sybase和 SQL Server数据库或者它们之间的组合。信息集成系统从数据源中抽取增量数据,即捕获数据库中的变更数据,并传送到集成端。虽然捕获数据库中数据变化有多种方式,但是考虑到很高的运行效率和尽量减少对数据库的正常事务处理的干扰等原因,选择了分析日志内容从而捕获数据变化的方式。并且分析日志还能获取额外的信息,而这些信息是不能采用其他方式得到的。 由于商业数据库之间的事务日志格式差异很大,所以要针对不同数据库开
16、发相应的变更数据捕获工具。本课题相关工作已对 Oracle、IBM DB2 数据库事务日志进行了研究;但对 SQL Server数据库事务日志的研究还不够完善。本文要做的工作就是分析 SQL Server 2000 事务日志来捕获数据库的变更数据。这对丰富数据集成技术和提高数据集成效率从而实现提高信息反应的主动性和及时性,实现跨组织的信息集成具有重要意义。 2 暨南大学硕士学位论文 5,6,7本文是在有关工作 的基础上进行的更深入的研究和更广泛的探讨,主要的进展有:1研究数据库的复制的功能,防止在捕获变更数据之前事务日志被截断;2研究数据库的 ARIES 恢复算法,制定正确的捕获变更数据的算法
17、;3 制定捕获进程重启处理的正确方案,以及如何减少重启的时间;4研究如何提高捕获变更数据的效率。 1.4 论 论 论 论文 文 文 文安 安 安 安排 排 排 排 论文分六章进行论述,其中第三章、第四章和第五章是本文的重点。 第一章简要介绍了本文的课题背景和来源、相关的研究现状以及本文的目的、意义和结构安排。 第二章描述并详细比较了四种变更数据的捕获方法。 第三章详细介绍 SQL Server数据库的事务日志原理。 第四章描述了基于 SQL Server 2000 事务日志的变更数据捕获方法的研究。 第五章主要介绍了变更数据捕获器的部分实现。 第六章是对本文的总结和展望。3 第 第二 二章 章
18、 变 变更 更数 数据 据的 的捕 捕获 获方 方法 法第 第二 二章 章 变 变更 更数 数据 据的 的捕 捕获 获方 方法 法2.1 捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法 变更数据捕获的常用方法有: 1.基于快照差分的捕获方法; 2. 基于触发器的捕获方法;3. 基于事务日志的捕获方法;4.数据库管理系统提供的变更数据捕获方法。基于快照差分4的捕获算法是先生成两个数据源的快照,然后比较它们并计算出变更数据 ;基于触发器4的捕获方法是使用信息源数据库的触发器机制捕获变量数据 ;基于事务日志的捕获方法4是利用数据库的日志机制,分析数据库的事务日志,计算出变更数据 ;有的数据
19、库管理系统自身提供变更数据捕获功能,如 Oracle Change Data Capture和 MS SQL Server 2008 Change Data Capture。 基于快照差分的捕获方法对信息源依赖弱或没有依赖,但是捕获变更数据的效率较低,延迟时间较长;基于触发器的捕获方法依赖于信息源数据库的触发器机制,它捕获变更数据实时性较高,但对信息源数据库的事务处理影响较大;基于事务日志的捕获方法依赖信息源数据库的事务日志机制和事务日志的读取接口,捕获变更数据的效率相对较高,并且对信息源数据库的事务处理影响较小。 2222.1111.1111 基 基 基 基于 于 于 于快 快 快 快照 照
20、 照 照差 差 差 差分 分 分 分的 的 的 的捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法 1,8基于快照差分的捕获方法 虽然磁盘、内存和计算的开销较大,导致检测效率相对较低,但是它对数据库依赖弱或没有依赖,能适用于任意类型的数据源,从而能实现真正意义上的对异构数据源的集成。它适用于数据量不大的信息源,特别是更新操作频繁的信息源。图 2-1 基于快照差分的捕获方法的说明 5 第二章 变更数据的捕获方法 基于快照差分的捕获方法可以分解为由快照生成与快照差分计算两步工作,如图 2-1所示。 步骤 1:查询数据源生成最新的快照。这步工作生成的新快照在快照差分计算完成后,就变为旧快照。
21、 步骤 2:应用快照差分算法将新快照与旧快照作比较,其比较的结果就是变更数据。它在计算快照差分的过程中调用快照差分算法库中的某种算法来完成这一过程,其输入为快照,输出为变更数据。 2222.1111.2222 基 基 基 基于 于 于 于触 触 触 触发 发 发 发器 器 器 器的 的 的 的捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法 9触发器 提供的功能,是信息源实施业务规则和数据完整性的内置机制的辅助方法。它可以通过企业管理器或者查询分析器来创建。触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSE
22、RT 或 DELETE。首先要为插入、删除和修改操作创建相应的触发器,当触发 INSERT 触发器时,新的数据行就会被插入到触发器表和 inserted 表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。当触发 DELETE 触发器后,从受影响的表中删除的行将被放置到一个特殊的 deleted 表中。deleted 表是一个逻辑表,它保留已被删除数据行的一个副本。UPDATE 操作可看成两步操作:即捕获数据前像before image的 DELETE语句,和捕获数据后像after image的 INSERT语句。当在定义有触发器的表上执行 UPDATE语句时,原始行(前
23、映像)被移入到 deleted 表,更新行(后映像)被移入到 inserted 表。通过访问 inserted、deleted 逻辑表即可得到变化数据。 基于触发器的捕获方法依赖于信息源是否提供该功能。但并不是现实中的所有信息源都提供触发器的功能。同时,使用触发器会影响信息源的事务处理的速度。 22.11.33 基 基于 于事 事务 务日 日志 志的 的捕 捕获 获方 方法 法22.11.33 基 基于 于事 事务 务日 日志 志的 的捕 捕获 获方 方法 法10,11相对基于快照差分的捕获方法,基于事务日志的捕获方法 在理论上可以期望有更高的效率。因为在实际的数据存储环境中,基表的数据量通常
24、很大,如果生成它们的快照然后计算差分,这一过程要消耗同等数量级磁盘 I/O开销和计算量。但是在某个捕获变更数据的周期内,基表的变化只占基表的很少一部分,反映基表变化的的日志也很少。如果能分析反映基表变化的日志,则可以直接获得所需要的变更数据。并且,基于事务日志的6 暨南大学硕士学位论文 捕获方法可以跟踪数据库的联机事务日志,几乎接近实时地捕获变更数据。 从总体而言,基于事务日志的捕获方法,如图 2-2所示:图 2-2 基于事务日志捕获方法的说明 12变更数据捕获器周期性地分析数据源事务日志 ,分析结果即是要捕获的变更数据。 基于数据库日志的变更数据捕获方法主要用于具有事务日志的关系数据库中,常
25、用的关系数据库有 Oracle、DB2 和 SQL Server。基于事务日志的数据源的变更数据捕获主要包括两部分的内容,日志的读取和日志的分析,其中读出可靠的完全的日志是非常重要的,因为它的事务日志会可能在分析前就被截断了。Oracle、DB2 和 SQL Server 均为比较成熟的关系型数据库系统,且具有完备的日志结构,在数据库的适当配置下,数据库的中的Delete/Insert/Update操作都将在其日志文件中有足够的信息去记录。Oracle 8i 以上的版本都提供了一个日志读取的工具 LogMiner,所以对于 Oracle 的日志读取可以把它作为一个日志读取接口,它可以把 Ora
26、cle 的日志文件转化为可读取的字符串格式,之后可参考其12,13,14相应的日志格式对其进行分析 。DB2 数据库也提供了相关的日志读取接口,它提供了一些基于 CC+COBOL的库函数用于读取其事务日志,对于它的日志分析,相对来讲较为容易,它提供了更为详细的数据信息。 15关于 SQL Server数据库的事务日志,微软公司并没有公开其详细的日志读取接口 。因此,即使读取 SQL Server 数据库的事务日志,也是比较困难的。后来,有学者发现存16,17在无文档的命令 dbcc log可以查看数据库的联机事务日志。但是,他们无法精确控制截断联机事务日志,导致获取事务日志过程中可能会丢失事务
27、日志。另一个问题是,必须研究源数据库的事务日志原理及其使用的恢复技术,才能从事务日志中可靠高效地获得变更数据。基于以上原因,对于 SQL Server 的日志读取和分析的进一步探索和研究,是非常重要的。 22.11.44 DDBBMMSS提 提供 供的 的变 变更 更数 数据 据捕 捕获 获方 方法 法22.11.44 DDBBMMSS提 提供 供的 的变 变更 更数 数据 据捕 捕获 获方 方法 法SQL Server 2008 开始提供捕获变更数据的功能,但是之前的 SQL Server版本没有该7第二章 变更数据的捕获方法 功能。变更数据捕获Change Data Capture的更改数
28、据源为 SQL Server 数据库的事务日志。在将插入、更新和删除应用于跟踪的源表时,SQL Server数据库将会在日志中添加说明这些更改的项。事务日志是变更数据捕获进程的输入。它会读取日志,把捕获源表的变更数据存入被跟踪的更改表中,并在更改表中添加有关更改的信息。它还提供一些函数,以便查询在更改表中指定范围内发生的变更数据,并以筛选的结果集的形式返回该值。通常,应用程序进程使用筛选的结果集在某种外部环境中更新源表示形式。 4图 2-3 说明了变更数据捕获的主体数据流。图 2-3 SQL Server 2008 CDC 变更数据捕获数据流 具体来说,SQL Server 2008 的变更数
29、据捕获器Change Data Capture, CDC通过对事务日志的异步读取,记录 DML操作的发生时间、类型和实际影响的数据变化,然后将这些数据记录到启用 CDC 时自动创建的表中。通过 CDC 相关的存储过程,可以获取详细的数据变化情况。由于事务日志是异步读取的,因此数据源的整体性能影响不大,远小于通过触发器实现的数据变化记录。 8 暨南大学硕士学位论文 2222.1111.5555 捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法的 的 的 的比 比 比 比较 较 较 较相 相 相 相对 对 对 对快 快 快 快照 照 照 照差 差 差 差分 分 分 分的 的 的 的变 变
30、变 变更 更 更 更数 数 数 数据 据 据 据捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法, , , ,事 事 事 事务 务 务 务日 日 日 日志 志 志 志的 的 的 的方 方 方 方法 法 法 法的 的 的 的优 优 优 优点 点 点 点在 在 在 在于 于 于 于: 1.有很高的效率和很短的延迟。因为在实际的数据存储环境中,基表的数据量通常很大,如果生成它们的快照然后计算差分,这一过程要消耗同等数量级的 I/O开销和计算量。但是,在某个捕获变更数据的周期内,反映基表变化的事务日志只有很少的一部分数据,如果能对事务日志进行有效的分析,则可以直接获得所需要的变更数据。由于数据
31、库通常使用支持先写日志的恢复技术,捕获进程即时读取反映数据变化的事务日志并分析之,从而在很短的延迟内获得变更数据。 2.事务日志法对信息源数据库事务处理几乎没有影响。 事 事 事 事务 务 务 务日 日 日 日志 志 志 志捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法的 的 的 的劣 劣 劣 劣势 势 势 势在 在 在 在于 于 于 于: 事务日志方法完全依赖数据库的事务日志原理和事务日志读取接口,对于某些不提供日志或日志读取接口的数据库信息源则无能为力,更不能支持如平板文件这样的信息源类型。其次,必须研究源数据库的事务日志及恢复机制,才能分析出变更数据。通常的商用数据库的事务日志
32、和恢复机制都比较复杂,因此日志分析的难度比较大。 与 与 与 与事 事 事 事务 务 务 务日 日 日 日志 志 志 志或 或 或 或触 触 触 触发 发 发 发器 器 器 器方 方 方 方式 式 式 式相 相 相 相比 比 比 比, , , ,快 快 快 快照 照 照 照方 方 方 方式 式 式 式的 的 的 的优 优 优 优势 势 势 势表 表 表 表现 现 现 现在 在 在 在: 1.实现方式统一:对于关系数据库数据来说,快照方式是通过标准的 SQL 实现的,为一种 DBMS 开发的结果可以用于其他多种 DBMS; 2.适用范围较广:对数据库依赖弱或没有依赖,能适用于任意类型的数据源,能
33、适用于结构化的关系型数据,也能适用于半结构化数据(XML 数据)及非结构化文本数据,能较好地支持一些不具备日志或日志读取机制的商用数据库管理系统,也能支持目前应用广泛的 XML型数据以及平板文件数据,能实现真正意义上的对异构数据地集成; 3.不必对用户的数据库进行修改,快照数据可以独立与数据源数据存放。 与 与 与 与日 日 日 日志 志 志 志分 分 分 分析 析 析 析或 或 或 或触 触 触 触发 发 发 发器 器 器 器方 方 方 方式 式 式 式相 相 相 相比 比 比 比, , , ,快 快 快 快照 照 照 照差 差 差 差分 分 分 分方 方 方 方式 式 式 式的 的 的 的
34、缺 缺 缺 缺点 点 点 点表 表 表 表现 现 现 现在 在 在 在: 1.存储开销较大,因为需要保存上次的快照; 2.效率相对较低,因为计算增量数据时需要在两个表之间进行比较,计算量较大。 触 触 触 触发 发 发 发器 器 器 器的 的 的 的优 优 优 优点 点 点 点表 表 表 表现 现 现 现在 在 在 在: 1.触发器是自动的、延迟较短:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。 2.触发器可以通过数据库中的相关表进行级联更改。9第二章 变更数据的捕获方法 3.触发器可以强制限制,这些限制比用 CHECK约束所定义的更复杂。与 CHECK约
35、束不同的是,触发器可以引用其它表中的列。 触 触 触 触发 发 发 发器 器 器 器的 的 的 的缺 缺 缺 缺点 点 点 点表 表 表 表现 现 现 现在 在 在 在: 1.触发器会占用 SGA管理系统全局区中的内存,数据库表越多,触发器就越多,这将影响数据库的性能。 2.在运行期间一个触发器错误会导致引发该触发器的插入/删除/更新语句失败。而且,一个触发器的动作可以引发另一个触发器。在最坏的情况下,这甚至会导致一个无限的触发器。 3.触发器对于某些涉及较少表的应用是很有用处的,比如强制实现比由 CHECK约束提供的限制更为复杂的限制,用触发器生成电子邮件等。但是对于我们的系统,不是一种高效
36、的更新检测的方法。因为我们的系统需要监测整个数据库的所有表的数据变化,随着数据库表的越来越多,建立的触发器也就越来越多,这将对服务器造成非常大的压力。而且我们需要得到变化数据是通过访问 inserted、deleted 逻辑表,这样的访问也将对服务器造成压力,也会影响应用系统的效率。 DDDDBBBBMMMMSSSS提 提 提 提供 供 供 供的 的 的 的变 变 变 变更 更 更 更数 数 数 数据 据 据 据捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法的 的 的 的优 优 优 优点 点 点 点: : : : 1. 效率高、延迟较短。它是异步读取事务日志,捕获变更数据的。 2.
37、对信息源数据库事务处理影响不大。 DDDDBBBBMMMMSSSS提 提 提 提供 供 供 供的 的 的 的变 变 变 变更 更 更 更数 数 数 数据 据 据 据捕 捕 捕 捕获 获 获 获方 方 方 方法 法 法 法的 的 的 的缺 缺 缺 缺点 点 点 点: : : : 1. SQL Server 2008 数据库才有此功能,之前的版本没有些功能。 2. 它把变更数据存储在源数据库系统的表中。这对源数据库系统有影响。10第 第 第 第三 三 三 三章 章 章 章 SQL Server 事 事 事 事务 务 务 务日 日 日 日志 志 志 志原 原 原 原理 理 理 理 3.1 日 日 日
38、 日志 志 志 志文 文 文 文件 件 件 件 3333.1111.1111 数 数 数 数据 据 据 据库 库 库 库文 文 文 文件 件 件 件 18数据库文件就是操作系统文件 。一个数据库至少包含两个数据库文件,这些文件是在创建或修改数据库时被设定的。每个数据库都必须至少包含两个数据库文件,一个用于数据,一个用于事务日志。SQL Server 2000 允许下面三种类型的数据库文件: 主要数据文件:每个数据库都有一个主要数据文件,它除了存储数据之外,还要跟踪该该数据库中的其他所有文件。按照约定,主要数据文件的名称以 MDF为扩展名。 次要数据文件:一个数据库可以有零个或多个次要数据文件。
39、按照约定,次要数据文件的名称以 NDF为扩展名。 日志文件:每个数据库至少有一个日志文件,其中包含恢复该数据库中所有事务所需的信息。按照约定,日志文件的名称是以 LDF为扩展名。 3.2 日 日 日 日志 志 志 志 1,19日志是日志记录序列 ,每个日志记录记载了某个事务对数据库所做的更新操作。它主要用于事务恢复。如果系统崩溃,可以扫描日志来重建崩溃发生时事务正在做的事情。通常,为了恢复到数据库崩溃前的状态,系统将会做两类修复:1. 某些事务的工作将被撤消,数据被恢复,就像未执行过这些事务;2. 某些事务的工作将会重做,它们写到数1据库中的新值要重写一次。日志分为 undo、redo 和 u
40、ndo/redo 三种类型 。undo 类型的日志仅用于撤消某些事务。如果不能完全确定事务已经成功提交,那么事务对数据库所做的所有修改都会被撤消,数据库的状态被恢复到事务发生以前的状态。 3333.2222.1111 日 日 日 日志 志 志 志记 记 记 记录 录 录 录 1日志可被看作一个按只允许附加的方式打开的文件 。当事务执行时,日志管理器负责在日志中记录事务的动作,每个日志记录对应着一个事务动作。日志块是用来填充日志记录的。它最初在主存中被创建,是由缓冲区管理器分配。在满足一定条件后,日志块就11 第三章 SQL Server 事务日志原理 被写到磁盘的非易失性存储中。 本章所讨论的
41、三种日志类型用到的日志记录有以下几种形式: 1事务开始日志记录:,这一记录表示事务 T已开始。 2事务结束日志记录:事务结束日志记录分为两种, a:事务 T 已经成功完成并对数据库元素不再有修改。T 对数据库所做的任何修改都应反映到磁盘上,即使修改仅在内存中还未写到磁盘上。 b:事务 T 不能成功完成。如果事务 T 中止,它对数据库所做的更新都将被撤消。 3更新日志记录:描述一次数据库写操作,如T, X, v或T, X, v, w。 3333.2222.2222 uuuunnnnddddoooo日 日 日 日志 志 志 志 对 undo 日志而言,更新日志记录是一个三元组T, X, v。它表示
42、:事务 T改变了数据库元素 X,数据库元素 X原来的值是 v。 3333.2222.2222.1111 uuuunnnnddddoooo日 日 日 日志 志 志 志规 规 规 规则 则 则 则 为了使用 undo 日志来恢复系统故障,事务必须遵循两条规则。规则如下: U1 :如果事务 T改变了数据库元素 X,则在 X的新值写到磁盘前必须确保形如T, X, v的日志记录写到磁盘。 U2 :如果事务提交,则其 COMMIT 日志记录必须在事务改变的所有数据元素已写到磁盘后再写到磁盘,但应尽快。 3.2.2.2 使 使用 用 undo日 日志 志的 的恢 恢复 复 使 使用 用 日 日志 志的 的恢
43、 恢复 复恢复管理器首先将事务划分为已提交事务和未提交事务。如果日志中有提交日志记录,那么由 undo 规则 U2,事务 T对数据库所做的全部更新在此日志写入磁盘之前已写到磁盘上了。所以在系统发生故障时,事务 T 不会使数据库处于不一致的状态。但是,如果日志中有日志记录却没有记录,那么有可能在系统发生故障前事务 T 对数据库所做的某些修改已经写磁盘上了,而 T 的另一些修改甚至还未在主存缓冲区中生效,或者在主存缓冲区中生效了但还未写到磁盘上。此时,事务 T 是一个未完成的事务因此必须被撤消。事务 T 所做的所有修改都必须被恢复为其原值。由于 U1 规则保证如果 T 在发生故障前改变了磁盘上的
44、X,那日志中会有日志记录T, X, v记录,并且该记录在故障发生前被写到磁盘上了。因此,系统为数据库元素 X写入值 v 就恢复 X了。 12 暨南大学硕士学位论文 在恢复时,恢复管理器必须从尾部扫描日志。在扫描过程中,恢复管理器找到所有含或日志记录的事务 T。同时在向后扫描的过程中,如果看到记录T, X, v,则: 如果 T的 COMMIT记录已被扫描到,则忽略 T。因为它已经提交,因而不需要撤消T。 否则,T 是一个未完成的事务或一个中止的事务。恢复管理器必须将数据库中 X 的值改为 v。做完这些修改之后,恢复管理器必须为以前未中止的且未完成的每个事务 T写入一个日志记录,然后将日志刷新到磁
45、盘上。 33.22.33 rreeddoo 日 日志 志33.22.33 rreeddoo 日 日志 志redo 日志在日志记录中记录的是数据库元素的新值,不像 undo 日志那样使用旧值。日志记录T, X, v表示事务 T为数据库元素写入新值 v。 3.2.3.1 redo 日 日 日 日志 志 志 志规 规 规 规则 则 则 则 数据和日志项被写到磁盘的顺序必须遵循一条规则,即提前写日志规则。 R1:在修改磁盘上的任何数据库元素 X以前,所有与修改 X相关的日志记录,包括日志记录T, X, v及,都必须被写到磁盘上。 简要概括:当使用 redo 日志时,与事务相关的数据写到磁盘上的顺序为:
46、 1修改数据库元素的日志记录。 2COMMIT日志记录。 3数据库元素的新值。 3.2.3.2 使 使 使 使用 用 用 用 redo 日 日 日 日志 志 志 志的 的 的 的恢 恢 恢 恢复 复 复 复 在系统发生故障后,恢复管理器使用 redo 日志进行恢复时,需要做以下的事情: 1确定提交的事务。 2从日志文件的首部开始扫描,对遇到的每一T, X, v记录: a如果 T是未提交的事务,则忽略 T。 b如果 T是已提交的事务,则为数据库元素 X写入新值 v。 3对每个未完成的事务 T,在日志中写入一个日志记录,然后将日志刷新到磁盘上。13 第三章 SQL Server 事务日志原理 33
47、33.2222.4444 uuuunnnnddddoooo/rrrreeeeddddoooo日 日 日 日志 志 志 志 undo/redo 日志记录有四个组成部分,形式如T, X, v, w。它表示事务 T修改了数据库元素 X的值,其旧值为 v,新值为 w。 3.2.4.1 undo/redo 日 日志 志规 规则 则 日 日志 志规 规则 则undo/redo 日志系统必须遵循如下的规则: UR1:在事务 T对数据库元素 X所做的修改被写到磁盘上之前,更新日志记录T, X, v, w必须被写到磁盘上。 undo/redo 日志的规则 UR1 只遵循 undo 日志和 redo 都有的约束。但是,日志记录可以在数据库元素的修改写入磁盘之前或之后出现在磁盘上。 3.2.4.2 使 使 使 使用