技术开发 频道

DB2 V9.5 备份还原之单一系统视图(SSV)

【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)和前滚至最小恢复时间的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。

IBM 的 DB2 V9.5 可以使用单一系统视图(Single System View)对多个数据库分区进行备份和还原。

在 DB2 V9.5 之前,我们只能一次备份一个数据库分区。一次备份一个数据库分区既费时也可能出错,并且无法在备份映像中包含恢复所需的日志文件,也就是 BACKUP 命令在多分区数据库环境中不能使用(DB2 V9.5 之前)。复原多分区数据库比较复杂,因为每个数据库分区的备份时间戳稍微有些差异。由于每个数据库分区的备份时间戳稍微不同,所以标识所有属于同一备份的数据库分区备份比较困难,而且也很难确定恢复完成后的最小恢复时间。

虽然使用 db2_all 命令部分简化了备份还原工作,但还是存在备份还原无法完成的问题。在 DB2 V9.5 中,当从分区数据库的目录节点执行备份操作时,您可以指定要在备份中包含哪些分区,也可以指定包含所有数据库分区。DB2 V9.5 将同时备份指定的分区,并且与指定的数据库分区相关联的备份时间戳将相同。

在 DB2 V9.5 之前,如果我们使用联机备份介质进行还原的时候,比较难以确定前滚恢复需要的最小恢复时间以及需要哪些日志文件。现在 DB2 V9.5 已经启用了前滚至最小恢复时间(ROLLFORWARD TO END OF BACKUP),简化了还原操作。另外,在 DB2 V9.5(多分区数据库环境)中执行联机备份的时候,已经可以使用 INCLUDE LOGS 选项了,也就是说,多数据库分区上的备份和还原基本上和单数据库分区的备份和还原差不多,操作十分简便。

本文将重点介绍 DB2 V9.5 关于单一系统视图(SSV)和前滚至最小恢复时间的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。

我们将按照下列顺序介绍单一系统视图(SSV)和前滚至最小恢复时间以及相关的功能:

  1. 构建多分区数据库环境,创建示例实例 DB2,其有两个节点 0、1,并创建示例数据库 SAMPLE。
  2. 简要介绍单一系统视图(SSV)。
  3. 简要介绍前滚至最小恢复时间。

首先我们在 WINDOWS XP 环境下安装带有 DPF LICENSE的DB2 ESE V9.5,安装完成后,默认创建了实例 DB2,默认情况下其拥有一个节点,节点编号为 0。下面我们简单介绍一下添加数据库分区的命令 db2ncrt 和 ADD DBPARTITIONNUM。

Db2ncrt 命令主要用来在 Windows 环境中(仅在 Windows 环境下使用)把一个数据库分区服务器添加到实例中。如果一个计算机上已经存在一个实例,当往这个实例上添加一个数据库分区服务器时,这个数据库分区服务器将被作为一个逻辑数据库分区服务器添加到计算机上。如果这个计算机上不存在实例,当把数据库分区服务器添加到这个计算机上时,将添加一个实例,并且这个计算机将成为一个新的物理数据库分区服务器。当实例中已经存在数据库时不要使用这个命令,可以使用带 ADD DBPARTITIONNUM 选项的 DB2START 命令替代,或者直接在命令行窗口使用 ADD DBPARTITIONNUM 命令。当使用 ADD DBPARTITIONNUM 命令将一个新数据库分区添加至系统时,会将实例中的所有现有的数据库扩充到新数据库分区。不能简单地通过对系统添加数据库分区来将单分区数据库更改为多分区数据库。这是因为跨数据库分区再分发数据需要每个受影响的表上的分布键。分布键是在多分区数据库中创建表时自动生成的。在单分区数据库中,可使用 CREATE TABLE 或 ALTER TABLE SQL 语句显式地创建分布键。

如果在 Windows 上使用“企业服务器版”,并且该实例没有数据库,那么应使用 DB2NCRT 命令来调整该数据库系统。但是,如果您已有数据库,使用 DB2START ADDNODE 命令,以确保在调整系统时为每个现有的数据库创建一个数据库分区。在 Windows 上,永远都不应手动编辑节点配置文件(db2nodes.cfg),因为这会给该文件带来不一致性。

现在我们打开一个 DB2CLP 窗口,通过 db2ncrt 命令,添加一个节点,使用/n选项指定节点号为1,使用/u选项指定 DB2 服务的帐户名和密码,使用/i选项指定实例(如果与缺省/当前实例不同的话),使用/h选项指定 TCP/IP 主机名(如果主机名不是机器缺省 TCP/IP 主机名的话)为 CYONG,使用/p选项指定逻辑端口号(如果这不是机器上第一个节点的话)为 1,使用/o选项指定拥有实例的机器的计算机名称(当在机器上创建第一个节点时)为 CYONG。具体如清单1所示:

