Windows 7 SP1 64bit 实施单机环境下DB2 V9.5.7 HADR实现实例级故障切换

来源:互联网 发布:windows xp home密钥 编辑:程序博客网 时间:2024/04/28 08:55

 

High Availability Disaster Recovery (HADR)是数据库级别的高可用性数据复制机制,HADR 实现是基于 HDR 的 Informix 实现的(是数据库中高可用性灾难恢复相对比较成熟的功能)。本质上讲,HADR 是一种日志传送功能(DB2 UDB 现在支持这种功能),但它传送的不是固化的磁盘上的日志,而是日志缓冲区中的日志。这种方法提供了充分的粒度来满足解决方案的高可用性需求。HADR 复制发生在数据库层。 

    在生产环境下,HADR环境需要两台数据库服务器:主数据库服务器(primary)和备用数据库服务器(standby)。当主数据库中发生事务操作 时,会同时将日志文件通过TCP/IP协议传送到备用数据库服务器,然后备用数据库对接受到的日志文件进行重放(Replay),从而保持与主数据库的一 致性。当主数据库发生故障时,备用数据库服务器可以接管主数据库服务器的事务处理。此时,备用数据库服务器作为新的主数据库服务器进行数据库的读写操作, 而客户端应用程序的数据库连接可以通过自动客户端重新路由(Automatic Client Reroute)机制转移到新的主服务器。当原来的主数据库服务器被修复后,又可以作为新的备用数据库服务器加入HADR。通过这种机制,DB2 UDB实现了数据库的灾难恢复和高可用性,最大限度的避免了数据丢失。

 

 

实施过程及命令行步骤:

 

一、清理DB2环境,避免傻逼问题出现

C:/IBM/SQLLIB/BIN>db2ilist

DB2

BAK

 

C:/IBM/SQLLIB/BIN>db2idrop bak

DB20000I  DB2IDROP 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2ilist

DB2

 

C:/IBM/SQLLIB/BIN>cd ..

 

C:/IBM/SQLLIB>dir

 驱动器 中的卷没有标签。

 卷的序列号是 C470-0EBA

 

 C:/IBM/SQLLIB 的目录

 

2011/02/22  20:59    <DIR>          .

2011/02/22  20:59    <DIR>          ..

2011/02/22  20:59    <DIR>          adsm

2011/06/16  17:19    <DIR>          BIN

2011/02/22  20:59    <DIR>          bnd

2011/02/23  09:27    <DIR>          cfg

2011/02/22  20:11    <DIR>          clidriver

2011/02/22  20:11    <DIR>          conv

2011/03/31  14:05    <DIR>          dasfcn

2007/10/02  23:11               241 db2cli.opt

2011/02/22  20:10    <DIR>          doc

2011/02/23  09:27    <DIR>          FUNCTION

2011/02/22  20:11    <DIR>          help

2011/02/22  20:59    <DIR>          include

2011/02/22  20:12    <DIR>          infopop

2010/11/30  15:28           787,408 INFOPOPS_JHELP_CN.exe

2010/11/30  15:29         1,700,448 INFOPOPS_WHELP_CN.exe

2011/02/22  20:59    <DIR>          java

2011/02/22  20:59    <DIR>          lib

2011/02/27  02:25    <DIR>          license

2011/02/22  20:11    <DIR>          map

2011/02/22  20:59    <DIR>          MISC

2011/02/22  20:11    <DIR>          msg

2011/02/22  20:59    <DIR>          Readme

2011/02/22  20:59    <DIR>          samples

2011/02/22  20:10    <DIR>          security

2011/02/27  02:25    <DIR>          tivready

2011/03/19  14:21    <DIR>          TOOLS

               3 个文件      2,488,097 字节

              25 个目录 75,457,306,624 可用字节

 

C:/IBM/SQLLIB>db2icrt db2inst1

DB20000I  DB2ICRT 命令成功完成。

 

C:/IBM/SQLLIB>db2icrt db2inst2

DB20000I  DB2ICRT 命令成功完成。

 

C:/IBM/SQLLIB>cd bin

 

