杨文云
作者杨文云·2019-07-29 11:15
数据库管理员·GBS

IBM DB2 Universal Database I/O 分割镜像

字数 10272阅读 8652评论 0赞 3

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

简介

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

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

主要概念

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

· 分割镜像
· 暂挂 I/O
· db2inidb 工具

分割镜像

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

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

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

暂挂 I/O

进行镜像分割时,确保源数据库上没有部分的页面写入是很重要的。方法之一就是让数据库脱机。但这种需要停机的方法在真正 24x7 生产环境中是不可行的。为了在分割镜像的过程中提供持续的系统可用性, DB2 Universal Database 引入了一个称作暂挂 I/O 的新特性,它支持联机分割镜像而无须关闭数据库。暂挂 I/O 特性通过暂挂源数据库上所有

的写操作来防止部分的页面写入。虽然数据库处于写暂挂模式下,但是所有的表空间状态都转换为新的 SUSPEND_WRITE 状态,所有其他操作也都能正常执行。然而,诸如从缓冲池中刷新废页或从日志缓冲区中刷新日志记录这类需要进行磁盘 I/O 的事务则必须等待。一旦恢复数据库的写操作,这些事务将继续正常进行。可使用下面的命令来暂挂或恢复源数据库上的写操作:
db2 set write for database

db2inidb 工具

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

db2inidb <

database_alias > as < snapshot |standby |mirror > [ relocate using <

config_file > ]

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

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

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

· 通过复制当前数据来填充测试系统。

· 创建一个备用数据库来用作热备用。

· 当分割镜像数据库(只包含 DMS 表空间) 处于前滚暂挂状态时,执行脱机备份。若处于前滚暂挂状态,目前还不支持执行包含 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 操作,这些事务就可以继续正常执行。

CONNECT TO source-database-alias SET WRITE SUSPEND FOR DATABASE
db2 connect t

步骤 2 :分割镜像

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

o 数据库目录的整个内容。

o 所有表空间容器。

o 本地数据库目录。

o 如果活动日志目录不在数据库目录中,则还包括活动日志目录。

· 上述所有信息都存储在系统视图 SYSADM.DBPATHS 中。通过运行 select * from sysadm.dbpaths 语句可以获得这些信息。还可以从 Control Center 中查看该视图 的内容。下图展示了这个视图的示例内容:
图 2. SYSADM.DBPATHS 视图

SYSADM.DBPATHS 视图提供以下信息:

o 数据库目录是 C:\DB2\NODE0000\SQL00001。
o 表空间容器路径是 c:\db2\test1\userspace3 and c:\db2\test1\userspace2。
o 本地数据库目录是 C:\DB2\NODE0000\SQLDBDIR ( 图中没有显示,但是本地数据库目录是 SQLDBDIR 目录,与数据库目录在同一级 )。
o 活动日志目录是 C:\DB2\NODE0000\SQL00001\SQLOGDIR。

所有这些目录都必须被分割镜像。

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

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

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

命令。

db2 set write resume for database

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

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

· 创建一个与源机器上相同的数据库实例。
· 利用 ON 参数给数据库编制目录(系统数据库目录):
CATALOG DATABASE database-name_AS _database-alias_ON _path ......
·
· 将数据库目录安装到与源机器上相同的目录。
· 将所有容器安装到与源机器上相同的路径。若容器位于几个不同的目录下,那么 要安装所有的容器目录。
· 如果日志文件不是位于数据库目录下,同样要将日志目录安到与源机器上相同的 目录 。 其中: database-alias 必须与源数据库的别名匹配。 path 必须与源数据库的数据库路径匹配(使用 LIST DB DIRECTORY 命令显示数据库路径,或检查SYSADM.DBPATHS 视图中的 DB_STORAGE_PATH 字段,如图 2 所示 )。

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

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

db2start

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

下面的命令初始化一个崩溃恢复,并将回滚所有未完成的事务以保证数据库的一致性。从源数据库获取所有在分割发生时活动的日志文件很重要。但活动日志目录只能包含分

割镜像的日志文件。崩溃恢复完成后,将启动新的日志链,因而数据库不能通过源数据库的日志执行前滚操作。此时,数据库将对任何操作可用。

DB2INIDB _database-alias_AS SNAPSHOT