C:\> db2ncrt /n:1 /u:rhette,chengyxuemay7810 /i:DB2 /h:CYONG /p:1 /o:CYONG DBI1937W db2ncrt 命令成功地添加了节点。在所有节点停止并再次启动之前,该节点不活动。 说明: 在 STOP DATABASE MANAGER(db2stop)命令同时停止所有节点之前,不会将db2nodes.cfg 文件 更新为包括新节点。在更新文件之前,现有的节点无法与新节点通信。 用户响应: 发出 db2stop 来停止所有节点。将所有节点成功停止后,发出 db2start 来启动 所有节点,包括新节点。

命令成功完成。这样我们就成功的使用 db2ncrt 命令把节点 1 添加到了实例 DB2 中,目前实例 DB2 拥有两个节点,节点编号分别为 0 和 1 。执行完 db2ncrt 命令后,需要重启实例,我们继续在 DB2CLP 窗口中发出 db2stop 和 db2start 命令,具体如清单 2 所示:

C:\> db2stop 2008-01-27 03:05:55 0 0 SQL1064N DB2STOP 处理成功。 SQL1064N DB2STOP 处理成功。 C:\> db2start 2008-01-27 03:06:06 1 0 SQL1063N DB2START 处理成功。 2008-01-27 03:06:07 0 0 SQL1063N DB2START 处理成功。 SQL1063N DB2START 处理成功。

命令成功完成。下面我们继续在 DB2CLP 窗口中,发出 db2sampl 命令,创建示例数据库 SAMPLE,具体如清单 3 所示:

C:\> db2sampl Creating database " SAMPLE " . . . Connecting to database " SAMPLE " . . . Creating tables and data in schema " RHETTE " . . . ' db2sampl ' processing complete.

命令成功完成,这样我们就在实例 DB2 的两个节点 0、1 上创建了示例数据库 SAMPLE。

DB2 V9.5 可以使用单一系统视图(SSV)对多个数据库分区进行备份和还原。在 DB2 V9.5(开放平台)之前,我们只能一次备份一个数据库分区。一次备份一个数据库分区既费时也可能出错,并且无法在备份映像中包含恢复所需的日志文件,也就是 BACKUP 命令在多分区数据库环境中不能使用(DB2 V9.5 之前)。复原多分区数据库比较复杂,因为每个数据库分区的备份时间戳稍微有些差异。由于每个数据库分区的备份时间戳稍微不同,所以标识所有属于同一备份的数据库分区备份比较困难,而且也很难确定恢复完成后的最小恢复时间。虽然使用 db2_all 命令部分简化了备份还原工作,但还是存在备份还原无法完成的问题。

每次备份一个数据库分区既耗时又容易出错。使用 db2_all 命令备份所有分区比逐一备份数据库分区要简单,因为通常只需进行一次命令调用。但是,当使用 db2_all 命令来备份分区数据库时,有时仍然需要多次调用 db2_all,因为不能同时备份包含目录的数据库分区和非目录数据库分区。无论是一次备份一个数据库还是使用 db2_all 进行备份,管理使用这两种方法创建的备份映像都会很难,因为每个数据库分区的备份映像的时间戳记不同,而且在数据库分区的备份映像之间协调最低恢复时间也很难。

由于上述原因,在分区数据库环境中备份数据库的推荐方法为使用 SSV 备份。

首先我们来看一下在 DB2 V9.5 之前我们如何备份多数据库分区 Database Partitioning Feature)。由于系统目录所在分区(DB2 V9.5 之前版本)需要单独进行备份,所以通常我们需要先在系统目录所在分区执行分区备份,比如备份 sample 数据库,具体如下:
备份 sample 数据库

备份成功后,继续在这个数据库分区上备份其他数据库分区节点,具体命令如下:
备份其他数据库分区节点

而使用 db2_all 命令备份多个数据库分区,每个数据库分区备份介质会得到不同的时间戳,比如备份 SAMPLE 数据库,会发现节点 1 备份映像的时间戳是 20080129091001,而节点 2 备份映像的时间戳是 20080129091004,具体如下:

$ db2_all “ db2 backup db sample ” Backup successful. The timestamp for this backup image is : 20080129091001 linuxbox: db2 backup db sample completed ok Backup successful. The timestamp for this backup image is : 20080129091004 linuxbox: db2 backup db sample completed ok