C:/IBM/SQLLIB/BIN>hadr.cmd

"语法: handson.cmd <SL510>"

"运行错误,请检查脚本"

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

C:/IBM/SQLLIB/BIN>db2 drop db sample

SQL1031N  在指示的文件系统中找不到数据库目录。  SQLSTATE=58031

 

C:/IBM/SQLLIB/BIN>db2stop

SQL1064N  DB2STOP 处理成功。

 

C:/IBM/SQLLIB/BIN>db2idrop db2inst1

DB20000I  DB2IDROP 命令成功完成。

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst2

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

C:/IBM/SQLLIB/BIN>db2 drop db sample

SQL1031N  在指示的文件系统中找不到数据库目录。  SQLSTATE=58031

 

C:/IBM/SQLLIB/BIN>db2stop

SQL1064N  DB2STOP 处理成功。

 

C:/IBM/SQLLIB/BIN>db2idrop db2inst2

DB20000I  DB2IDROP 命令成功完成。

 

 

 

二、创建2个实例,db2inst1作为主,db2inst2作为副。库以sample库为例

C:/IBM/SQLLIB/BIN>db2icrt db2inst1

DB20000I  DB2ICRT 命令成功完成。

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

C:/IBM/SQLLIB/BIN>db2 update dbm cfg using svcename 33333

DB20000I  UPDATE DATABASE MANAGER CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2set db2comm=tcpip

 

C:/IBM/SQLLIB/BIN>db2 terminate

DB20000I  TERMINATE 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2stop

SQL1064N  DB2STOP 处理成功。

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

C:/IBM/SQLLIB/BIN>db2sampl.exe

 

  Creating database "SAMPLE"...

  Connecting to database "SAMPLE"...

  Creating tables and data in schema "JAMIN"...

  Creating tables with XML columns and XML data in schema "JAMIN"...

 

  'db2sampl' processing complete.

 

 

三、将主库设置为归档模式,这是必须的。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using LOGRETAIN RECOVERY

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 backup db sample to c:/temp

 

备份成功。此备份映像的时间戳记是:20110616173329

 

 

C:/IBM/SQLLIB/BIN>db2icrt db2inst2

DB20000I  DB2ICRT 命令成功完成。

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst2

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

C:/IBM/SQLLIB/BIN>db2 update dbm cfg using svcename 44444

DB20000I  UPDATE DATABASE MANAGER CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2set db2comm=tcpip

 

C:/IBM/SQLLIB/BIN>db2 terminate

DB20000I  TERMINATE 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2stop

SQL1064N  DB2STOP 处理成功。

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

四、在副库上恢复之前主库的备份,注意时间戳的匹配。

 

C:/IBM/SQLLIB/BIN>db2 restore db sample from c:/temp

SQL2522N  多个备份文件与为备份的数据库映像提供的时间戳记值相匹配。

 

C:/IBM/SQLLIB/BIN>db2 restore database sample from "c:/temp" taken at 2011061617

3329 replace history file without prompting

DB20000I  RESTORE DATABASE 命令成功完成。

 

五、配置HADR环境参数

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_LOCAL_HOST %1

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_LOCAL_SVC 44455

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_HOST %1

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_SVC 33344

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_INST db2inst1

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_SYNCMODE NEARSYNC

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using LOGINDEXBUILD on

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>SET db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_LOCAL_HOST %1

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_LOCAL_SVC 33344

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_HOST %1

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_SVC 44455

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_INST db2inst2

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_SYNCMODE NEARSYNC

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using LOGINDEXBUILD on

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

六、启动HADR

C:/IBM/SQLLIB/BIN>set db2instance=db2inst2

 

C:/IBM/SQLLIB/BIN>db2 start hadr on db sample as standby

SQL1768N  未能启动 HADR。原因码 = "4"

 

七、错误诊断

db2 => ? SQL1768N

 

 

SQL1768N  未能启动 HADR。原因码 = "<原因码>"

 

说明:

 

与原因码对应的解释是:

 

1        不可恢复数据库,这是因为正在使用循环日志记录。

 

2        数据库启用了无限活动日志记录。

 

