DB2 9 数据库管理(731考试)认证指南,第 7 部分: 高可用性:镜像分割与高可用性灾难恢复
简介: 本教程是 共分 7 部分的系列教程 中的最后一篇教程,本系列能帮助您备考 DB2® 9 for Linux®, UNIX®, and Windows™ Database Administration(考试 731)。本教程主要谈论两个高级高可用性话题:分割镜像和高可用性灾难恢复(HADR)。通过分割镜像,可以使用磁盘备份恢复数据库。而 HADR 则提供了故障转移(failover)支持,这类似于 HACMP 和 Microsoft™ Cluster Server 提供的故障转移功能。
发布日期: 2006 年 8 月 17 日
级别: 中级
访问情况 : 7223 次浏览
评论: 0 (添加评论)
通过在线分割镜像和暂挂 I/O 支持获得高可用性
在备份和恢复教程中您了解到,在线备份使用户在对数据库进行备份的同时维护与数据库的连接。
虽然这符合高可用性系统的标准,但是对于大型数据库而言,这个过程可能比较费时间。而另一种备份恢复策略则比在线备份更快一些,这种策略就是分割镜像。
如果使用分割镜像,则不需要使用 DB2 备份实用程序对数据库进行备份,只需为数据库目录做一份磁盘拷贝,然后在需要的时候恢复这个磁盘拷贝。相对于传统的数据库备份恢复方法,这个过程有以下优点:
- 省去了主机器上的备份操作的开销,如果数据库比较大,那么这种备份操作是很费时间的。
- 使用分割镜像的恢复过程比使用恢复实用程序更快。
分割一个镜像 的意思是通过将数据写到硬盘上,为源数据库创建一个 “瞬时” 拷贝。必要时,可以使用这个磁盘拷贝来克隆一个新的但是是相同的数据库,或者使用它来作为恢复原始数据库的一个备份拷贝。
您所选择的分割镜像的方法不受 DB2 的控制。只要您愿意,就可以为数据库目录做一个文件系统拷贝。建议使用任何智能存储设备,例如 IBM Enterprise Storage Server (ESS),也称 Shark 和 EMC Symmetrix 3330。通过使用 FlashCopy 技术,ESS 可以完全独立地为数据建立近乎瞬时的拷贝。Symmetrix 上的 EMC TimeFinder 软件的这种瞬时分割特性还可以用类似的方式分割一个镜像拷贝。
一个数据库的分割镜像包括数据库目录中的所有内容、所有表空间容器和本地数据库目录。取决于您想如何使用分割镜像,必要时还可以在分割镜像中包括活动日志目录。后面有关于这个话题的更多介绍。
在分割一个镜像时,应确保数据库上没有写页操作。DB2 暂挂 I/O 支持让您可以在不必关闭数据库的情况下执行分割镜像操作。其思想是在分割镜像之前,使数据库处于 write suspend 模式,在完成分割之后,再恢复正常的 I/O 活动。
当数据库处在 write suspended 模式时,其中的所有表空间都被置于 SUSPEND_WRITE 状态。所有操作都继续正常进行。但是,有些事务如果需要进行磁盘 I/O,那么可能需要等待。一旦数据库上的写操作得到恢复,这些事务便可以继续正常执行。
下面的命令用于暂挂和恢复数据库上的写操作:
要暂挂写操作,可以发出:
CONNECT TO database-alias SET WRITE SUSPEND FOR DATABASE |
要恢复写操作,可以发出:
SET WRITE RESUME FOR DATABASE |
现在您有了源数据库的一个镜像,它基本上就是一个磁盘拷贝。但是您不能在这个磁盘拷贝上使用 RESTORE DATABASE
命令来恢复数据库,因为这不是 DB2 数据库备份。它只是数据库文件的一个磁盘拷贝。要将这个磁盘拷贝初始化到一个可用的 DB2 数据库中,可以使用 db2inidb 命令:
DB2INIDB database-alias AS {SNAPSHOT | STANDBY | MIRROR} [RELOCATE USING config_file] |
可以用三种不同的方式初始化镜像:
- Snapshot:创建源数据库的一个克隆。
- Standby:创建一个备用数据库。
- Mirror:恢复原始的源数据库。
不管是 Snapshot 还是 Standby 选项,都是使用镜像创建一个新的、但是与源数据库相同的数据库。因此,分割镜像数据库与源数据库不能在同一个系统上,因为它具有与源数据库相同的结构,并且使用与源数据库相同的实例名。如果分割镜像数据库必须与源数据库在同一个系统上,那么需要在发出 db2inidb
命令时指定 RELOCATE USING
配置文件选项。
relocate 配置文件(文本文件)的格式如下。使用这个配置文件来重新安置数据库目录结构:
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 |
这个选项在 I/O 被暂挂时创建源数据库的一个瞬时拷贝。因此被称作 snapshot。在初始化过程中,分割镜像数据库先通过一次紧急事故恢复。在紧急事故恢复完成之后,数据库便可以立即使用了。在分割镜像时任何未提交的工作都被回滚。
使用 db2inidb snapshot 选项创建克隆数据库的步骤是:
- 暂挂源数据库上的 I/O:
CONNECT TO source-database-alias SET WRITE SUSPEND FOR DATABASE
- 分割镜像。为了分割镜像,可以使用文件系统复制方法或前面提到的任何供应商产品。如果选择使用一种供应商产品,那么应参阅适用于您的设备的文档,了解如何创建分割镜像。无论分割镜像的过程如何不同,下面这些都是需要同时分割镜像的:
- 数据库目录的整个内容。
- 所有表空间容器。
- 本地数据库目录。
- 如果活动日志目录不在数据库目录中,则还包括活动日志目录。
上述所有信息都存储在系统视图
SYSADM.DBPATHS
中。通过运行select * from sysadm.dbpaths
语句可以获得这些信息。还可以从 Control Center 中查看该视图的内容。下图展示了这个视图的示例内容:
图 2. SYSADM.DBPATHS 视图
SYSADM.DBPATHS 视图提供以下信息:
- 数据库目录是 C:\DB2\NODE0000\SQL00001。
- 表空间容器路径是 c:\db2\test1\userspace3 and c:\db2\test1\userspace2。
- 本地数据库目录是 C:\DB2\NODE0000\SQLDBDIR (图中没有显示,但是本地数据库目录是 SQLDBDIR 目录,与数据库目录在同一级)。
- 活动日志目录是 C:\DB2\NODE0000\SQL00001\SQLOGDIR。
所有这些目录都必须被分割镜像。
- 恢复源数据库上的 I/O。发出以下命令来恢复源数据库上的 I/O 活动。当发出以下命令时,使用与步骤 1 相同的连接会话:
SET WRITE RESUME FOR DATABASE
- 使分割镜像可以被访问:
- 在目标机器上,创建与源机器上的 DB2 实例相同的 DB2 实例。
- 将步骤 2 中获得的分割镜像恢复到与在源机器上位置相同的路径中。如果分割镜像在一个网络驱动器中,那么将网络驱动器挂载到目标机器。
- 运行以下命令编目目标机器上的数据库:
CATALOG DATABASE database-name AS database-alias ON path
其中:
database-alias 必须与源数据库的别名匹配。
path 必须与源数据库的数据库路径匹配(使用
LIST DB DIRECTORY
命令显示数据库路径,或检查 SYSADM.DBPATHS 视图中的 DB_STORAGE_PATH 字段,如图 2 所示)。
- 将分割镜像数据库初始化为一个克隆数据库
- 使用 db2start 命令启动目标机器上的实例。
- 使用 snapshot 选项初始化分割镜像数据库:
DB2INIDB database-alias AS SNAPSHOT
前面的 db2inidb 命令开始一个紧急事故恢复,这个过程将回滚分割镜像时所有未提交的事务,从而使数据库一致。重要的是要有在分割镜像时源机器的活动日志文件。活动日志目录必须不包含不属于分割镜像的任何日志文件。紧急事故恢复完成之后,数据库就可以使用了。
图 3 总结了使用 snapshot 选项分割镜像的过程:
图 3. 使用 snapshot 选项分割镜像
db2inidb standby 选项创建源数据库(也称主数据库)的一个备用数据库。
当一个分割镜像被初始化为备用数据库时,它被立即置于 rollforward pending 状态。主数据库上一出现可用的不活动日志文件,便立即应用这些日志文件,通过不断地应用来自主数据库的日志文件,使备用数据库跟上主数据库的变化。这里使用前面讨论的日志传送方法使日志可以被备用数据库使用。如果主数据库上出现故障,则使用备用数据库接管主数据库的角色。
使用 db2inidb standby 选项创建备用数据库的步骤如下:
- 暂挂主数据库上的 I/O。遵循与 snapshot 场景中相同的步骤来暂挂主数据库上的 I/O。
- 分割镜像。使用适当的方法为主数据库建立分割镜像。分割镜像必须包含:
- 数据库目录中的所有内容。
- 所有表空间容器。
- 本地数据库目录。
在这个场景中,您不需要分割活动日志目录。后面会讨论如何处理日志。
- 恢复源数据库上的 I/O。遵循与 snapshot 场景中相同的步骤来恢复主数据库上的 I/O。
- 使分割镜像可以被访问。遵循与 snapshot 场景中相同的步骤来使分割镜像可以被访问。
- 将分割镜像数据库初始化为备用数据库。
下面的命令初始化数据库,并使之处于 rollforward pending 状态,以便应用来自主数据库的日志。
DB2INIDB database-alias AS STANDBY
- 不断使用
ROLLFORWARD DATABASE
命令,将主数据库归档的日志应用到备用数据库。为了使备用数据库尽可能跟上变化,一旦主数据库出现新的不活动日志文件(已经被归档的日志),便立即应用它们,这样不断地应用日志文件。为此,可以在备用数据库上发出ROLLFORWARD DATABASE
命令,发出该命令时不必使用 STOP 或 COMPLETE 选项。为了使日志文件可以被备用数据库访问,使用 设置日志传送 中讨论的日志传送方法。
使用
ROLLFORWARD DATABASE
命令不断地将归档日志应用到备用数据库:ROLLFORWARD DB database-alias TO END OF LOGS
- 使备用数据库上线。
当主数据库上出现故障时,您希望使备用数据库切换至上线状态,从而接管主数据库的角色。为了使备用数据库上线,可以执行以下步骤:
- 使活动日志路径可以被备用数据库访问。在步骤 6 中,您只是将主数据库产生的归档日志应用到备用数据库。您没有应用活动日志。当做好使备用数据库上线的准备时,需要从主数据库获取活动日志,并将它们应用到备用数据库上。这个获取过程可以手动完成,也就是说,将活动日志从主数据库复制到备用服务器的 logpath 目录。
- 将数据库前滚到日志的最后并停止:
ROLLFORWARD DB database-alias TO END OF LOGS AND STOP
当前滚过程完成之后,数据库便可以使用了。
下图总结了使用 standby 选项分割镜像的过程:
图 4. 使用 standby 选项分割镜像
使用 db2inidb mirror 选项创建源数据库的备份镜像
db2inidb 命令的 mirror 选项用于创建源数据库的一个快速镜像文件备份。分割镜像可用于在需要时恢复源数据库。因此可以直接使用这个过程,而不需要在源数据库上执行备份和恢复操作。
使用 db2inidb mirror 选项创建源数据库的备份镜像的步骤如下:
- 暂挂源数据库上的 I/O。遵循与 snapshot 场景中相同的步骤来暂挂源数据库上的 I/O。
- 分割镜像。使用适当的方法为源数据库分割镜像。分割镜像必须包括:
- 数据库目录的所有内容。
- 所有表空间容器。
- 本地数据库目录。
在这个场景中,不需要分割活动日志目录。
- 恢复源数据库上的 I/O。遵循与 snapshot 场景中相同的步骤来恢复源数据库上的 I/O。
- 使用分割镜像恢复源数据库。在这个场景中没有 “目标” 数据库。mirror 选项的作用是在需要的时候使用镜像拷贝来恢复源数据库。
- 使用 db2stop 命令停止实例。
- 将分割镜像数据库的数据文件复制到源数据库。
- 使用 db2start 命令启动实例。
- 发出以下命令初始化分割镜像数据库。该命令用分割镜像取代源数据库,并将它置于 rollforward pending 状态,以便再次应用日志。
DB2INIDB database-alias AS MIRROR
- 将数据库前滚到日志的最后。当前滚过程完成之后,数据库就可以使用了。
ROLLFORWARD DB database-alias TO END OF LOGS AND STOP
图 5 总结了使用 mirror 选项的分割镜像过程:
图 5. 使用 mirror 选项分割镜像
在分区数据库环境中,在分割镜像过程中要暂挂每个分区上的 I/O。之后再恢复每个分区上的 I/O。这同样适用于 db2inidb 工具,该工具必须在每个被分割镜像的分区上运行,以初始化数据库。
由于每个分区是独立对待的,因此可以单独暂挂某个分区,而不影响其他分区的使用。这意味着不需要发出 db2_all
来暂挂所有分区的 I/O。如果每个分区都要单独暂挂,那么应该最后暂挂编目分区。这是因为要暂挂任何非编目节点上的 I/O,都必须要有到编目分区的连接,以得到授权。如果编目分区被暂挂,那么连接尝试将挂起。
db2inidb 工具不要求到数据库的任何连接。因此,可以在每个分割镜像上独立地运行该工具,或者使用 db2_all
在所有分区上同时运行该工具。惟一的要求是要启动数据库管理器。
假设一个数据库包含三个分区,分别为分区 0、1 和 2,其中分区 0 为编目分区,那么,为了暂挂该数据库上的写操作,可以发出以下命令:
export DB2NODE=1 db2 terminate db2 connect to database-alias db2 set write suspend for database export DB2NODE=2 db2 terminate db2 connect to database-alias db2 set write suspend for database export DB2NODE=0 db2 terminate db2 connect to database-alias db2 set write suspend for database |
为了在所有分区上同时运行 db2inidb,可以发出:
db2_all "db2inidb database-alias as db2inidb-option" |
DBT1008N Database "TEST" is not a split mirror image.
[db2inst1@oc5603811686 test]$ db2 ? dbt1008n
DBT1008N Database "<database-name>" is not a split mirror image.
Explanation:
An attempt was made to use the DB2INIDB tool on a database that is not a
split mirror image.
A split mirror image is a mirrored copy of a database that is taken
while I/O writes are suspended. I/O writes can be suspended using the
following command while being connected to the database:
SET WRITE SUSPEND FOR DATABASE
Once the split mirror image has been taken, I/O writes on the primary
database can be resumed with the following command:
SET WRITE RESUME FOR DATABASE
Before the split mirror image can be used, the DB2INIDB tool must be run
in order to remove its suspended state and initialize it by either
performing crash recovery or placing it in rollforward pending state.
User response:
Resubmit the command using a split mirror image database.
******************************************************************************************************************