High Availability Disaster Recovery (HADR)是数据库级别的高可用性数据复制机制, HADR 实现是基于 HDR 的 Informix 实现的(是数据库中高可用性灾难恢复相对比较成熟的功能)。本质上讲, HADR 是一种日志传送功能( DB2 UDB 现在支持这种功能),但它传送的不是固化的磁盘上的日志,而是日志缓冲区中的日志。这种方法提供了充分的粒度来满足解决方案的高可用性需求。 HADR 复制发生在数据库层。
在生产环境下,HADR 环境需要两台数据库服务器:主数据库服务器( primary )和备用数据库服务器( standby )。当主数据库中发生事务操作 时,会同时将日志文件通过 TCP/IP 协议传送到备用数据库服务器,然后备用数据库对接受到的日志文件进行重放( Replay ),从而保持与主数据库的一 致性。当主数据库发生故障时,备用数据库服务器可以接管主数据库服务器的事务处理。此时,备用数据库服务器作为新的主数据库服务器进行数据库的读写操作, 而客户端应用程序的数据库连接可以通过自动客户端重新路由( Automatic Client Reroute )机制转移到新的主服务器。当原来的主数据库服务器被修复后,又可以作为新的备用数据库服务器加入 HADR 。通过这种机制, DB2 UDB 实现了数据库的灾难恢复和高可用性,最大限度的避免了数据丢失。
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
驱动器 C 中的卷没有标签。
卷的序列号是 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 命令成功完成。
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 通过数据库配置参数 LOGINDEXBUILD 和 CREATE TABLE 或 ALTER TABLE 语句中的 LOG INDEX BUILD 选项来控制是否对索引的相关操作进行详细的日志记录。我们在上面的 HADR 配置实例中将 LOGINDEXBUILD 数据库参数配置为 ON ,意为 让 DB2 记录索引创建、重建、重组的完整日志。这显然会降低主数据库的运行效率并占用更多的日志空间。但因为备用数据库可以通过重放日志来重新构建索引, 所以当主数据库发生故障,备用数据库的索引仍然可用。用户可以通过 CREATE TABLE 或 ALTER 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 设置为 OFF , DB2 将不记录这些表的索引维护日志,备用数据库也就无法重放索引维 护操作,致使这些索引在备用数据库上变为无效状态。当主数据库发生故障,备用数据库切换为新主数据库后,这些无效的索引必须重建才能被使用。 DB2 通过数据库配置参数 INDEXREC 来指定在什么时候检查并重建无效索引。 INDEXREC 参数有三个可选值:
i. RESTART: DB2 将在显式或隐式重启数据库( RESTART DATABASE )的时候检查并重新构建无效索引。
ii. ACCESS: DB2 将在无效索引第一次被访问的时候才会重新构建它。
iii. SYSTEM:使用数据库管理器配置参数( Database Manager Configuration ) INDEXREC 的值。
在上面的配置实例中,我们将INDEXREC 的值设为 RESTART ,备用数据库将在接管为新的主数据库时检查并重新构建所有无效索引。
十一、 DB2 HADR的限制
a) 只有DB2 UDB Enterprise Server Edition ( ESE )支持 HADR ,但 HADR 不能支持分区数据库( Database Partitioning Feature , DPF )。
b) 主数据库和备用数据库必须运行在相同的操作系统版本上,并且DB2 UDB 的版本也必须一致,除非短暂的软件升级过程。
c) 主数据库和备用数据库的位大小必须一致(32 位或 64 位)。
d) 不能在备用数据库上进行备份操作
e) 备用数据库是不能访问的,客户端程序无法连接备用数据库。
f) 日至归档操作只能在主数据库上进行。带有COPY NO 选项的 LOAD 命令是不支持的
g) 主数据库和备用数据库必须是一对一的。
h) HADR不能使用循环日志
i) HADR不复制数据库配置参数、共享库、 DLL 、 UDF 或存储过程
注意以上是 9.5版本的 DB2 限制,从 DB2 9.7.1 开始支持了 HADR 备机可读。
j) 除非已启用“ 在备用数据库上读取 ” ,否则客户机无法与备用数据库连接。 “ 在备用数据库上读取 ” 可让客户机连接至活动备用数据库及发出只读查询。
k) 如果已启用“ 在备用数据库上读取 ” ,那么不允许在备用数据库上执行写入日志记录的操作;只有读取客户机可以连接至活动备用数据库。
l) 如果已启用“ 在备用数据库上读取 ” ,那么不允许在备用数据库上执行修改数据库内容的写入操作。将不支持尝试修改数据库对象的任何异步线程(例如 Just In Time Statistics ( JITS )和自动重建索引)和实用程序。 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. 在备用数据库上不支持说明工具(db2exfmt 、 db2expln 和 Visual Explain )和 db2batch 工具( SQL1773N 原因码 5 )。如果要分析只读工作负载的性能,那么首先应在主数据库上运行这些工具,在主数据库上对工作负载进行必要的优化,然后将优化后的工作负载移至备用数据库。
m. 在备用数据库上不支持程序包的显式绑定及重新绑定和隐式重新绑定。尝试运行引用失效对象的静态程序包及这些程序包的隐式重新绑定将导致错误(分别为 SQL1773N 原因码 5 和 6 )。应该转为在主数据库上绑定程序包,并在将更改复制到备用数据库后,在备用数据库上运行程序包。
n. 在备用数据库上不支持自调整内存管理器(STMM )。如果要调整备用数据库(以适合运行只读工作负载或以在接管后执行良好),那么必须手动调整。
o. 主数据库上的工作负载管理器(WLM ) DDL 语句将在备用数据库上重放,但它们在备用数据库上不会生效;但是,存在于数据库备份(用于建立备用数据库)中的任何定义在启用了读取的备用数据库上将是活动的。
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 "运行错误,请检查脚本 "