3        数据库启用了 DATALINKS

 

4        配置参数 HADR_LOCAL_HOST 无效。

 

5        HADR_LOCAL_SVC 配置参数是无效服务名称。

 

6        HADR_REMOTE_SVC 配置参数是无效服务名称。

 

7        在 HADR 超时时间间隔内,主数据库未能与它的备用数据库建立连接。

 

8        一个或多个 HADR 数据库配置参数没有任何值。

 

9        数据库配置为使用原始日志。但是,HADR 不支持对数据库日志文件使

         用原始 I/O(直接磁盘访问)。

 

10       命令由于 STOP HADR 命令、取消激活数据库或内部错误而被 HADR 

         闭所中断。

 

11       不能将 HADR_LOCAL_HOST 和 HADR_REMOTE_HOST 配置参数解析为同一

         IP 格式。

 

12       配置参数 HADR_REMOTE_HOST 无效。

 

98       未安装有效的 HADR 许可证。命令未成功完成。

 

99       在 HADR 启动期间发生了内部错误。

 

用户响应:

 

与原因码对应的用户响应是:

 

1        数据库必须是可恢复的数据库。激活日志归档或者打开 LOGRETAIN

         然后重新发出该命令。

 

2        禁用无限活动日志记录并重新发出该命令。

 

3        将数据库管理器配置参数 DATALINKS 设置为 NO 并重新发出该命令。

 

4        确保可以将配置参数 HADR_LOCAL_HOST 映射至与本地主机相关联的一个

         IPv4 或 IPv6 地址。

 

5        确保 HADR_LOCAL_SVC 配置参数是有效的服务名称。对于 Unix 平台,

         编辑 /etc/services 文件。对于 Windows,编辑 %SystemRoot%/

         system32/drivers/etc/services。另外,可以为此参数指定文字端口

         号。

 

6        确保 HADR_REMOTE_SVC 配置参数是有效服务名称。对于 Unix 平台,

         编辑 /etc/services 文件。对于 Windows,编辑 %SystemRoot%/

         system32/drivers/etc/services。另外,可以为此参数指定文字端口

         号。

 

7

 

         检查备用数据库上的远程主机和远程服务参数。确保备用数据库是联机

         的,并且网络在起作用。如果网络速度太慢,那么还要考虑增大配置参

         数 HADR_TIMEOUT 的值,或者使用 BY FORCE 选项来启动主数据库。

 

 

 

         如果用于主数据库的 HADR_TIMEOUT 配置参数与用于备用数据库的此配

         置参数的值不相同,那么连接也将失败。有关更多信息,请参阅

         db2diag.log 以获取有关主数据库和备用数据库的不兼容配置的消息。

 

 

8        确保一个或多个 HADR 数据库配置参数具有值。

 

9        将数据库重新配置为对日志文件只使用文件系统存储器,而不是使用原

         始 I/O(直接磁盘访问)设备。请参阅 DB2 信息中心中有关 logpath

         和 newlogpath 数据库配置参数的讨论。

 

10       找出 HADR 关闭的原因,如果有必要,请重新发出 START HADR 命令。

 

11       确保 HADR_LOCAL_HOST 和 HADR_REMOTE_HOST 配置参数采用同一种 IP

         格式(IPv4 或 IPv6)或者可以解析为同一种格式。

 

12       确保可以将配置参数 HADR_REMOTE_HOST 映射至 IPv4 或 IPv6 地址。

 

98       获取并安装有效的 HADR 许可证,然后重新提交该命令。

 

99       如果问题仍然存在,请与 IBM 支持机构联系。

 

db2 =>

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_LOCAL_HOST SL510

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_HOST SL510

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 stop

SQL0104N  在 "STOP" 后面找到异常标记

"语句结束"。预期标记可能包括:"DATABASE"。  SQLSTATE=42601

 

C:/IBM/SQLLIB/BIN>db2stop

SQL1064N  DB2STOP 处理成功。

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_LOCAL_HOST SL510

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>>db2 update db cfg for sample using HADR_REMOTE_HOST SL510

'update' 不是内部或外部命令,也不是可运行的程序

