作者·2010-04-23 15:55
·

使用 IBM DB2 Universal Database 的暂挂 I/O 分割镜像

字数 10546阅读 3270评论 0赞 0

级别: 初级

Shahed QuaziIBM Canada, Toronto Laboratory

2004 年 2 月 01 日

本文介绍了 DB2 UDB 的暂挂 I/O 特性,该特性与分割镜像结合为高可用性,数据的清除以及测试环境的创建提供了多种方案。

简介

随着全球电子商务的持续发展,维护大型的数据库并确保它们的高可用性成为了真正 24x7 面向数据的业务取得成功的关键需求。IBM DB2® Universal Database™ (UDB) 的暂挂 I/O 特性为具有持续系统可用性的联机分割镜像提供了一个接口,以满足这种关键需求。本文从 DBA 的视角出发,定义了一些主要概念(分割镜像、暂挂 I/O 以及 db2inidb),并详细解释了三个在 DB2 UDB 中实施分割镜像的不同场景。但因为分割过程随厂商而不同,所以必须查阅存储器厂商提供的相应文档来在适用的系统中创建分割镜像。





回页首


主要概念

为了使用 IBM DB2 Universal Database 来实施一个分割镜像场景,首先要理解下面三个概念:

分割镜像

分割镜像是磁盘卷的一个相同而独立的副本,可附属于不同的系统,并且具有多种用途,如填充测试系统、作为数据库的热备用副本以及从主机中清除备份。分割镜像对硬件没有特殊要求。然而,我们强烈推荐用户使用智能存储设备,如 IBM Enterprise Storage Server (ESS),即 "Shark"™,以及 EMC® Symmetrix® 3330。由于使用了 FlashCopy™ 技术,ESS 能完全在内部建立准瞬时的数据副本。Symmetrix 上的 EMC TimeFinder® 软件的瞬时分割特性也能以类似的方式分割镜像。

一个数据库的分割镜像包含了数据库目录的全部内容、所有表空间容器、本地数据库目录以及活动日志目录(若没有驻留在数据库目录中)。 在使用 db2inidb 工具的 snapshot 选项创建克隆数据库时才需要用到活动日志目录。另外两个选项,standby 和 mirror 都不需要分割活动日志目录。

访问分割镜像的方法各不相同。具体方法由存储器厂商的实现来决定。用户只能用厂商提供的工具来访问分割镜像。

暂挂 I/O

进行镜像分割时,确保源数据库上没有部分的页面写入是很重要的。方法之一就是让数据库脱机。但这种需要停机的方法在真正 24x7 生产环境中是不可行的。为了在分割镜像的过程中提供持续的系统可用性,DB2 Universal Database Version 7 (FixPak 2) 引入了一个称作暂挂 I/O 的新特性,它支持联机分割镜像而无须关闭数据库。暂挂 I/O 特性通过暂挂源数据库上所有的写操作来防止部分的页面写入。虽然数据库处于写暂挂模式下,但是所有的表空间状态都转换为新的 SUSPEND_WRITE 状态,所有其他操作也都能正常执行。然而,诸如从缓冲池中刷新废页或从日志缓冲区中刷新日志记录这类需要进行磁盘 I/O 的事务则必须等待。一旦恢复数据库的写操作,这些事务将继续正常进行。可使用下面的命令来暂挂或恢复源数据库上的写操作:

db2 set write <suspend | resume> for database

db2inidb 工具

使用暂挂 I/O 特性创建的分割镜像在被初始化为可用状态之前一直处于写暂挂模式。为了初始化分割镜像,DB2 V7 FixPak 2 引入了一个新的工具,叫做 db2inidb。该工具既能执行分割镜像的映像的崩溃恢复,也能将之置于前滚暂挂状态,这由 db2inidb 命令中的选项来决定,其语法如下所示:

db2inidb < database_alias> as < snapshot |standby |mirror > [ relocate using < config_file> ]

