<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
HighAvailabilityDisasterRecovery(HADR)是数据库级别的高可用性数据复制机制, HADR 实现是基于 HDR 的 Informix 实现的(是数据库中高可用性灾难恢复相对比较成熟的功能)。本质上讲, HADR 是一种日志传送功能( DB2UDB 现在支持这种功能),但它传送的不是固化的磁盘上的日志,而是日志缓冲区中的日志。这种方法提供了充分的粒度来满足解决方案的高可用性需求。 HADR 复制发生在数据库层。
在生产环境下,HADR 环境需要两台数据库服务器:主数据库服务器( primary )和备用数据库服务器( standby )。当主数据库中发生事务操作时,会同时将日志文件通过 TCP/IP 协议传送到备用数据库服务器,然后备用数据库对接受到的日志文件进行重放( Replay ),从而保持与主数据库的一致性。当主数据库发生故障时,备用数据库服务器可以接管主数据库服务器的事务处理。此时,备用数据库服务器作为新的主数据库服务器进行数据库的读写操作,而客户端应用程序的数据库连接可以通过自动客户端重新路由( AutomaticClientReroute )机制转移到新的主服务器。当原来的主数据库服务器被修复后,又可以作为新的备用数据库服务器加入 HADR 。通过这种机制, DB2UDB 实现了数据库的灾难恢复和高可用性,最大限度的避免了数据丢失。
C:/IBM/SQLLIB/BIN>db2ilist
DB2
BAK
C:/IBM/SQLLIB/BIN>db2idropbak
DB20000IDB2IDROP命令成功完成。
C:/IBM/SQLLIB/BIN>db2ilist
DB2
C:/IBM/SQLLIB/BIN>cd..
C:/IBM/SQLLIB>dir
驱动器C 中的卷没有标签。
卷的序列号是C470-0EBA
C:/IBM/SQLLIB的目录
2011/02/2220:59<DIR>.
2011/02/2220:59<DIR>..
2011/02/2220:59<DIR>adsm
2011/06/1617:19<DIR>BIN
2011/02/2220:59<DIR>bnd
2011/02/2309:27<DIR>cfg
2011/02/2220:11<DIR>clidriver
2011/02/2220:11<DIR>conv
2011/03/3114:05<DIR>dasfcn
2007/10/0223:11241db2cli.opt
2011/02/2220:10<DIR>doc
2011/02/2309:27<DIR>FUNCTION
2011/02/2220:11<DIR>help
2011/02/2220:59<DIR>include
2011/02/2220:12<DIR>infopop
2010/11/3015:28787,408INFOPOPS_JHELP_CN.exe
2010/11/3015:291,700,448INFOPOPS_WHELP_CN.exe
2011/02/2220:59<DIR>java
2011/02/2220:59<DIR>lib
2011/02/2702:25<DIR>license
2011/02/2220:11<DIR>map
2011/02/2220:59<DIR>MISC
2011/02/2220:11<DIR>msg
2011/02/2220:59<DIR>Readme
2011/02/2220:59<DIR>samples
2011/02/2220:10<DIR>security
2011/02/2702:25<DIR>tivready
2011/03/1914:21<DIR>TOOLS
3个文件 2,488,097 字节
25个目录 75,457,306,624 可用字节
C:/IBM/SQLLIB>db2icrtdb2inst1
DB20000IDB2ICRT命令成功完成。
C:/IBM/SQLLIB>db2icrtdb2inst2
DB20000IDB2ICRT命令成功完成。
C:/IBM/SQLLIB>cdbin
C:/IBM/SQLLIB/BIN>hadr.cmd
"语法 :handson.cmd<SL510>"
"运行错误,请检查脚本 "
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
C:/IBM/SQLLIB/BIN>db2dropdbsample
SQL1031N在指示的文件系统中找不到数据库目录。 SQLSTATE=58031
C:/IBM/SQLLIB/BIN>db2stop
SQL1064NDB2STOP处理成功。
C:/IBM/SQLLIB/BIN>db2idropdb2inst1
DB20000IDB2IDROP命令成功完成。
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst2
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
C:/IBM/SQLLIB/BIN>db2dropdbsample
SQL1031N在指示的文件系统中找不到数据库目录。 SQLSTATE=58031
C:/IBM/SQLLIB/BIN>db2stop
SQL1064NDB2STOP处理成功。
C:/IBM/SQLLIB/BIN>db2idropdb2inst2
DB20000IDB2IDROP命令成功完成。
C:/IBM/SQLLIB/BIN>db2icrtdb2inst1
DB20000IDB2ICRT命令成功完成。
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
C:/IBM/SQLLIB/BIN>db2updatedbmcfgusingsvcename33333
DB20000IUPDATEDATABASEMANAGERCONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2setdb2comm=tcpip
C:/IBM/SQLLIB/BIN>db2terminate
DB20000ITERMINATE命令成功完成。
C:/IBM/SQLLIB/BIN>db2stop
SQL1064NDB2STOP处理成功。
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
C:/IBM/SQLLIB/BIN>db2sampl.exe
Creatingdatabase"SAMPLE"...
Connectingtodatabase"SAMPLE"...
Creatingtablesanddatainschema"JAMIN"...
CreatingtableswithXMLcolumnsandXMLdatainschema"JAMIN"...
'db2sampl'processingcomplete.
三、 将主库设置为归档模式,这是必须的。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingLOGRETAINRECOVERY
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2backupdbsampletoc:/temp
备份成功。此备份映像的时间戳记是:20110616173329
C:/IBM/SQLLIB/BIN>db2icrtdb2inst2
DB20000IDB2ICRT命令成功完成。
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst2
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
C:/IBM/SQLLIB/BIN>db2updatedbmcfgusingsvcename44444
DB20000IUPDATEDATABASEMANAGERCONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2setdb2comm=tcpip
C:/IBM/SQLLIB/BIN>db2terminate
DB20000ITERMINATE命令成功完成。
C:/IBM/SQLLIB/BIN>db2stop
SQL1064NDB2STOP处理成功。
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
四、 在副库上恢复之前主库的备份,注意时间戳的匹配。
C:/IBM/SQLLIB/BIN>db2restoredbsamplefromc:/temp
SQL2522N多个备份文件与为备份的数据库映像提供的时间戳记值相匹配。
C:/IBM/SQLLIB/BIN>db2restoredatabasesamplefrom"c:/temp"takenat2011061617
3329replacehistoryfilewithoutprompting
DB20000IRESTOREDATABASE命令成功完成。
五、 配置 HADR环境参数
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_LOCAL_HOST%1
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_LOCAL_SVC44455
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_HOST%1
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_SVC33344
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_INSTdb2inst1
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_SYNCMODENEARSYNC
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingLOGINDEXBUILDon
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>SETdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_LOCAL_HOST%1
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_LOCAL_SVC33344
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_HOST%1
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_SVC44455
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_INSTdb2inst2
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_SYNCMODENEARSYNC
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingLOGINDEXBUILDon
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
六、启动 HADR
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst2
C:/IBM/SQLLIB/BIN>db2starthadrondbsampleasstandby
SQL1768N未能启动 HADR 。原因码 ="4" 。
七、 错误诊断
db2=>?SQL1768N
SQL1768N未能启动 HADR 。原因码 ="< 原因码 >" 。
说明:
与原因码对应的解释是:
1不可恢复数据库,这是因为正在使用循环日志记录。
2数据库启用了无限活动日志记录。
3数据库启用了 DATALINKS 。
4配置参数 HADR_LOCAL_HOST 无效。
5HADR_LOCAL_SVC配置参数是无效服务名称。
6HADR_REMOTE_SVC配置参数是无效服务名称。
7在 HADR 超时时间间隔内,主数据库未能与它的备用数据库建立连接。
8一个或多个 HADR 数据库配置参数没有任何值。
9数据库配置为使用原始日志。但是, HADR 不支持对数据库日志文件使
用原始I/O (直接磁盘访问)。
10命令由于 STOPHADR 命令、取消激活数据库或内部错误而被 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 的值,或者使用 BYFORCE 选项来启动主数据库。
如果用于主数据库的HADR_TIMEOUT 配置参数与用于备用数据库的此配
置参数的值不相同,那么连接也将失败。有关更多信息,请参阅
db2diag.log以获取有关主数据库和备用数据库的不兼容配置的消息。
8确保一个或多个 HADR 数据库配置参数具有值。
9将数据库重新配置为对日志文件只使用文件系统存储器,而不是使用原
始I/O (直接磁盘访问)设备。请参阅 DB2 信息中心中有关 logpath
和newlogpath 数据库配置参数的讨论。
10找出 HADR 关闭的原因,如果有必要,请重新发出 STARTHADR 命令。
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>db2updatedbcfgforsampleusingHADR_LOCAL_HOSTSL510
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_HOSTSL510
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2stop
SQL0104N在 "STOP" 后面找到异常标记
"语句结束 " 。预期标记可能包括: "DATABASE" 。 SQLSTATE=42601
C:/IBM/SQLLIB/BIN>db2stop
SQL1064NDB2STOP处理成功。
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_LOCAL_HOSTSL510
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>>db2updatedbcfgforsampleusingHADR_REMOTE_HOSTSL510
'update'不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:/IBM/SQLLIB/BIN>db2updatedbcfgforsampleusingHADR_REMOTE_HOSTSL510
DB20000IUPDATEDATABASECONFIGURATION命令成功完成。
C:/IBM/SQLLIB/BIN>db2stop
SQL1064NDB2STOP处理成功。
C:/IBM/SQLLIB/BIN>db2start
ADM12026WDB2服务器检测到尚未注册产品 "DB2EnterpriseServerEdition" 的有效许
可证。
SQL1063NDB2START处理成功。
八、重新启动HADR
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst2
C:/IBM/SQLLIB/BIN>db2starthadrondbsampleasstandby
DB20000ISTARTHADRONDATABASE命令成功完成。
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2starthadrondbsampleasprimary
DB20000ISTARTHADRONDATABASE命令成功完成。
C:/IBM/SQLLIB/BIN>
九、 HADR测试
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2pd-dsample-hadr
DatabasePartition0--DatabaseSAMPLE--Active--Up0days00:13:55--Date
2011-06-1617:57:43
HADRInformation:
RoleStateSyncModeHeartBeatsMissedLogGapRunAvg(bytes)
PrimaryPeerNearsync00
ConnectStatusConnectTimeTimeout
ConnectedThuJun1617:43:492011(1308217429)120
LocalHostLocalService
SL51033344
RemoteHostRemoteServiceRemoteInstance
SL51044455db2inst2
PrimaryFilePrimaryPgPrimaryLSN
S0000000.LOG00x0000000001388000
StandByFileStandByPgStandByLSN
S0000000.LOG00x0000000001388000
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst2
C:/IBM/SQLLIB/BIN>db2pd-dsample-hadr
DatabasePartition0--DatabaseSAMPLE--Active--Up0days00:16:07--Date
2011-06-1617:59:18
HADRInformation:
RoleStateSyncModeHeartBeatsMissedLogGapRunAvg(bytes)
StandbyPeerNearsync00
ConnectStatusConnectTimeTimeout
ConnectedThuJun1617:43:492011(1308217429)120
LocalHostLocalService
SL51044455
RemoteHostRemoteServiceRemoteInstance
SL51033344db2inst1
PrimaryFilePrimaryPgPrimaryLSN
S0000000.LOG00x0000000001388000
StandByFileStandByPgStandByLSNStandByRcvBufUsed
S0000000.LOG00x00000000013880000%
C:/IBM/SQLLIB/BIN>
C:/IBM/SQLLIB/BIN>setdb2instance=db2inst1
C:/IBM/SQLLIB/BIN>db2connecttosampleuserdb2adminusingdb2admin
数据库连接信息
数据库服务器=DB2/NT649.5.7
SQL授权标识 =DB2ADMIN
本地数据库别名=SAMPLE
C:/IBM/SQLLIB/BIN>db2createtabletest(c1integernotnull,c2varchar(2),prima
rykey(c1))
DB20000ISQL命令成功完成。
C:/IBM/SQLLIB/BIN>db2insertintotest(c1,c2)values(11,'aa')
DB20000ISQL命令成功完成。
C:/IBM/SQLLIB/BIN>db2insertintotest(c1,c2)values(22,'bb')
DB20000ISQL命令成功完成。
C:/IBM/SQLLIB/BIN>db2commit
DB20000ISQL命令成功完成。
C:/IBM/SQLLIB/BIN>
在实例-db2inst2 下的 sample 数据库上执行 takeover 命令,接管实例 -db2inst1 下的 sample 数据库(手工执行备用数据库接管主数据库):
setdb2instance=db2inst2
db2takeoverhadrondatabasesampleuserdb2adminusing db2admin
十、 DB2HADR管理说明
1. 启动和停止DB2HADR : 使用STARTHADR 命令启动主数据库和备用数据库的 HADR 。启动主数据库使用 ASPRIMARY 子句,启动备用数据库使用 ASSTANDBY 子句。如果想以其他用户启动 HADR ,可以通过 USERuser-nameUSINGpassword 子句指定用户名和密码,在启动主数据库的 HADR 时,如果在数据库 HADR_TIMEOUT 所指定的时间内未能建立与备用数据库 HADR 的连接,启动将失败。这时候,你可以等排除故障并成功启动备用数据库 HADR 后再启动主数据库 HADR ,也可以通过指定 BYFORCE 子句强行启动主数据库。:
2. 启动备用数据库:starthadrondatabasesample[usingdb2adminusingdb2admin]asstandby
3. 启动主数据库:starthadrondatabasesample[usingdb2adminusingdb2admin]asprimary[byforce] 使用STOPHADR 停止主数据库和备用数据库的 HADR ,如果在活动的主数据库上发出此命令,所有的数据库连接都被断开,数据库恢复为标准数据库,并保持联机状态;如果在活动的备用数据库上发出此命令,将停止失败。你必须先使 用 DEACTIVATEDATABASE命令取消激活,然后再停止 HADR 。
4. 停止备用数据库:deactivatedatabasesample , stophadrondatabasesample[usingdb2adminusingdb2admin]
5. 停止主数据库:stophardondatabasesample[usingdb2adminusingdb2admin]
6. 查看HARD 的配置及运行状态 : 当备用数据库的HADR 启动时,它首先进入本地同步更新状态。并根据本地日志路径配置参数及日志归档方法的设置检索本地系统中的日志文件并重放。当本地日志文件重放完毕,备用数据库进入远程同步暂挂状态。当与主数据库建立连接之后,备用数据库进入远程同步更新状态。即主数据库将自己的日志文件通过 TCPIP 协议发送给备用数据库,备用数据库接收到日志文件并重放,直到所有日志文件都重放完毕,备用数据库和主数据库进入对等状态。
7. 查看DB2HADR 状态: db2pd-dsample-hadr
8. 主数据库和备用数据库的接管/ 故障转移 : 当主数据库发生故障时,备用数据库可以接管主数据库的服务,成为新的主数据库(称为故障转移)。当原主数据库修复后,又可以作为备用数据库加入HADR 对。即使主数据库服务器没有故障,我们通过接管命令( TAKEOVER )切换主数据库和备用数据库的角色。
9. 接管命令只能用在备用数据库上。HADR 提供两种接管方式:
a) 紧急接管:takeoverhadrondatabasesamplebyforce
b) 普通接管:takeoverhadrondatabasesample
10. 主数据库和备用数据库的同步方式 : 在上面的配置实例中我们将主数据库和备用数据库的HADR_SYNCMODE 参数值设置为 NEARSYNC ,当主数据库和备用数据库处于对等状态时, HADR 采用 NEARSYNC (接近同步)同步方式管理日志写入。 DB2 提供了三种日志同步方式:
a) SYNC(同步):采用 SYNC 方式时,仅当主数据库日志写入成功,并收到备用数据库的应答,确保备用数据库的日志也成功写入的情况下,才认为日志写入成功。这种方式下的事务响应时间最长,但最大限度的确保不发生事务丢失;
b) NEARSYNC(接近同步):采用 NEARSYNC 方式时,当主数据库日志写入成功,并收到备用数据库的应答,确定备用数据库已经接收到日志时,即认为日志写入成功。也就是说,备用数据库接收到的日志并不一定能成功写入持久存储设备上的日志文件。这种方式下的事务响应时间比 SYNC 方式短,且仅当两台服务器同时发生故障时,才会发生事务丢失;
c) ASYNC(异步):采用 ASYNC 方式时,当主数据库日志写入成功,并将日志发送出去之后,即认为日志写入成功。此方式并不保证备用数据库能收到日志,这要依赖于 TCP/IP 网络情况。这种方式下的事务响应时间最短,但产生事务丢失的可能性也最大。
11. 自动客户端重新路由(AutomaticClientReroute ) : 要配置自动客户端重新路由,使用UPDATEALTERNATESERVER 命令设置备用数据库信息(使用方法参考上面的配置实例),这些信息将被存放在数据库的系统目录中。请注意:必须使用此命令来设置备用数据库,而不是 HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 数据库配置参数,自动客户端重新路由不使用这两个参数。当客户端与数据库建立连接时,备用数据库的配置信息(主机 /IP 及端口号)也同时被发送给 DB2 客户端。当客户端与主数据库的连接被中断时,客户端就使用这些信息连接到备用数据库,从而最小限度的降低了数据库故障所造成的影响。需要强调的是,这个过程由 DB2 客户端自动完成,不需要用户用程序干涉。通过 LISTDBDIRECOTRY 命令可以查看系统数据库目录中自动客户端重新路由的配置。
12. 索引日志记录 : 索引的创建、重建、重组也是HADR 环境中需要考虑的一个方面, DB2 通过数据库配置参数 LOGINDEXBUILD 和 CREATETABLE 或 ALTERTABLE 语句中的 LOGINDEXBUILD 选项来控制是否对索引的相关操作进行详细的日志记录。我们在上面的 HADR 配置实例中将 LOGINDEXBUILD 数据库参数配置为 ON ,意为让 DB2 记录索引创建、重建、重组的完整日志。这显然会降低主数据库的运行效率并占用更多的日志空间。但因为备用数据库可以通过重放日志来重新构建索引,所以当主数据库发生故障,备用数据库的索引仍然可用。用户可以通过 CREATETABLE 或 ALTERTABLE 语句的 LOGINDEXBUILD 选项来对单个表设定索引日志记录级别。 LOGINDEXBUILD 选项有三个可选参数:
a) NULL:这是缺省值,当使用此参数时,表的索引日志记录级别由数据库配置参数 LOGINDEXBUILD 的值决定。
b) ON:使用此参数,数据库配置参数 LOGINDEXBUILD 的值将被忽略, DB2 将记录这个表上所有索引维护的详细日志。
c) OFF:使用此参数时,数据库配置参数 LOGINDEXBUILD 的值将被忽略, DB2 将不记录这个表上索引维护的日志。如果表选项 LOGINDEXBUILD 设置为 OFF ,或者 LOGINDEXBUILD 设置为 NULL 但数据库配置参数 LOGINDEXBUILD 设置为 OFF , DB2 将不记录这些表的索引维护日志,备用数据库也就无法重放索引维护操作,致使这些索引在备用数据库上变为无效状态。当主数据库发生故障,备用数据库切换为新主数据库后,这些无效的索引必须重建才能被使用。 DB2 通过数据库配置参数 INDEXREC 来指定在什么时候检查并重建无效索引。 INDEXREC 参数有三个可选值:
i. RESTART: DB2 将在显式或隐式重启数据库( RESTARTDATABASE )的时候检查并重新构建无效索引。
ii. ACCESS: DB2 将在无效索引第一次被访问的时候才会重新构建它。
iii. SYSTEM:使用数据库管理器配置参数( DatabaseManagerConfiguration ) INDEXREC 的值。
在上面的配置实例中,我们将INDEXREC 的值设为 RESTART ,备用数据库将在接管为新的主数据库时检查并重新构建所有无效索引。
十一、 DB2HADR的限制
a) 只有DB2UDBEnterpriseServerEdition ( ESE )支持 HADR ,但 HADR 不能支持分区数据库( DatabasePartitioningFeature , DPF )。
b) 主数据库和备用数据库必须运行在相同的操作系统版本上,并且DB2UDB 的版本也必须一致,除非短暂的软件升级过程。
c) 主数据库和备用数据库的位大小必须一致(32 位或 64 位)。
d) 不能在备用数据库上进行备份操作
e) 备用数据库是不能访问的,客户端程序无法连接备用数据库。
f) 日至归档操作只能在主数据库上进行。带有COPYNO 选项的 LOAD 命令是不支持的
g) 主数据库和备用数据库必须是一对一的。
h) HADR不能使用循环日志
i) HADR不复制数据库配置参数、共享库、 DLL 、 UDF 或存储过程
注意以上是 9.5版本的 DB2 限制,从 DB29.7.1 开始支持了 HADR 备机可读。
j) 除非已启用“ 在备用数据库上读取 ” ,否则客户机无法与备用数据库连接。 “ 在备用数据库上读取 ” 可让客户机连接至活动备用数据库及发出只读查询。
k) 如果已启用“ 在备用数据库上读取 ” ,那么不允许在备用数据库上执行写入日志记录的操作;只有读取客户机可以连接至活动备用数据库。
l) 如果已启用“ 在备用数据库上读取 ” ,那么不允许在备用数据库上执行修改数据库内容的写入操作。将不支持尝试修改数据库对象的任何异步线程(例如 JustInTimeStatistics ( JITS )和自动重建索引)和实用程序。 JITS 和自动重建索引不应在备用数据库上运行。
m) 只能由当前主数据库执行日志归档。
n) 只能对当前主数据库运行自调整内存管理器(STMM )。在主数据库启动或备用数据库通过接管而转换为主数据库后,直到第一个客户机连接生效, STMMEDU 才可能启动。
o) 在备用数据库上不支持备份操作。
p) 未进行日志记录的操作(例如对数据库配置参数和恢复历史记录文件所作的更改)不会被复制到备用数据库。
q) 不支持指定了COPYNO 选项的装入操作。
r) HADR不支持对数据库日志文件使用原始 I/O (直接磁盘访问)。如果 HADR 是通过 STARTHADR 命令启动的,或者在配置了 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 和 VisualExplain )和 db2batch 工具( SQL1773N 原因码 5 )。如果要分析只读工作负载的性能,那么首先应在主数据库上运行这些工具,在主数据库上对工作负载进行必要的优化,然后将优化后的工作负载移至备用数据库。
m. 在备用数据库上不支持程序包的显式绑定及重新绑定和隐式重新绑定。尝试运行引用失效对象的静态程序包及这些程序包的隐式重新绑定将导致错误(分别为SQL1773N 原因码 5 和 6 )。应该转为在主数据库上绑定程序包,并在将更改复制到备用数据库后,在备用数据库上运行程序包。
n. 在备用数据库上不支持自调整内存管理器(STMM )。如果要调整备用数据库(以适合运行只读工作负载或以在接管后执行良好),那么必须手动调整。
o. 主数据库上的工作负载管理器(WLM ) DDL 语句将在备用数据库上重放,但它们在备用数据库上不会生效;但是,存在于数据库备份(用于建立备用数据库)中的任何定义在启用了读取的备用数据库上将是活动的。
p. 在备用数据库上不支持创建和改变序列。同样,不能使用NEXTVALUE 表达式来生成序列中的下一个值。
q. 在备用数据库上不支持无效对象的运行时重新验证。
r. 不能将备用数据库配置为FederationServer 。
s. 在备用数据库上不支持备份和归档操作。
t. 在备用数据库上不支持停顿操作。
十二、 自动化脚本
@echooffrem-----rem单机环境 DB2HADR 生成脚本
rem您可以将这个脚本保存到一个脚本文件 hadr.cmd 中,然后按一下语法执行:
remhadr.cmd<hostname>
rem-------if"%1"==""gotousage
rem清除原有环境
rem----echo清除环境
setdb2instance=db2inst1
db2start
db2dropdbsample
db2stop
db2idropdb2inst1
setdb2instance=db2inst2
db2start
db2dropdbsample
db2stop
db2idropdb2inst2
rem------rem创建 db2inst1 实例
rem-----echo创建 db2inst1 实例 ....
db2icrtdb2inst1
iferrorlevel1gotoendecho成功创建 db2inst1 实例
setdb2instance=db2inst1
db2start
db2updatedbmcfgusingsvcename33333db2setdb2comm=tcpip
db2terminate
db2stop
db2start
echo在实例 db2inst1 下创建 sample 数据库
db2sampl
iferrorlevel1gotoenddb2updatedbcfgforsampleusingLOGRETAINRECOVERY
echo备份 sample 数据库到当前路径
db2backupdbsampleto.
iferrorlevel1gotoendrem--------rem创建 db2inst2 实例
rem--------echo创建 db2inst2 实例 ....
db2icrtdb2inst2
iferrorlevel1gotoendecho成功创建 db2inst2 实例
setdb2instance=db2inst2
db2start
db2updatedbmcfgusingsvcename44444db2setdb2comm=tcpip
db2terminate
db2stop
echo在实例 db2inst2 下恢复 sample 数据库
db2start
db2restoredbsamplefrom.
iferrorlevel1gotoendrem---------rem配置 HADR 参数
rem--------echo配置实例 db2inst2 下的 sample 数据库的 HADR 参数
db2updatedbcfgforsampleusingHADR_LOCAL_HOST %1
db2updatedbcfgforsampleusingHADR_LOCAL_SVC 44455
db2updatedbcfgforsampleusingHADR_REMOTE_HOST %1
db2updatedbcfgforsampleusingHADR_REMOTE_SVC 33344
db2updatedbcfgforsampleusingHADR_REMOTE_INSTdb2inst1
db2updatedbcfgforsampleusingHADR_SYNCMODENEARSYNC
db2updatedbcfgforsampleusingLOGINDEXBUILD on
echo配置实例 db2inst1 下的 sample 数据库的 HADR 参数
SETdb2instance=db2inst1
db2updatedbcfgforsampleusingHADR_LOCAL_HOST %1
db2updatedbcfgforsampleusingHADR_LOCAL_SVC 33344
db2updatedbcfgforsampleusingHADR_REMOTE_HOST %1
db2updatedbcfgforsampleusingHADR_REMOTE_SVC 44455
db2updatedbcfgforsampleusingHADR_REMOTE_INSTdb2inst2
db2updatedbcfgforsampleusingHADR_SYNCMODENEARSYNC
db2updatedbcfgforsampleusingLOGINDEXBUILD on
rem-------rem启动 HADR
rem-----echo启动实例 db2inst2 下的 sample 数据库作为备用数据库 standby
setdb2instance=db2inst2
db2starthadrondbsample asstandby
iferrorlevel1gotoend
echo启动实例 db2inst1 下的 sample 数据库作为主数据库 primary
setdb2instance=db2inst1
db2starthadrondbsample asprimary
iferrorlevel1gotoend
echo祝贺您成功配置 HADR.
exit:usage
echo"语法 :handson.cmd<hostname>"
:endEcho"运行错误,请检查脚本 "