或批处理文件。

 

C:/IBM/SQLLIB/BIN>db2 update db cfg for sample using HADR_REMOTE_HOST SL510

DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2stop

SQL1064N  DB2STOP 处理成功。

 

C:/IBM/SQLLIB/BIN>db2start

ADM12026W  DB2 服务器检测到尚未注册产品 "DB2 Enterprise Server Edition" 的有效许

可证。

SQL1063N  DB2START 处理成功。

 

 

八、重新启动HADR

C:/IBM/SQLLIB/BIN>set db2instance=db2inst2

 

C:/IBM/SQLLIB/BIN>db2 start hadr on db sample as standby

DB20000I  START HADR ON DATABASE 命令成功完成。

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2 start hadr on db sample as primary

DB20000I  START HADR ON DATABASE 命令成功完成。

 

C:/IBM/SQLLIB/BIN>

 

九、HADR测试

 

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2pd -d sample -hadr

 

Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:13:55 -- Date

2011-06-16 17:57:43

 

HADR Information:

Role    State                SyncMode HeartBeatsMissed   LogGapRunAvg (bytes)

Primary Peer                 Nearsync 0                  0

 

ConnectStatus ConnectTime                           Timeout

Connected     Thu Jun 16 17:43:49 2011 (1308217429) 120

 

LocalHost                                LocalService

SL510                                    33344

 

RemoteHost                               RemoteService      RemoteInstance

SL510                                    44455              db2inst2

 

PrimaryFile  PrimaryPg  PrimaryLSN

S0000000.LOG 0          0x0000000001388000

 

StandByFile  StandByPg  StandByLSN

S0000000.LOG 0          0x0000000001388000

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst2

 

C:/IBM/SQLLIB/BIN>db2pd -d sample -hadr

 

Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:16:07 -- Date

2011-06-16 17:59:18

 

HADR Information:

Role    State                SyncMode HeartBeatsMissed   LogGapRunAvg (bytes)

Standby Peer                 Nearsync 0                  0

 

ConnectStatus ConnectTime                           Timeout

Connected     Thu Jun 16 17:43:49 2011 (1308217429) 120

 

LocalHost                                LocalService

SL510                                    44455

 

RemoteHost                               RemoteService      RemoteInstance

SL510                                    33344              db2inst1

 

PrimaryFile  PrimaryPg  PrimaryLSN

S0000000.LOG 0          0x0000000001388000

 

StandByFile  StandByPg  StandByLSN         StandByRcvBufUsed

S0000000.LOG 0          0x0000000001388000 0%

 

C:/IBM/SQLLIB/BIN>

 

C:/IBM/SQLLIB/BIN>set db2instance=db2inst1

 

C:/IBM/SQLLIB/BIN>db2 connect to sample user db2admin using db2admin

 

   数据库连接信息

 

 数据库服务器         = DB2/NT64 9.5.7

 SQL 授权标识         = DB2ADMIN

 本地数据库别名       = SAMPLE

 

 

C:/IBM/SQLLIB/BIN>db2 create table test(c1 integer not null ,c2 varchar(2),prima

ry key (c1))

DB20000I  SQL 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 insert into test (c1,c2) values (11,'aa')

DB20000I  SQL 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 insert into test (c1,c2) values (22,'bb')

DB20000I  SQL 命令成功完成。

 

C:/IBM/SQLLIB/BIN>db2 commit

DB20000I  SQL 命令成功完成。

 

C:/IBM/SQLLIB/BIN>

在实例-db2inst2下的sample数据库上执行takeover命令,接管实例-db2inst1下的sample数据库(手工执行备用数据库接管主数据库): 

set db2instance=db2inst2 
db2 takeover hadr on database sample user db2admin using db2admin

 

十、DB2 HADR管理说明 

1. 启动和停止DB2 HADR使用START HADR命令启动主数据库和备用数据库的HADR。启动主数据库使用AS PRIMARY子句,启动备用数据库使用AS STANDBY 子句。如果想以其他用户启动HADR,可以通过USER user-name USING password子句指定用户名和密码,在启动主数据库的HADR时,如果在数据库HADR_TIMEOUT所指定的时间内未能建立与备用数据库HADR 的连接,启动将失败。这时候,你可以等排除故障并成功启动备用数据库HADR后再启动主数据库HADR,也可以通过指定BY FORCE子句强行启动主数据库。: 