另外,在 DB2 V9.5 之前,多分区的数据库想在联机备份的时候在备份映像文件中包含日志文件(通过 INCLUDE LOGS 选项)是不行的,只能在单分区环境中实现。现在 DB2 V9.5 的 BACKUP 命令已经可以跨分区执行,并且,其他的 BACKUP 选项和以前一样支持,也就是对以前的版本兼容。另外,在多分区数据库环境中,BACKUP 的 INCLUDE LOGS 选项已经可以使用。在多分区数据库环境中进行备份,允许数据库保持联机,或使数据库脱机。也就是数据库联机或脱机时都可以进行分区数据库备份。如果数据库联机,那么 backup 实用程序将获取至其他数据库分区的共享连接,因此用户应用程序能够连接到正在备份的数据库分区。在备份分区数据库时,在缺省情况下,备份映像包含日志文件。如果不希望备份映像包含日志文件,那么请在运行备份命令时使用 EXCLUDE LOGS 命令参数。

下面我们继续在当前的 DB2CLP 窗口中,首先通过 set DB2NODE=0 命令把节点切换到系统目录所在节点(如果是在 UNIX 或 LINUX 请使用 export 命令),连上 SAMPLE 数据库,然后发出 BACKUP DB 命令,通过使用 ON ALL DBPARTITIONNUMS 选项备份 SAMPLE 数据库所有的数据库分区(也就是备份节点 0、1),需要注意的是,需要在系统目录所在的分区执行 BACKUP 命令,具体如清单 5 所示:

C:\>set DB2NODE=0 C:\> db2 connect to sample 数据库连接信息 数据库服务器 = DB2 / NT 9.5.0 SQL 授权标识 = RHETTE 本地数据库别名 = SAMPLE C:\> db2 backup db sample on all dbpartitionnums 部件 结果 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0000 DB20000I BACKUP DATABASE命令成功完成。 0001 DB20000I BACKUP DATABASE命令成功完成。 备份成功。此备份映像的时间戳记是:20080129145417

命令成功完成。通过备份命令的返回结果,我们可以看到我们对节点 0 和 1 都进行了备份,并且整个备份映像的时间戳是同一个:20080129145417。这样我们在还原的时候,对多个分区进行恢复就不存在由于每个分区的时间戳不一样而恢复困难的情况了。如果想对某个分区,或某几个分区单独进行备份,可以使用 BACKUP 命令的 ON DBPARTITIONNUMS(节点列表),如果备份多个节点,节点之间用逗号隔开。比如我们想对节点 0 单独进行备份,可以在 DB2CLP 窗口中发出 BACKUP 命令,具体如清单 5 所示:

C:\> db2 backup db sample on dbpartitionnums ( 0 ) 部件 结果 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0000 DB20000I BACKUP DATABASE命令成功完成。 备份成功。此备份映像的时间戳记是:20080129150435

命令成功完成。我们可以看到 BACKUP 命令只对节点 0 进行了备份(部件0000)。如果备份多个节点,其备份映像的时间戳也只是一个。

现在我们来看一下如何使用 BACKUP 命令,备份除了节点 0 以外的所有节点,在 DB2CLP 窗口中发出 BACKUP 命令,通过 ON ALL DBPARTITIONNUMS EXCEPT DBPARTITIONNUMS (节点列表)选项,备份除了节点 0 以外的所有的节点,节点列表中如果有多个节点,节点之间通过逗号隔开。具体如清单6所示:

C:\> db2 backup db sample on all dbpartitionnums except dbpartitionnums ( 0 ) 部件 结果 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0001 DB20000I BACKUP DATABASE命令成功完成。 备份成功。此备份映像的时间戳记是:20080129150921

命令成功完成。成功备份了节点 0 以外的所有节点,也就是成功备份了 SAMPLE 数据库节点 1,如果数据库 SAMPLE 有更多的节点,比如还有节点 2,这里备份就会包含节点 1 和 2。

当指定此选项时,BACKUP 实用程序将截断当前活动日志文件并将必要的日志扩展数据块集合复制到备份映像中。DB2 使用联机备份的备份映像还原数据库,还原完成时需要进行前滚恢复,如果前滚所需的日志文件损坏或者被删除,将不能完成前滚恢复,数据库将不可用。DB2 V9.1 (实际上是DB2 V8.2.2)在做联机备份时新增了 INCLUDE LOGS 选项,当指定此选项时,BACKUP 实用程序将截断当前活动日志文件并将必要的日志扩展数据块集合复制到备份映像中。也就是说,备份映像中包含复原和恢复数据库所需的日志文件,不再需要单独的日志文件。数据库自己决定需要哪些日志文件来保证联机备份的一致性,并放到备份映像中,这为成功恢复提供了保证,以防止所需的日志文件损坏或被误删除。但是,在 DB2 V9.5 之前,在多分区数据库环境中,BACKUP 的 INCLUDE LOGS 选项还不能使用,直到 DB2 V9.5 才修正了这一问题,可以在多分区数据库环境中,在联机备份时可以使用 INCLUDE LOGS 选项。

