备份与恢复1.0简介本教程是关于什么的本教程讨论了备份与恢复主题。它讲解了不同的恢复与日志记录方法,并详细描述如何使用BACKUP、RESTORE和ROLLFORWARD命令。在本教程中,您将学习:可用于DB2®的恢复方法事务日志的概念和可用的不同类型的日志可以使用的日志记录方法的类型如何执行BACKUP操作如何执行RESTORE操作如何执行ROLLFORWARD操作索引的重新创建问题这是由六个教程组成的系列的最后一个教程,这些教程帮助您准备DB2V8.1forLinux,UNIX®andWindowsTMDatabaseAdministrationCertification考试(考试701)。本教程中的资料主要针对该考试第6部分中的目标,该部分的标题是“备份与恢复”。不需要DB2UniversalDatabaseTM的副本就能学完本教程。但是,如果愿意的话,可以下载IBMDB2通用数据库,企业服务器版的免费试用版。本教程的适用对象为了理解本教程所提供的材料,您应该熟悉下列内容:DB2环境(数据库管理器配置文件、数据库配置文件和DB2注册表变量等)使用命令行处理器(CommandLineprocessor)和DB2GUI工具来调用DB2命令不同的DB2对象(缓冲池、表空间、表和索引等)可以针对数据库执行的基本SQL操作(UPDATE、INSERT、DELETE和SELECTSQL语句)关于作者RaulF.Chong是IBM多伦多实验室的一名数据库顾问,主要与IBM业务伙伴一起工作。Raul已经在IBM工作了五年,其中三年从事DB2技术支持,两年作为专攻数据库性能调优、数据库应用程序开发以及从其它RDBMS迁移到DB2等方面的顾问。Raul撰写了好几篇有关用于不同受支持平台的DB2方面的文章,包括DB2UDBforz/OS®andOS/390®以及DB2UDBforiSeries,当然还包括DB2forLinux、UNIX和Windows。这些文章已经发布在DB2开发者园地网站上。您可以使用该网站上的搜索域来查看它们;只要输入Raul作为搜索关键词即可。可以通过rfchong@ca.ibm.com与Raul联系。致谢非常感谢DwaineR.Snow和ClaraLiu抽出时间来审阅本教程中的材料。Dwaine具有丰富的DB2产品经验,而且还撰写了好几本有关这方面的书。Clara也具有DB2方面的大量经验,并且为许多IBM业务伙伴和客户讲授DB2认证(DB2Certification)备考课程。他们两位都提供了颇有价值的意见!2.0数据库恢复概念恢复方案您永远不会知道系统何时会遇到灾难或故障。最好的做法是做好准备,不仅要防止外界因素破坏数据,而且还要防止内部用户可能无意中用错误信息毁坏您的数据库。您备份数据库了吗?您能恢复直到最后一秒种为止所执行的所有事务吗?为了使数据损失降低到最小程度,需要有一个恢复策略,确保它起作用,并经常实行这一策略。您应该考虑的一些恢复方案包括:系统故障。电源故障、硬件故障或软件故障都能够使数据库处于不一致状态。事务故障。用户无意中会用错误数据修改数据库,从而毁坏数据库。介质故障。如果磁盘驱动器变得不能使用,那么可能会丢失所有或部分数据。灾难。系统所在的设施可能会遭受火灾、洪水或其它类似灾难的损坏。恢复策略为了规划恢复策略,您应该问自己一些问题:可以再次从另一个来源装入数据吗?您能承受丢失多少数据?您能花多少时间来恢复数据库?哪些存储资源可用于存储备份和日志文件?事务工作单元(unitofwork,UOW),也称作事务,由一个或多个以COMMIT或ROLLBACK语句结尾的SQL语句组成。该UOW中的所有语句都被作为一个单元处理,这确保了数据一致性。用于说明这个概念的典型示例是:客户尝试将100美元从储蓄存款帐户转移到活期存款帐户。这种情况的UOW类似于:DELETE100dollarsfromSAVINGSaccountINSERT100dollarstoCHECKINGaccountCOMMIT如果没有将这些语句作为一个单元处理,那么您可以想象一下,如果在DELETE之后但又在INSERT语句之前发生硬件故障,会发生什么情况:该客户将丢失100美元!然而,由于这些语句被作为一个单元处理,所以这种情况决不会发生:DB2将知道该单元没有完成(COMMIT),因而它将ROLLBACK先前语句所做的所有更改,并将受影响的行返回到事务开始之前所拥有的状态。注:没有用于标识事务开始的语句。COMMIT或ROLLBACK之后的语句将开始新事务。恢复类型让我们熟悉一下恢复类型的概念。DB2考虑到了下列恢复类型:崩溃恢复。这种类型的恢复通过撤销(回滚)未提交的事务来防止数据库处于不一致状态。请再次考虑上一页中的示例。如果在COMMIT语句之前发生电源故障,那么下一次DB2重新启动,再访问该数据库时,DB2将先回滚(ROLLBACK)INSERT语句,然后回滚(ROLLBACK)DELETE语句。(注:回滚语句的顺序与最初执行时的顺序相反。)版本恢复。这种类型的恢复通过使用从BACKUP命令获取的备份映像来恢复先前的数据库版本。恢复的数据库将包含在执行BACKUP命令时所处状态的信息。如果在执行备份之后针对数据库执行进一步操作,那么该信息将丢失。前滚恢复。这种类型的恢复通过使用完全数据库备份,结合日志文件来扩展版本恢复。必须先恢复备份以用作基线;然后在该备份之上应用日志。该过程会将数据库或表空间恢复到某个特定时间点。前滚恢复要求启用归档日志记录。我们将在本教程的稍后部分中讨论归档日志记录(请参阅日志记录类型)。3.0DB2日志理解DB2日志DB2事务日志对于恢复来说极其重要。它们记录对数据库对象和数据所做的更改。可以将日志存储在文件或裸设备中;对于以下示例,我们将使用文件。为了确保数据完整性,DB2使用先写日志记录方案,在该模式中,它在将更改写入同样位于磁盘上的数据库(此过程也称为外部化)之前先写入日志。下图说明了这一方案:在该图中,执行了四条SQL语句。这些语句已经被高速缓存在包高速缓存中,而且已经将这些语句需要的数据页从数据库检索到缓冲池中。执行SQL语句时,先将更改记录在日志缓冲区中,然后将更改写入日志文件中。在该示例中,还未将新版本的数据页外部化到数据库;这通常在需要缓冲池空间时执行,或因性能方面的原因而异步执行。主日志文件和辅助日志文件主日志文件是在首次数据库连接时或数据库激活时直接分配的。辅助日志文件需要时每次动态地分配一个。有几个与日志记录相关的数据库配置参数。其中一些参数是:LOGPRIMARY:该参数确定要分配的主日志文件数。LOGSECOND:该参数确定可分配的辅助日志文件的最大数目。LOGFILSIZ:该参数用于指定日志文件的大小(用4KB页为单位)。让我们考虑一个示例。假设数据库配置文件中有下列值:Logfilesize(4KB)(LOGFILSIZ)=250Numberofprimarylogfiles(LOGPRIMARY)=3Numberofsecondarylogfiles(LOGSECOND)=2Pathtologfiles=C:\mylogs\一旦首次建立与数据库的连接,就分配三个主日志文件,它们均由250个4KB页组成。如果查看C:\mylogs目录,会看到三个文件:DirectoryofC:\MYLOGS\2003-03-1006:06p1,032,192S0000000.LOG2003-03-1006:06p1,032,192S0000001.LOG2003-03-1006:06p1,032,192S0000002.LOG3File(s)3,096,576bytes现在,假定数据库中没有活动,您决定执行以下事务,该事务将插入一百万条记录:INSERTINTOTABLE1VALUES(1);INSERTINTOTABLE1VALUES(2);...INSERTINTOTABLE1VALUES(1,000,000);COMMIT;早先,我们提到过对数据库所做的更改被记录在日志中。在没有增加设法精确地计算每条插入占用多少空间这一复杂性的情况下,您应该明白我们正在设法说明什么:DB2将填满第一个日志,然后继续填满第二个和第三个日志。填满第三个日志文件后,没有更多的主(预分配的)日志文件,因此DB2将动态地分配第一个辅助日志文件,因为LOGSECOND大于零。一旦这个日志文件被填满,DB2将继续分配另一个辅助日志文件,并将重复该过程,直到达到LOGSECOND日志文件数目的最大值为止。对于该示例,当DB2尝试分配第三个辅助日志文件时,它将返回一个错误,指出已经达到事务满条件。此时,将回滚该事务。无限日志记录难道不就能通过增大LOGSECOND来避免日志空间用尽吗?辅助日志文件的最大数目为254。然而,您不会去指定一个较大的数,因为会产生与文件分配相关联的性能代价。一般情况下,您希望指定足够多的LOGSECOND日志文件来应付负载中的峰值(如月末较为繁重的事务负载)。在下一次激活数据库(或所有连接断开之后的首次连接)之前,不会除去辅助日志文件。要允许无限的活动日志记录:1.将USEREXIT数据库配置参数设置为ON。2.将LOGSECOND设置为值-1。请注意上面术语“活动(active)”的用法。我们将在下一页讨论活动日志和归档日志的概念日志类型在这一页中,我们将简要地定义不同类型的日志。在下一页中,您将了解在描述循环和归档日志记录时如何使用它们。有三种类型或状态的DB2事务日志:活动日志。如果满足下面两个条件中的任何一个,则认为该日志是活动的:o它包含有关还未提交或回滚的事务的信息。o它包含有关已经提交但其更改还未被写入数据库磁盘(外部化)的事务的信息。联机归档日志。这种类型的日志包含已提交的且已外部化的事务的信息。这种日志被保存在与活动日志相同的目录中。脱机归档日志。是指已经从活动日志目录移动到另一个目录或介质的归档日志。可以手工或使用用户出口(userexit)的自动过程来完成这个移动。日志记录类型有两种类型的日志记录:循环日志记录。循环日志记录是DB2的缺省日志记录方式。从其名称可以知道,这种类型的日志记录以循环方式重用日志。例如,如果有四个主日志文件,那么DB2将以如下顺序使用它们:Log#1,Log#2,Log#3,Log#4,Log#1,Log#2等。只要日志仅包含有关已经提交的且被外部化到数据库磁盘的事务的信息,就可以用循环日志记录方式重用它。换言之,如果日志仍是一个活动日志,则不能重用它。采用上面的示例,如果一个长期运行的事务使用五个日志,那么将发生什么情况呢?在这种情况下,DB2将分配另一个日志文件—辅助日志文件,如上一章中所描述的那样(请参阅主日志文件和辅助日志文件)。下图说明了它是如何工作的:归档日志记录。同样,可以从其名称知道,当使用归档日志记录时,将归档(保留)日志。在循环日志记录中,要覆盖已提交且已外部化的事务,而在归档日志记录中,将保存它们。例如,如果有四个主日志,DB2可能以如下顺序使用它们:Log#1,Log#2,Log#3,Log#4,(如果Log#1的所有事务都已被提交且外部化,则将其归档),Log#5,(如果Log#2的所有事务都已被提交且外部化,则将其归档),Log#6等。正如您从上面的示例所看到的那样,DB2将使四个主日志文件保持可用,并且将不重用那些已经用某些事务填满的日志文件,这些事务已经被提交且外部化。换言之,它不会覆盖已变成归档日志的日志。下图说明了它是如何工作的:上图不需要加以解释,它应该能够总结我们到目前为止所讨论的几个概念。注:在使用归档日志记录之前,需要启用它。要启用它,必须同时打开下列参数或打开其中的任意一个:LOGRETAIN(db2updatedbcfgfordatabase_nameusingLOGRETAINON)USEREXIT(db2updat