2. 启动备用数据库: start hadr on database sample [using db2admin using db2admin] as standby 

3. 启动主数据库: start hadr on database sample [using db2admin using db2admin] as primary[by force]  使用STOP HADR 停止主数据库和备用数据库的HADR,如果在活动的主数据库上发出此命令,所有的数据库连接都被断开,数据库恢复为标准数据库,并保持联机状态;如果在活动的备用数据库上发出此命令,将停止失败。你必须先使DEACTIVATE DATABASE命令取消激活,然后再停止HADR。 

4. 停止备用数据库: deactivate database sample stop hadr on database sample [using db2admin using db2admin] 

5. 停止主数据库: stop hard on database sample [using db2admin using db2admin] 

6. 查看HARD的配置及运行状态 当备用数据库的HADR启动时,它首先进入本地同步更新状态。并根据本地日志路径配置参数及日志归档方法的设置检索本地系统中的日志文件并重放。当本地日 志文件重放完毕,备用数据库进入远程同步暂挂状态。当与主数据库建立连接之后,备用数据库进入远程同步更新状态。即主数据库将自己的日志文件通过 TCPIP协议发送给备用数据库,备用数据库接收到日志文件并重放,直到所有日志文件都重放完毕,备用数据库和主数据库进入对等状态。 

7. 查看DB2 HADR状态: db2pd -d sample -hadr 

8. 主数据库和备用数据库的接管/故障转移 当主数据库发生故障时,备用数据库可以接管主数据库的服务,成为新的主数据库(称为故障转移)。当原主数据库修复后,又可以作为备用数据库加入HADR 对。即使主数据库服务器没有故障,我们通过接管命令(TAKEOVER)切换主数据库和备用数据库的角色。

9. 接管命令只能用在备用数据库上。HADR提供两种接管方式: 

a) 紧急接管: takeover hadr on database sample by force 

b) 普通接管:takeover hadr on database sample 

10. 主数据库和备用数据库的同步方式 在上面的配置实例中我们将主数据库和备用数据库的HADR_SYNCMODE参数值设置为NEARSYNC,当主数据库和备用数据库处于对等状态时,HADR采用NEARSYNC(接近同步)同步方式管理日志写入。DB2提供了三种日志同步方式: 

a) SYNC(同步): 采用SYNC方式时,仅当主数据库日志写入成功,并收到备用数据库的应答,确保备用数据库的日志也成功写入的情况下,才认为日志写入成功。这种方式下的事务响应时间最长,但最大限度的确保不发生事务丢失; 

b) NEARSYNC(接近同步): 采用NEARSYNC方式时,当主数据库日志写入成功,并收到备用数据库的应答,确定备用数据库已经接收到日志时,即认为日志写入成功。也就是说,备用数 据库接收到的日志并不一定能成功写入持久存储设备上的日志文件。这种方式下的事务响应时间比SYNC方式短,且仅当两台服务器同时发生故障时,才会发生事务丢失;  

c) ASYNC(异步): 采用ASYNC方式时,当主数据库日志写入成功,并将日志发送出去之后,即认为日志写入成功。此方式并不保证备用数据库能收到日志,这要依赖于TCP/IP网络情况。这种方式下的事务响应时间最短,但产生事务丢失的可能性也最大。