"snapshot"选项强制分割镜像执行崩溃恢复,而"standby"或"mirror"选项都使数据库处于前滚暂挂状态。而"relocate"选项是在 FixPak 4 中引入的,它可以按照数据库名、数据库目录路径、容器路径、日志路径及数据库的实例名称来重置分割镜像。





回页首


暂挂 I/O 及 db2inidb 的普遍用法

要将暂挂 I/O 特性与 db2inidb 工具相结合来使用分割镜像数据库。融合 db2inidb 工具中三个选项(snapshot、standby 及 mirror)提供的功能及暂挂 I/O 特性,可创建数据库的一个快照,该快照可用来:

  • 通过复制当前数据来填充测试系统。
  • 创建一个备用数据库来用作热备用。
  • 当分割镜像数据库(只包含 DMS 表空间)处于前滚暂挂状态时,执行脱机备份。该功能在 Version 7 FixPak 3 中引入。若处于前滚暂挂状态,目前还不支持执行包含 SMS 表空间的数据库备份。
  • 提供一种文件系统上的快速恢复。

在进行镜像分割之前,有必要用这种暂挂 I/O 特性来确保所有 DB2 数据被一致写入磁盘(即不存在部分的页面写入)。该特性还能确保稍后使用 db2inidb 工具恢复数据库为指定状态。db2inidb 工具既能强制数据库执行崩溃恢复(指明 snapshot 选项时),又能将数据库置于前滚暂挂状态(指明 standby 或 mirror 选项时)以支持附加日志文件的处理。





回页首


实施场景

下面三个场景的实施展示了如何综合使用 db2inidb 和暂挂 I/O:

创建克隆数据库来填充测试系统

下面的场景展示了如何使用暂挂 I/O 特性在目标系统上创建克隆数据库。在该场景中,分割镜像数据库进行了一次 db2inidb 工具用 snapshot 选项初始化的崩溃恢复。您可以使用一个以这种方式产生的克隆数据库来填充测试数据库或生成报表而不影响生产系统。由于执行的是崩溃恢复,克隆数据库将会启动新的日志链,因而无法重放源数据库此后的任何日志文件。这种克隆数据库的备份可用来还原源数据库。但是在执行分割后将不能通过源数据库上产生的任何日志记录来前滚事务。因此,这仅仅是一个版本级别的复制。

步骤 1:暂挂源数据库上的 I/O

下面的命令暂挂源数据库上 I/O(DB2 客户机上的所有写操作)以确保分割数据库容器的镜像时没有部分页面的写入。请注意暂挂 I/O 将不会断开与数据库的现有连接且所有的操作都可以正常执行。但那些需要进行磁盘 I/O 的事务就必须等待。而一旦恢复 I/O 操作,这些事务就可以继续正常执行。

db2 connect to < source-database> db2 set write suspend for database

步骤 2:分割镜像

分割镜像的过程随厂商而不同。请查阅存储器厂商随机提供的文档,以了解如何创建分割镜像。虽然分割镜像的过程各不相同,但是以下内容都必须同时分割:

  • 数据库目录的全部内容
  • 所有的表空间容器
  • 本地数据库目录
  • 活动日志目录(若没有包含在数据库目录中)

步骤 3:恢复源数据库上的 I/O

下面命令恢复源数据库上的 I/O(DB2 客户机上的所有写操作),而当前的事务仍继续正常执行。

注意:用于发出 db2 set write suspend 命令的同一数据库连接也用于发出 write resume 命令。

db2 set write resume for database

步骤 4:使得分割镜像在目标机上可访问

执行镜像分割后,目标机的管理员必须使用存储器厂商提供的工具来访问分割镜像副本。我们将此过程称作“安装”。在目标系统上执行以下步骤:

  1. 创建一个与源机器上相同的数据库实例。
  2. 利用 ON 参数给数据库编制目录(系统数据库目录):
    db2 catalog database < database-name> as alias on <path> ......

  3. 将数据库目录安装到与源机器上相同的目录。
  4. 将所有容器安装到与源机器上相同的路径。若容器位于几个不同的目录下,那么要安装所有的容器目录。
  5. 如果日志文件不是位于数据库目录下,同样要将日志目录安到与源机器上相同的目录 。

