【IT168 技术文档】
IBM 的 DB2 V9.5 可以使用单一系统视图(Single System View )对多个数据库分区进行备份和还原。在 DB2 V9.5 之前,我们只能一次备份一个数据库分区,或者使用 db2_all 先备份包含系统目录的分区,再备份其他分区。一次备份一个数据库分区既费时也可能出错,并且无法在备份映像中包含恢复所需的日志文件,也就是 BACKUP 命令在多分区数据库环境中不能使用(DB2 V9.5 之前)。复原多分区数据库比较复杂,因为每个数据库分区的备份时间戳稍微有些差异。虽然使用 db2_all 命令部分简化了备份还原工作,但还是存在备份还原无法完成的问题。
现在,DB2 V9.5 可以使用单一系统视图(SSV)对多分区数据库环境直接进行备份和还原,简化了操作难度。另外,DB2 V9.5 还引入了前滚至最小恢复时间功能,由于单一系统视图(SSV)和前滚至最小恢复时间是 DB2 V9.5 的新特性,很多客户不知道该如何使用,本文将重点介绍 DB2 V9.5 关于单一系统视图(SSV)和前滚至最小恢复时间的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。
现在 DB2 V9.5 已经启用了前滚至最小恢复时间(ROLLFORWARD TO END OF BACKUP)。当数据库处于一致状态时(当数据库目录中列示的对象与磁盘中实际存在的对象匹配时),最小恢复时间是前滚期间的最早时间点。手动确定要将数据库前滚至的正确时间点比较困难,尤其是对于分区数据库更是如此。在版本 9.5 中,通过在 ROLLFORWARD DATABASE 命令中使用 TO END OF BACKUP 参数可以将数据库前滚至由数据库管理器确定的最小恢复时间。
在 DB2 V9.5 之前,我们如果如何确定最小恢复时间?通常是通过先执行一个时间比较靠前的时间(比如,比备份时间早的某一个时间),ROLLFORWARD 实用程序会报错,并告诉我们最小恢复时间是什么。然后我们再次执行 ROLLFORWARD 实用程序,根据获得的最小恢复时间进行恢复。实际上来说,最小恢复时间是最后完成的那个分区备份结束的时间。比如,我们利用联机备份恢复 SAMPLE 数据库,在执行完 RESTORE 命令后,可以把数据库前滚到一个早于备份发生的时间,具体如下:
$ db2 rollforward db sample to 2007-01-01 and stop SQL1275N The stoptime passed to roll-forward must be greater than or equal to " 2008-01-29-16.33.23.000000 UTC ", because database " BAZ " on node ( s ) " 0 , 1 " contains information later than the specified time . $ db2 rollforward db sample to 2008-01-29-16.33.23.000000 and stop DB20000I The ROLLFORWARD command completed successfully .
那么在 DB2 V9.5 之前的版本中做前滚恢复时,我们如何才能知道从哪一个日志文件开始呢?实际上来说,除非我们知道联机备份开始的时间,否则我们很难准确的知道哪些日志文件是我们必须的。而且,由于在 DB2 V9.5 之前多分区数据库环境不能使用带 INCLUDE LOGS 选项的 BACKUP 命令,我们也无法在备份介质中包含需要的日志文件。
现在 DB2 V9.5 已经可以使用带 INCLUDE LOGS 选项的 BACKUP 命令,具体见上一个章节介绍。另外,由于 DB2 V9.5 对 ROLLFORWARD 命令提供了新的选项 ROLLFORWARD TO END OF BACKUP,可以不必像以前一样先执行一下 ROLLFORWARD 命令来获得最小恢复时间,而是直接使用带 ROLLFORWARD TO END OF BACKUP 选项的 ROLLFORWARD 命令恢复到最小恢复时间。
下面我们继续在当前 DB2CLP 窗口中,发出 FORCE APPLICATIONS ALL 命令,断开 SAMPLE 数据库上的所有连接。然后把节点设成系统目录所在节点,也就是节点0,发出 RESTORE 命令,利用我们之前的联机备份映像文件(时间戳为 20080129163323)进行恢复,并指定 logtarget 选项,把备份映像中的日志文件导出到指定目录下,具体如清单 2 所示:
C:\>set DB2NODE=0 C:\> db2 force applications all DB20000I FORCE APPLICATION命令成功完成。 DB21024I 此命令为异步的,可能未能立即生效。 C:\> db2 restore db sample taken at 20080129163323 logtarget C:\db2\logs SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。 想要继续吗?( y / n ) y DB20000I RESTORE DATABASE命令成功完成。
命令成功完成。在还原的过程中,会提示“正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。是否要继续?”这时候选择y,也就是“是”的意思,回车,这样就把备份映像中的 S0000002.LOG 日志文件释放到了 C:\db2\logs 目录中。需要注意的是,如果指定了 LOGTARGET 选项,但是备份映像中没有包含任何日志文件,则在尝试复原操作时会返回一个错误。如果指定了无效或只读的路径,复原操作会报 SQL2581N 错误。在指定 LOGTARGET 选项条件下 ,复原数据库或表空间的过程中,如果不能抽取一个或多个日志文件,则复原操作失败并返回错误。还可以选择只复原保存在备份映像中的日志文件。要执行此操作,可使用 RESTORE DB 命令的 LOGTARGET 选项指定 LOGS 选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。
下面我们切换到节点 1,继续发出 RESTORE 命令,利用我们之前的联机备份映像文件(时间戳为 20080129163323)进行恢复,需要注意的是,在 DB2 V9.5 中,只是对 BACKUP 命令进行了修正,也就是说,BACKUP 命令可以在主节点上备份所有节点或部分节点,但是 RESTORE 命令,还是需要在各个节点进行恢复或者使用 db2_all 命令进行恢复。在节点1进行恢复的具体情况如清单 3 所示:
C:\> set DB2NODE=1 C:\> db2 restore db sample taken at 20080129163323 SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。 想要继续吗?( y / n ) y DB20000I RESTORE DATABASE命令成功完成。
命令成功完成。还原的过程中,会提示“正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。是否要继续?”这时候选择y,也就是“是”的意思,回车。这样我们就分别在节点 0 和节点 1 对 SAMPLE 数据库进行了恢复。由于我们利用的联机备份映像文件对数据库SAMPLE进行的恢复,所以恢复成功后,SAMPLE 数据库处于 BACKUP PENDING 状态,需要做一次前滚恢复才能恢复正常。下面为了实验的方便,假定我们归档日志找不到了(手工删除了归档日志目录下的所有日志),为了完成前滚恢复,我们把从备份映像文件中导出的日志 S0000002.LOG 放入到节点 0 和 1 的活动日志目录中,完成后,我们继续在当前 DB2CLP 窗口中,把节点切换到节点 0(ROLLFORWARD 命令必须在系统目录所在节点执行),发出带 ROLLFORWARD TO END OF BACKUP 选项的 ROLLFORWARD 命令,执行前滚恢复,恢复到最小恢复时间。具体如清单 4 所示:
C:\> set DB2NODE=0 C:\> db2 rollforward db sample to end of backup on all dbpartitionnums and stop 前滚状态 输入数据库别名 = sample 节点数已返回状态 = 2 节点号 前滚 下一个要读取的 已处理的日志文件 上次落实的事务 日志 状态 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 未暂挂 S0000002.LOG-S0000003.LOG 2008-01-29-08.33.35.000000 UTC 1 未暂挂 S0000004.LOG-S0000005.LOG 2008-01-29-08.33.28.000000 UTC DB20000I ROLLFORWARD命令成功完成。
命令成功完成。这样我们就把SAMPLE数据库前滚到了最小时间点。
在当前 DB2CLP 窗口中重启实例 DB2,切换到节点 0,连接数据库 SAMPLE,查询 ORG 表,就可以看到 ORG 表中,有我们新增的两条记录了,具体如清单 5 所示:
C:\> db2stop 2008-01-30 14:39:56 0 0 SQL1064N DB2STOP 处理成功。 2008-01-30 14:39:57 1 0 SQL1064N DB2STOP 处理成功。 SQL1064N DB2STOP 处理成功。 C:\> db2start 2008-01-30 14:40:05 0 0 SQL1063N DB2START 处理成功。 2008-01-30 14:40:05 1 0 SQL1063N DB2START 处理成功。 SQL1063N DB2START 处理成功。 C:\> db2 connect to sample 数据库连接信息 数据库服务器 = DB2 / NT 9.5.0 SQL 授权标识 = RHETTE 本地数据库别名 = SAMPLE C:\> db2 select * from org where DEPTNUMB = 21 or DEPTNUMB = 22 DEPTNUMB DEPTNAME MANAGER DIVISION LOCATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 21 PCP 100 Eastern BEIJING 22 PCP 100 Eastern BEIJING 2 条记录已选择。
命令成功完成。可以看到之前我们在联机备份期间插入的记录已经通过前滚恢复恢复成功了。另外,我们在上一篇的单一系统视图(SSV)部分中曾经讲到对跨多个分区的数据库进行配置不再需要在每个数据库分区调用 db2_all 命令,数据库管理器提供了多个分区中所有数据库配置元素的单一视图,也就是说,只要任何一个分区上发出更新数据库配置的命令,默认情况下都会对所有数据库分区生效。通过从数据库所在的任何分区只发出一个 SQL 语句或一个管理命令,即可更新多个分区中的该数据库配置。缺省情况下,用于更新或复位数据库配置的方法是在所有数据库分区上。要实现命令脚本和应用程序的向后兼容性,您有下面三种选择:
- 使用 db2set 命令将 DB2_UPDDBCFG_SINGLE_DBPARTITION 注册表变量设置为 TRUE,如下所示:
DB2_UPDDBCFG_SINGLE_DBPARTITION = TRUE
注: 设置该注册表变量不适用于使用 ADMIN_CMD 过程发出的 UPDATE DATABASE CONFIGURATION 或 RESET DATABASE CONFIGURATION 请求。
- 对 UPDATE DATABASE CONFIGURATION 或 RESET DATABASE CONFIGURATION 命令或者 ADMIN_CMD 过程使用 DBPARTITIONNUM 参数。例如,要更新所有数据库分区上的数据库配置,请按如下所示调用 ADMIN_CMD 过程:
CALL SYSPROC.ADMIN_CMD ( ' UPDATE DB CFG USING sortheap 1000 ' ) 要更新单个数据库分区,请按如下所示调用 ADMIN_CMD 过程:
- 对 db2CfgSet API 使用 DBPARTITIONNUM 参数。db2Cfg 结构中的标志指示数据库配置的值是否将应用于单个数据库分区。如果设置一个标志,那么还必须提供 DBPARTITIONNUM 值,例如:
# define db2CfgSingleDbpartition 256
如果未设置 db2CfgSingleDbpartition 值,那么该数据库配置的值将应用于所有数据库分区,除非对用于设置数据库管理器或数据库配置参数的 db2CfgSet API 将 DB2_UPDDBCFG_SINGLE_DBPARTITION 注册表变量设置为 TRUE,或者将 versionNumber 设置为低于版本 9.5 的版本号的任意版本号。
需要注意的是,如果您发现数据库配置值不一致,那么可以单独地更新或复位每个数据库分区。
ADMIN_CMD 存储过程可以被应用程序中调用,以便能够在应用程序中调用执行管理命令。对多分区的数据库环境来说,如果通过 ADMIN_CMD 存储过程执行管理命令,则输出结果,每一个数据库分区一行。ADMIN_CMD 存储过程的模式是 SYSPROC。比如我们想在应用程序中执行备份 SAMPLE 数据库的命令,可以在应用程序中调用 ADMIN_CMD 存储过程,执行备份命令,具体如清单 6 所示:
C:\> db2 " call sysproc.admin_cmd ( ' backup db sample on all dbpartitionnums to c:\ ' )" 结果集 1 - - - - - - - - - - BACKUP_TIME DBPARTITIONNUM SQLCODE SQLERRMC SQLERRML - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 20080130202923 0 0 0 20080130202923 1 0 0 2 条记录已选择。 返回状态 = 0
命令成功完成。我们可以看到,通过调用 ADMIN_CMD 存储过程,完成了对 SAMPLE 数据库的备份,返回结果有两条,第一条记录了 SAMPLE 数据库在节点0的备份信息,第二条记录了 SAMPLE 数据库在节点 1 的备份信息。
DB2 V9.5 启用了双日志控制文件,使得数据库恢复更容易。在版本 9.1 中,数据库管理器维护一个日志控制文件:SQLOGCTL.LFH。在版本 9.5 中,数据库管理器维护该日志控制文件的两个副本:SQLOGCTL.LFH.1 和 SQLOGCTL.LFH.2。保留日志控制文件的两个副本可以减少发生故障时丢失数据的风险。当数据库在出现故障后重新启动时,数据库管理器将应用存储在日志文件中的事务信息来使数据库返回到一致状态。数据库管理器使用日志控制文件来确定需要应用日志文件中的哪些条目。如果日志控制文件已损坏,那么数据库管理器将无法使数据库返回到一致状态。然而,具有日志控制文件的两个副本会使数据库恢复更灵活,这是因为如果日志控制文件的一个副本已损坏,那么数据库管理器可以在重新启动期间使用另一个副本。