11. 自动客户端重新路由(Automatic Client Reroute要配置自动客户端重新路由,使用UPDATE ALTERNATE SERVER命令设置备用数据库信息(使用方法参考上面的配置实例),这些信息将被存放在数据库的系统目录中。请注意:必须使用此命令来设置备用数据库, 而不是HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 数据库配置参数,自动客户端重新路由不使用这两个参数。当客户端与数据库建立连接时,备用数据库的配置信息(主机/IP 及 端口号)也同时被发送给DB2客户端。当客户端与主数据库的连接被中断时,客户端就使用这些信息连接到备用数据库,从而最小限度的降低了数据库故障所造成 的影响。需要强调的是,这个过程由DB2客户端自动完成,不需要用户用程序干涉。通过LIST DB DIRECOTRY 命令可以查看系统数据库目录中自动客户端重新路由的配置。 

12. 索引日志记录 索引的创建、重建、重组也是HADR环境中需要考虑的一个方面,DB2通过数据库配置参数LOGINDEXBUILDCREATE TABLEALTER TABLE语句中的LOG INDEX BUILD选项来控制是否对索引的相关操作进行详细的日志记录。我们在上面的HADR配置实例中将LOGINDEXBUILD数据库参数配置为ON,意为 让DB2记录索引创建、重建、重组的完整日志。这显然会降低主数据库的运行效率并占用更多的日志空间。但因为备用数据库可以通过重放日志来重新构建索引, 所以当主数据库发生故障,备用数据库的索引仍然可用。用户可以通过CREATE TABLEALTER TABLE语句的LOG INDEX BUILD选项来对单个表设定索引日志记录级别。LOG INDEX BUILD选项有三个可选参数: 

a) NULL:这是缺省值,当使用此参数时,表的索引日志记录级别由数据库配置参数LOGINDEXBUILD的值决定。 

b) ON:使用此参数,数据库配置参数LOGINDEXBUILD的值将被忽略,DB2将记录这个表上所有索引维护的详细日志。 

c) OFF:使用此参数时,数据库配置参数LOGINDEXBUILD的值将被忽略,DB2将不记录这个表上索引维护的日志。 如果表选项LOG INDEX BUILD设置为OFF,或者LOG INDEX BUILD设置为NULL但数据库配置参数LOGINDEXBUILD设置为OFFDB2将不记录这些表的索引维护日志,备用数据库也就无法重放索引维 护操作,致使这些索引在备用数据库上变为无效状态。当主数据库发生故障,备用数据库切换为新主数据库后,这些无效的索引必须重建才能被使用。DB2通过数据库配置参数INDEXREC来指定在什么时候检查并重建无效索引。INDEXREC参数有三个可选值: 

i. RESTARTDB2将在显式或隐式重启数据库(RESTART DATABASE)的时候检查并重新构建无效索引。 

ii. ACCESSDB2将在无效索引第一次被访问的时候才会重新构建它。 

iii. SYSTEM:使用数据库管理器配置参数(Database Manager ConfigurationINDEXREC的值。 

在上面的配置实例中,我们将INDEXREC的值设为RESTART,备用数据库将在接管为新的主数据库时检查并重新构建所有无效索引。 

 

 

十一、DB2 HADR的限制 

a) 只有DB2 UDB Enterprise Server EditionESE)支持HADR,但HADR不能支持分区数据库(Database Partitioning FeatureDPF)。 

b) 主数据库和备用数据库必须运行在相同的操作系统版本上,并且DB2 UDB的版本也必须一致,除非短暂的软件升级过程。 

c) 主数据库和备用数据库的位大小必须一致(32位或64位)。 

d) 不能在备用数据库上进行备份操作 

e) 备用数据库是不能访问的,客户端程序无法连接备用数据库。 

f) 日至归档操作只能在主数据库上进行。带有COPY NO选项的LOAD命令是不支持的 

g) 主数据库和备用数据库必须是一对一的。 

h) HADR不能使用循环日志 

i) HADR不复制数据库配置参数、共享库、DLLUDF或存储过程

 

注意以上是9.5版本的DB2限制,从DB2 9.7.1开始支持了HADR备机可读。

j) 除非已启用在备用数据库上读取,否则客户机无法与备用数据库连接。在备用数据库上读取可让客户机连接至活动备用数据库及发出只读查询。

k) 如果已启用在备用数据库上读取,那么不允许在备用数据库上执行写入日志记录的操作;只有读取客户机可以连接至活动备用数据库。

l) 如果已启用在备用数据库上读取,那么不允许在备用数据库上执行修改数据库内容的写入操作。将不支持尝试修改数据库对象的任何异步线程(例如 Just In Time StatisticsJITS)和自动重建索引)和实用程序。JITS 和自动重建索引不应在备用数据库上运行。