步骤 5:启动目标机上的数据库实例

启动目标机上的数据库管理器。假设 DB2 注册表变量 DB2INSTANCE 被设置为与源机器中相同的实例名称,启动命令就是:

db2start

步骤 6:使克隆数据库的状态一致

下面的命令初始化一个崩溃恢复,并将回滚所有未完成的事务以保证数据库的一致性。从源数据库获取所有在分割发生时活动的日志文件很重要。但活动日志目录只能包含分割镜像的日志文件。崩溃恢复完成后,将启动新的日志链,因而数据库不能通过源数据库的日志执行前滚操作。此时,数据库将对任何操作可用。

db2inidb < target-database> as snapshot

创建备用数据库以用作热备用

下面的场景展示了如何使用暂挂 I/O 特性在目标系统上创建备用数据库。在热备用数据库的场景中,源数据库的日志文件将用于目标(备用)数据库。备用数据库在执行前滚时将一直处于前滚暂挂状态。克隆数据库(仅针对 DMS)上的 DB2 备份映像可用于恢复源数据库,因为在执行分割镜像后,它可以通过源数据库产生的日志文件来执行前滚恢复。

步骤 1:暂挂源数据库上的 I/O

下面的命令暂挂源数据库上 I/O(DB2 客户机上的所有写操作),以确保分割数据库容器的镜像时没有部分页面的写入。请注意暂挂 I/O 将不会断开与数据库的现有连接,且所有的操作都可以正常执行。但那些需要进行磁盘 I/O 的事务就必须等待。而一旦恢复 I/O 操作,这些事务就可以继续正常执行。

db2 connect to < source-database> db2 set write suspend for database

步骤 2:分割镜像

分割镜像的过程随厂商而不同。请查阅存储器厂商随机提供的文档,以了解如何创建分割镜像。虽然分割镜像的过程各不相同,但是以下内容都必须同时分割:

  • 数据库目录的全部内容
  • 所有的表空间容器
  • 本地数据库目录

这里 需要分割活动日志目录。

步骤 3:恢复源数据库上的 I/O

下面命令恢复源数据库上的 I/O(DB2 客户机上的所有写操作),而当前的事务仍继续正常执行。

注意:用于发出 db2 set write suspend 命令的同一数据库连接也用于发出 write resume 命令。

db2 set write resume for database

步骤 4:使分割镜像在目标机上可访问

执行镜像分割后,目标机的管理员必须使用存储器厂商提供的工具来访问分割镜像副本。我们将此过程称作“安装”。在目标系统上执行以下步骤:

  1. 创建一个与源机器上相同的数据库实例。
  2. 利用 ON 参数给数据库编制目录(系统数据库目录):
    db2 catalog database < database-name> as alias on <path> ......

  3. 将数据库目录安装到与源机器上相同的目录。
  4. 将所有容器安装到与源机器上相同的路径。若容器位于几个不同的目录下,那么要安装所有的容器目录。
  5. 如果日志文件不是位于数据库目录下,要将日志目录安装到与源机器上相同的目录。

步骤 5:启动目标机上的数据库实例

启动目标机上的数据库管理器。假设 DB2 注册表变量 DB2INSTANCE 被设置为与源机器中相同的实例名称 ,启动命令就是:

db2start

步骤 6:将数据库置于前滚模式

下面的命令将分割镜像数据库置于“前滚暂挂”状态。执行崩溃恢复之前,数据库一直处于不一致状态。

db2inidb < target database> as standby

步骤 7:连续复制日志文件并前滚