还原时,通过使用 RESTORE DATABASE 命令的 LOGTARGET 选项,可以指定把备份映像中的日志文件放到什么位置。如果指定了 LOGTARGET 选项,在执行 RESTORE DATABASE 命令时,DB2 将把日志文件放到指定的路径中,如果目标路径中已经存在同名的日志文件,复原操作将失败并返回一个错误。如果未指定 LOGTARGET 选项,则不会从备份映像中还原任何日志文件。如果指定了 LOGTARGET 选项,但是备份映像中没有包含任何日志文件,则在尝试复原操作时会返回一个错误。如果指定了无效或只读的路径,复原操作会报 SQL2581N 错误。在指定 LOGTARGET 选项条件下 ,复原数据库或表空间的过程中,如果不能抽取一个或多个日志文件,则复原操作失败并返回错误。还可以选择只复原保存在备份映像中的日志文件。要执行此操作,可使用 RESTORE DATABASE 命令的 LOGTARGET 选项指定 LOGS 选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。

下面我们继续在当前 DB2CLP 窗口,在系统目录所在节点,也就是节点 0 连上 SAMPLE 数据库,把 SAMPLE 数据库日志模式改成归档模式(系统目录所在节点更改后的系统参数,在其他节点会自动更改)。通过 UPDATE DB CFG 命令,把 LOGARCHMETH1 参数改成指向 C:\DB2\SAMPLE 目录,也就是把数据库改成归档模式,归档日志放到 C:\DB2\SAMPLE 中。具体如清单7所示:

C:\>set DB2NODE=0 C:\> db2 connect to sample 数据库连接信息 数据库服务器 = DB2 / NT 9.5.0 SQL 授权标识 = RHETTE 本地数据库别名 = SAMPLE C:\> db2 update db cfg using logarchmeth1 disk:c:\db2\sample\ immediate DB20000I UPDATE DATABASE CONFIGURATION 命令成功完成。 SQL1363W 未动态更改为立即修改而提交的一个或多个参数。对于这些配置参数,必须在所有 应用程序都与此数据库断开连接之后,更改才会生效。 C:\> db2 force applications all DB20000I FORCE APPLICATION命令成功完成。 DB21024I 此命令为异步的,可能未能立即生效。 C:\> db2stop 2008-01-29 16:16:58 0 0 SQL1064N DB2STOP 处理成功。 2008-01-29 16:16:59 1 0 SQL1064N DB2STOP 处理成功。 SQL1064N DB2STOP 处理成功。 C:\> db2start 2008-01-29 16:17:05 1 0 SQL1063N DB2START 处理成功。 2008-01-29 16:17:06 0 0 SQL1063N DB2START 处理成功。 SQL1063N DB2START 处理成功。 C:\> db2 backup db sample on all dbpartitionnums 部件 结果 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0000 DB20000I BACKUP DATABASE命令成功完成。 0001 DB20000I BACKUP DATABASE命令成功完成。 备份成功。此备份映像的时间戳记是:20080129161935

命令成功完成,由于 LOGARCHMETH1 参数不是即时生效的,所以我们在断开所有连接后重启实例 DB2,以保证新的参数值生效。重启成功后,对 SAMPLE 数据库做一次全备,以解除数据库的 BACKUP PENDING 状态。

下面我们继续在当前 DB2CLP 窗口中连上 SAMPLE 数据库,对 SAMPLE 数据库所有节点做一次联机备份,BACKUP 命令带 INCLUDE LOGS 选项,使数据库备份映像中包含前滚恢复时需要的日志文件。同时打开另一个 DB2CLP 窗口,在联机备份的时候对 ORG 表插入 1 条记录。这样我们就打开了两个 DB2CLP 窗口,分别成为窗口 1、2。具体如清单 9 所示:

C:\> db2 connect to sample 数据库连接信息 数据库服务器 = DB2 / NT 9.5.0 SQL 授权标识 = RHETTE 本地数据库别名 = SAMPLE C:\> db2 backup db sample on all dbpartitionnums online include logs 部件 结果 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0000 DB20000I BACKUP DATABASE命令成功完成。 0001 DB20000I BACKUP DATABASE命令成功完成。 备份成功。此备份映像的时间戳记是:20080129163323


C:\> db2 connect to sample 数据库连接信息 数据库服务器 = DB2 / NT 9.5.0 SQL 授权标识 = RHETTE 本地数据库别名 = SAMPLE C:\> db2 insert into org values ( 21 , ' PCP ' , 100 , ' Eastern ' , ' BEIJING ' ) DB20000I SQL命令成功完成。 C:\> db2 insert into org values ( 22 , ' PCP ' , 100 , ' Eastern ' , ' BEIJING ' ) DB20000I SQL命令成功完成。

命令成功完成,这样我们就对 SAMPLE 数据库的所有节点做了一次联机全备,并且在备份映像中包含备份期间的日志文件。一个单一系统视图备份中如果包含 INCLUDE LOGS,则将包含所有前滚至最小恢复时间所需要的日志。

0
相关文章