m) 只能由当前主数据库执行日志归档。

n) 只能对当前主数据库运行自调整内存管理器(STMM)。在主数据库启动或备用数据库通过接管而转换为主数据库后,直到第一个客户机连接生效,STMM EDU 才可能启动。

o) 在备用数据库上不支持备份操作。

p) 未进行日志记录的操作(例如对数据库配置参数和恢复历史记录文件所作的更改)不会被复制到备用数据库。

q) 不支持指定了 COPY NO 选项的装入操作。

r) HADR 不支持对数据库日志文件使用原始 I/O(直接磁盘访问)。如果 HADR 是通过 START HADR 命令启动的,或者在配置了 HADR 的情况下激活(重新启动)数据库,并且检测到原始日志,那么相关联的命令将失败。

s) 对于一阶段落实,HADR 数据库可以充当联合服务器(事务管理器)或数据源(资源管理器)。对于两阶段落实,HADR 数据库只能充当数据源。

 

注意:即使是V9.7.1版本已经支持并开启了备库可读特性,依然存在以下限制:

a. 不允许在备用数据库上执行写入操作。在此上下文中,写入操作是修改目录、表和索引等永久数据库对象的操作。在备用数据库上执行写入操作会返回错误(SQL1773N 原因码 5)。特别是,不能执行会导致在备用数据库上生成日志记录的任何操作。

b. 在重放 DDL 志记录或维护操作期间(仅重放时间),用户连接无法访问备用数据库。有关更多信息,请参阅活动备用数据库上的仅重放时间。

c. 当备用数据库处于本地同步复制状态时,用户连接无法访问该数据库。尝试连接此状态的客户机将收到错误(SQL1776N 原因码 1)。

d. 在备用数据库上只支持未落实的读(UR)隔离级别。请求更高隔离级别的应用程序、语句或子语句将收到错误(SQL1773N 原因码 1)。有关更多信息,请参阅活动备用数据库上的隔离级别。

e. 不会将实例级别审计配置复制到备用数据库。必须使用 db2audit 工具确保实例级别审计设置在主数据库和备用数据库上是相同的。

f. 在备用数据库上不支持已声明临时表 (DGTT)。在备用数据库上尝试创建或访问它们将收到错误(SQL1773N 原因码 4)。

g. 创建临时表 (CGTT) 只能创建在主数据库上,且它们的定义会被复制到备用数据库。但是,在备用数据库上不支持访问 CGTT,尝试创建或访问它们将收到错误(SQL1773N 原因码 4)。

h. 在主数据库上创建创建临时表”(CGTT) 将触发备用数据库上的仅重放窗口。

i. 在备用数据库上不能访问最初未进行日志记录(NLI)表。在备用数据库上尝试读取 NLI 表的应用程序将收到错误(SQL1477N)。

j. 备用数据库上的查询只能使用 SMS 系统临时表空间。在备用数据库上执行使用 DMS 系统临时表空间的查询可能会导致错误(SQL1773N 原因码 5)。

k. 不能查询下列数据:XML、大对象 (LOB)、长字段(LF)、基于这些数据类型的其中一种的单值类型和结构化类型列。尝试查询这些数据类型将收到错误(SQL1773N 原因码 3)。

l. 在备用数据库上不支持说明工具(db2exfmtdb2expln 和 Visual Explain)和 db2batch 工具(SQL1773N 原因码 5)。如果要分析只读工作负载的性能,那么首先应在主数据库上运行这些工具,在主数据库上对工作负载进行必要的优化,然后将优化后的工作负载移至备用数据库。

m. 在备用数据库上不支持程序包的显式绑定及重新绑定和隐式重新绑定。尝试运行引用失效对象的静态程序包及这些程序包的隐式重新绑定将导致错误(分别为 SQL1773N 原因码 和 6)。应该转为在主数据库上绑定程序包,并在将更改复制到备用数据库后,在备用数据库上运行程序包。