将数据库置于"前滚暂挂"状态后,可使用源数据库的日志文件前滚目标数据库。您可以用用户出口程序来自动连续归档非活动的日志文件。但如果使用了用户出口,就必须给源数据库及目标数据库配置相同的用户出口程序。

db2 rollforward db < target-database> to end of logs

步骤 8:激活备用数据库

如果源数据库发生崩溃,可以为用户访问激活目标机上的备用数据库。为了激活备用数据库,您必须解除备用数据库的前滚暂挂状态。通过指明 rollforward 命令的“stop”或“complete”选项可将数据库置于一致状态。备用数据库处于一致状态后,用户就可以转向它继续工作了。但用户应用程序还必须重新连接该备用数据库。备用数据库上产生的日志文件将不能用于源数据库。

当目标数据库处于前滚暂挂状态时,若只含 DMS 表空间,就可以进行脱机备份。该功能是在 Version 7 FixPak 3 中引入的。

db2 rollforward db < target-database> stop

创建镜像数据库进行快速镜像文件恢复

下面的场景展示了如何使用暂挂 I/O 特性在目标系统上创建镜像数据库。其目的是用分割镜像数据库来还原源数据库并前滚源数据库的日志文件。值得注意的是,您在源数据库上的复制完成前,分割镜像必须保持 SUSPEND_WRITE 状态。

步骤 1:暂挂源数据库上的 I/O

下面的命令暂挂源数据库上的 I/O(DB2 客户机上的所有写操作),以确保分割数据库容器的镜像时没有部分页面的写入。请注意暂挂 I/O 将不会断开与数据库的现有连接,且所有的操作都可以正常执行。但那些需要进行磁盘 I/O 的事务就必须等待。而一旦恢复 I/O 操作,这些事务就可以继续正常执行。

db2 connect to < source-database> db2 set write suspend for database

步骤 2:分割镜像

分割镜像的过程随厂商而不同。请查阅存储器厂商随机提供的文档,以了解如何创建分割镜像。虽然分割镜像的过程各不相同,但是以下内容都必须同时分割:

  • 数据库目录的全部内容
  • 所有的表空间容器
  • 本地数据库目录

这里 需要分割活动日志目录。

步骤 3:恢复源数据库上的 I/O

下面命令恢复源数据库上的 I/O(DB2 客户机上的所有写操作),而当前的事务仍继续正常执行。

注意:用于发出 db2 set write suspend 命令的同一数据库连接也用于发出 write resume 命令。

db2 set write resume for database

发生磁盘故障后恢复分割镜像的映像

此场景中不涉及“目标”数据库。该场景是用镜像副本将“源”数据库从磁盘故障中恢复。不能用 DB2 备份工具来备份分割镜像,但可以由用操作系统的工具来完成。如果源数据库发生崩溃,可以通过复制分割镜像的映像来恢复。

步骤 1:停止源数据库实例

使用下面的 DB2 命令来停止数据库实例:

db2stop

步骤 2:恢复分割镜像的映像

使用存储器厂商提供的工具复制源数据库上分割镜像数据库的数据文件。这里最好不要使用操作系统的工具,因为操作系统不了解分割映像。

步骤 3:启动源数据库实例

恢复了分割镜像的映像后启动源数据库实例。

db2start

步骤 4:初始化源数据库上的镜像副本

这一步用数据库的镜像副本替换源数据库并将其置于前滚暂挂状态。只有在源数据库前滚至日志末尾后,才算完成崩溃恢复且数据库才处于一致状态。

db2inidb < database> as mirror

步骤 5:前滚至日志末尾

必须使用源数据库的日志文件来前滚数据库:

db2 rollforward database < database> to end of logs and complete





回页首


处理分区环境

在多个分区的环境中,每个分区都看作一个独立的数据库。因此,在进行镜像分割时,您必须暂挂每一个分区的 I/O。稍后,您同样也必须恢复这些 I/O。对于 db2inidb 工具也一样,在使用数据库之前,必须在每个镜像分区上运行该工具。