前面的 db2inidb 命令开始一个紧急事故恢复,这个过程将回滚分割镜像时所有未提交的事 务,从而使数据库一致。重要的是要有在分割镜像时源机器的活动日志文件。活动日志目录 必须不包含不属于分割镜像的任何日志文件。紧急事故恢复完成之后,数据库就可以使用 了。

图 3 总结了使用 snapshot 选项分割镜像的过程:
图 3. 使用 snapshot 选项分割镜像**

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

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

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

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

db2 connect to source-database name 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 :使分割镜像在目标机上可访问

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

· 创建一个与源机器上相同的数据库实例。
· 利用 ON 参数给数据库编制目录(系统数据库目录):
db2 catalog database < database-name > as alias on ......
·
· 将数据库目录安装到与源机器上相同的目录。
· 将所有容器安装到与源机器上相同的路径。若容器位于几个不同的目录下,那么 要安装所有的容器目录。
· 如果日志文件不是位于数据库目录下,要将日志目录安装到与源机器上相同的目 录。

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

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

db2start

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

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

db2inidb target database as standby

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

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

使用 ROLLFORWARD DATABASE 命令不断地将归档日志应用到备用数据库:

db2 rollforward db target-database to end of logs

步骤 8 :激活备用数据库

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

1.使活动日志路径可以被备用数据库访问。在步骤 7 中,您只是将主数据库产 生的归档日志应用到备用数据库。您没有应用活动日志。当做好使备用数据库 上线的准备时,需要从主数据库获取活动日志,并将它们应用到备用数据库 上。这个获取过程可以手动完成,也就是说,将活动日志从主数据库复制到备 用服务器的 logpath 目录。

2.将数据库前滚到日志的最后并停止:

当目标数据库处于前滚暂挂状态时,若只含 DMS 表空间,就可以进行脱机备份。

ROLLFORWARD DB _database-alias_TO END OF LOGS AND STOP

当前滚过程完成之后,数据库便可以使用了。

下图总结了使用 standby 选项分割镜像的过程:

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

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

db2inidb 命令的 mirror 选项用于创建源数据库的一个快速镜像文件备份。分割镜像可用于在需要时恢复源数据库。因此可以直接使用这个过程,而不需要在源数据库上执行备份和恢复操作。

使用 db2inidb mirror 选项创建源数据库的备份镜像的步骤如下:

步骤 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

遵循与 snapshot 场景中相同的步骤来恢复源数据库上的I/O。

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

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

命令。

db2 set write resume for database

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

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

如果源数据库发生崩溃,可以通过复制分割镜像的映像来恢复。 恢复源数据库上的 I/O。遵循与 snapshot 场景中相同的步骤来恢复源数据库上的 I/O

使用分割镜像恢复源数据库,在这个场景中没有 “目标” 数据库。mirror 选项的作用是在需要的时候使用镜像拷贝来恢复源数据库。

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

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

db2stop

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

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

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

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

db2start

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

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

镜像数据库。该命令用分割镜像取代源数据库,并将它置于 rollforward pending 状态,以便再次应用日志

DB2INIDB _database-alias_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 _database-alias_as _db2inidb-option_"

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

因为分割镜像数据库依赖于数据库目录路径、容器路径以及日志目录路径,所以除非重新配置这些路径信息,否则就不能在同一台机器上分割数据库。若要分割数据库,必须

显式地重新设置数据库目录、容器及日志目录路径。只要您将它们移至同一台机器上的一个新目录下,数据库在启动时就不会找到它们。启动目标系统时也会认为 DB2 实例的设置与源机器相同,认为实例所有者的用户 ID 及组 ID 都相同。

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

要使用 relocate 选项,需要提供一个输入文本文件,其中包含重置分割镜像数据库所需 的配置信息。这是因为 relocate 选项在后台调用 db2relocatedb 命令,关于配置文件选项 的细节,请查阅 DB2 reference 中 "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 {SNAPSHOT | STANDBY | MIRROR} relocate using config-file >

镜像分割注意一定要是设置了 SET WRITE SUSPEND FOR DATABASE

然后进行拷贝的才算是 a split mirror image

拷贝之再改回去就好了 SET WRITE RESUME FOR DATABASE

参考文档

https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.admin.ha.doc/doc

/t0006411.html

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

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广