n. 在备用数据库上不支持自调整内存管理器(STMM)。如果要调整备用数据库(以适合运行只读工作负载或以在接管后执行良好),那么必须手动调整。

o. 主数据库上的工作负载管理器(WLMDDL 语句将在备用数据库上重放,但它们在备用数据库上不会生效;但是,存在于数据库备份(用于建立备用数据库)中的任何定义在启用了读取的备用数据库上将是活动的。

p. 在备用数据库上不支持创建和改变序列。同样,不能使用 NEXT VALUE 表达式来生成序列中的下一个值。

q. 在备用数据库上不支持无效对象的运行时重新验证。

r. 不能将备用数据库配置为 Federation Server

s. 在备用数据库上不支持备份和归档操作。

t. 在备用数据库上不支持停顿操作。

 

 

十二、自动化脚本

 

@echo offrem-----rem 单机环境DB2 HADR生成脚本

rem 您可以将这个脚本保存到一个脚本文件hadr.cmd中,然后按一下语法执行:

rem hadr.cmd<hostname>

rem-------if "%1"== ""goto usage

rem 清除原有环境

rem----echo 清除环境

set db2instance=db2inst1

db2start

db2drop db sample

db2stop

db2idrop db2inst1

set db2instance=db2inst2

db2start

db2drop db sample

db2stop

db2idrop db2inst2

rem------rem 创建db2inst1实例

rem-----echo 创建db2inst1实例....

db2icrt db2inst1

if errorlevel1 goto endecho 成功创建db2inst1实例

set db2instance=db2inst1

db2start

db2update dbm cfg using svcename33333db2set db2comm=tcpip

db2 terminate

db2stop

db2start

echo 在实例db2inst1下创建sample数据库

db2sampl

if errorlevel1 goto enddb2update db cfgfor sample using LOGRETAIN RECOVERY

echo 备份sample数据库到当前路径

db2backup db sampleto .

if errorlevel1 goto endrem--------rem 创建db2inst2实例

rem--------echo 创建db2inst2实例....

db2icrt db2inst2

if errorlevel1 goto endecho 成功创建db2inst2实例

set db2instance=db2inst2

db2start

db2update dbm cfg using svcename44444db2set db2comm=tcpip

db2 terminate

db2stop

echo 在实例db2inst2下恢复sample数据库

db2start

db2restore db samplefrom .

if errorlevel1 goto endrem---------rem 配置HADR参数

rem--------echo 配置实例db2inst2下的sample数据库的HADR参数

db2update db cfgfor sample using HADR_LOCAL_HOST %1

db2update db cfgfor sample using HADR_LOCAL_SVC 44455

db2update db cfgfor sample using HADR_REMOTE_HOST %1

db2update db cfgfor sample using HADR_REMOTE_SVC 33344

db2update db cfgfor sample using HADR_REMOTE_INST db2inst1

db2update db cfgfor sample using HADR_SYNCMODE NEARSYNC

db2update db cfgfor sample using LOGINDEXBUILD on

echo 配置实例db2inst1下的sample数据库的HADR参数

SET db2instance=db2inst1

db2update db cfgfor sample using HADR_LOCAL_HOST %1

db2update db cfgfor sample using HADR_LOCAL_SVC 33344

db2update db cfgfor sample using HADR_REMOTE_HOST %1

db2update db cfgfor sample using HADR_REMOTE_SVC 44455

db2update db cfgfor sample using HADR_REMOTE_INST db2inst2

db2update db cfgfor sample using HADR_SYNCMODE NEARSYNC

db2update db cfgfor sample using LOGINDEXBUILD on

rem-------rem 启动HADR

rem-----echo 启动实例db2inst2下的sample数据库作为备用数据库standby

set db2instance=db2inst2

db2 start hadron db sample as standby

if errorlevel1 goto end

echo 启动实例db2inst1下的sample数据库作为主数据库primary

set db2instance=db2inst1

db2 start hadron db sample as primary 

if errorlevel1 goto end

echo 祝贺您成功配置HADR.

exit:usage

echo "语法: handson.cmd<hostname>"

:endEcho "运行错误,请检查脚本"