因为将每个分区看作一个独立的数据库,所以每个节点的暂挂操作也都是独立的。因此,您不必使用 db2_all 来暂挂所有节点的 I/O。然而,每个节点被依次挂起后,您最后还 必须暂挂目录节点。在有多个分区的数据库中,暂挂非目录节点的 I/O 都需要与目录节点建立连接以获取授权。因此如果已暂挂目录节点,该连接将被挂起。

建议:在有多个分区的数据库中暂挂 I/O 时,应先对所有节点分别执行“set write suspend”,最后暂挂目录节点。这样就可以保证暂挂每个 I/O 而不影响其他节点。

db2inidb 工具不需要连接数据库。因此,您可以在每个分割镜像上独立地运行 db2inidb 或通过 db2_all 在所有分区上同时运行。惟一要求就是启动数据库管理器。

例子:假设 AIX 上的多分区数据库有 4 个数据库分区(0,1,2,3),其中 0 为目录分区,则应该按如下命令来暂挂 I/O:

export DBNODE=1; db2 terminate; db2 "connect to < database-alias>"; db2 "set write suspend for database" export DBNODE=2; db2 terminate; db2 "connect to < database-alias>"; db2 "set write suspend for database" export DBNODE=3; db2 terminate; db2 "connect to < database-alias>"; db2 "set write suspend for database" export DBNODE=0; db2 terminate; db2 "connect to < database-alias>"; db2 "set write suspend for database"

例子:在所有数据库分区上同时运行 db2inidb:

db2_all "db2inidb < target-database> as < options>"





回页首


在同一台机器上重置分割镜像

因为分割镜像数据库依赖于数据库目录路径、容器路径以及日志目录路径,所以除非重新配置这些路径信息,否则就不能在同一台机器上分割数据库。若要分割数据库,必须显式地重新设置数据库目录、容器及日志目录路径。只要您将它们移至同一台机器上的一个新目录下,数据库在启动时就不会找到它们。启动目标系统时也会认为 DB2 实例的设置与源机器相同,认为实例所有者的用户 ID 及组 ID 都相同。

DB2 UDB Version 7 的 FixPak 4 为 db2inidb 提供了一个新选项称作“relocate”。relocate 选项允许您改变数据库名、数据库目录路径、容器路径、日志路径以及数据库上的实例名。利用这一新选项,您可以在同一系统中分割镜像。

要使用 relocate 选项,需要提供一个输入文本文件,其中包含重置分割镜像数据库所需的配置信息。这是因为 relocate 选项在后台调用 db2relocatedb 命令,关于配置文件选项的细节,请查阅 Fixpak 4 的 版本信息 中 "db2relocatedb(new command)" 小节。

简述配置文件的格式如下:

DB_NAME=oldName,newName
DB_PATH= oldPath,newPath
INSTANCE= oldInst,newInst
NODENUM= nodeNumber
LOG_DIR= oldDirPath,newDirPath
CONT_PATH= oldContPath1,newContPath1
CONT_PATH= oldContPath2,newContPath2

使用 relocate 的 db2inidb 命令 的语法如下所示:

db2inidb < target-database> as < options> relocate using < config-file>





回页首


结束语

DB2 Universal Database 的暂挂 I/O 特性与各种智能存储设备提供的分割镜像的功能相结合,可以通过提供以下功能来使您实现大型的真正 24x7 任务关键型的数据库:

  • “零”停机时间的持续系统可用性
  • 大型数据库的快速备份及灾难恢复方法
  • 从生产数据库分离备份的能力
  • 最大程度降低对生产数据库的影响
  • 通过当前数据的副本快速填充测试数据库





回页首


参考资料

有关 DB2 中暂挂 I/O 特性的更多信息,请查阅:





回页首


致谢

特别感谢 Dale McInnis 和 Jason Racicot 对本文进行了技术审查。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广