HADR是high availability disaster recovery的简写。组成HADR,需要一对机器(DB2并没有支持多个从机,是因为这样会给系统的管理带来很大麻烦),一个主机(primary),一个从机(secondary)。
1.数据库版本必须一致,此例为8.2ese
2.运行db2licm -l 查看是否支持hadr特性
3.两台机器: serverA 10.10.20.16 255.255.255.0 serverB 10.10.20.110 255.255.255.0
4.两台机器均使用默认实例DB2,服务端口号均为 50000
5.由于安装后注册表参数 db2comm=TCPIP为默认值, 所以下面不再配置,若不是此值,
必须通过命令 db2set db2comm=TCPIP为每个相关实例设置
6.关闭防火墙或打开端口 */
--在serverA上执行 set db2instance=DB2 db2set db2comm=TCPIP--默认即是
db2 terminate db2stop db2start
--创建数据库 db2sampl
--修改数据库参数
db2 update db cfg for sample using logretain=on
db2 update db cfg for sample using trackmod=on
db2 update db cfg for sample using logindexbuild=on
db2 update db cfg for sample using indexrec=restart
--备份数据库 db2 backup db sample to f:/test
--在serverB上: set db2instance=DB2
--因为以下命令导致数据库处于前滚暂挂状态,
db2 restore db sample from f:/test replace history file
db2 update db cfg for sample using HADR_LOCAL_HOST 10.10.20.110
db2 update db cfg for sample using HADR_LOCAL_SVC 44444
db2 update db cfg for sample using HADR_REMOTE_HOST 10.10.20.16
db2 update db cfg for sample using HADR_REMOTE_SVC 33333
db2 update db cfg for sample using HADR_REMOTE_INST DB2
db2 update db cfg for sample using HADR_SYNCMODE nearsync
--在serverA上配置sample数据库参数
set db2instance=DB2 db2 update db cfg for sample using HADR_LOCAL_HOST 10.10.20.16
db2 update db cfg for sample using HADR_LOCAL_SVC 33333
db2 update db cfg for sample using HADR_REMOTE_HOST 10.10.20.110
db2 update db cfg for sample using HADR_REMOTE_SVC 44444
db2 update db cfg for sample using HADR_REMOTE_INST DB2
db2 update db cfg for sample using HADR_SYNCMODE nearsync
--在serverB上以standby方式启动sample数据库
set db2instance=DB2 db2 deactivate database sample
db2 start hadr on database sample as standby
--在serverA上以primary方式启动sample数据库
set db2instance=DB2 db2 start hadr on database sample as primary
--在serverA上查看sample数据库的hadr状态
set db2instance=DB2 db2pd -d sample -hadr
--在serverB上查看sample数据库的hadr状态
set db2instance=DB2 db2pd -d sample -hadr
--测试:
--在serverA上
set db2instance=DB2
db2 connect to sample
db2 create table test(id integer)
db2 insert into test(1)
db2 insert into test(2)
db2 commit
db2 select * from sample
--在serverB上 set db2instance=DB2 --接管hadr,如果不能建立与serverA上DB2实例的连接,
比如serverA服务器或DB2实例已经关闭,则必须用by force选项如下:
db2 takeover hadr on database sample user db2admin using db2admin by force
--正常接管
db2 takeover hadr on database sample user db2admin using db2admin
db2 connect to sample db2 select * from test --显示数据表明serverA上的数据应用到了serverB上了
--查看hadr状态
db2pd -d sample -hadr
主机上执行
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_HOST 192.168.1.2
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_SVC 55001
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_HOST 192.168.1.5
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_SVC 55002
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_INST db2admin
db2 UPDATE DB CFG FOR XMHIS USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR XMHIS USING HADR_TIMEOUT 120
备机上执行
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_HOST 192.168.1.5
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_SVC 55002
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_HOST 192.168.1.2
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_SVC 55001
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_INST db2admin
db2 UPDATE DB CFG FOR XMHIS USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR XMHIS USING HADR_TIMEOUT 120
DB2的HA可以在OS级别使用专门的HA来实现,也可使用DB2内置的HADR来实现,且配置和管理很简单。
一个HADR环境需要两台数据库服务器:主数据库服务器(primary)和备用数据库服务器(standby,处于standby角色的数据库不能够被访问)。当主数据库中发生事务操作时,会同时将日志文件通过TCP/IP协议传送到备用数据库服务器,然后备用数据库对接受到的日志文件进行重放(Replay),从而保持与主数据库的一致性。
当主数据库发生故障时,备用数据库服务器可以接管主数据库服务器的事务处理。
此时,备用数据库服务器作为新的主数据库服务器进行数据库的读写操作,而客户端应用程序的数据库连接可以通过自动客户端重新路由(Automatic Client Reroute)机制转移到新的主服务器。当原来的主数据库服务器被修复后,又可以作为新的备用数据库服务器加入HADR。通过这种机制,DB2 UDB实现了数据库的灾难恢复和高可用性,最大限度的避免了数据丢失。
同步方式
primary和standby 的参数HADR_SYNCMODE用来设置日志的同步方式,参数的设置将取决于DB在事务的响应时间和事务丢失的可能性之间的平衡。
SYNC:primary和standby DB日志均确认写入成功才认为日志写入成功。
NEARSYNC:primary DB日志写入成功,standby DB确认接收到日志即认为日志写入成功。
ASYNC(异步):primary DB日志写入成功,并将日志发送出去之后即认为日志写入成功。
自动客户端重新路由(automatic client reroute)
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.11 PORT 60000
#此命令用来在primary和standby DB上设置备用数据库信息.
#ACR 不使用HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 数据库配置参数
DB2 HADR的使用限制
-
只有DB2 UDB Enterprise Server Edition(ESE)支持HADR,但HADR不能支持分区数据库(Database Partitioning Feature,DPF)。
-
主数据库和备用数据库必须运行在相同的操作系统版本上,并且DB2 UDB的版本也必须一致,除非短暂的软件升级过程。
-
主数据库和备用数据库的位大小必须一致(32位或64位)。
-
不能在备用数据库上进行备份操作
-
备用数据库是不能访问的,客户端程序无法连接备用数据库。
-
日至归档操作只能在主数据库上进行。
-
带有COPY NO选项的LOAD命令是不支持的
-
主数据库和备用数据库必须是一对一的。
-
HADR不能使用循环日志
-
HADR不复制数据库配置参数、共享库、DLLs、UDFs或存储过程
HADR操作
启动和停止 #先启动谁后启动谁
db2 start HADR on db testdb user a3intest using passwd as standby
db2 start HADR on db testdb as primary [by force]
#如果在HADR_TIMEOUT所指定的时间内未能建立与备用数据库HADR的连接,启动会失败,使用by force 选项可以在启动失败时强行启动。
db2 deactivate db testdb
db2 stop hadr on db testdb
#stop HADR on standby
db2 stop hadr on db testdb
#stop HADR on primary
查看HADR的连接状态
当备用数据库的HADR启动时,它首先进入本地同步更新状态。并根据本地日志路径配置参数及日志归档方法的设置检索本地系统中的日志文件并重放。当本地日志文件重放完毕,备用数据库进入远程同步暂挂状态。
当与主数据库建立连接之后,备用数据库进入远程同步更新状态。即主数据库将自己的日志文件通过TCPIP协议发送给备用数据库,备用数据库接收到日志文件并重放,直到所有日志文件都重放完毕,备用数据库和主数据库进入对等状态
db2 get snapshot for db on testdb
#可以查看primary,standby数据库的连接状态
db2 get db cfg | grep -i hadr
#查询数据库HADR的相关配置
接管/故障转移
当主数据库发生故障时,备用数据库可以接管主数据库的服务,成为新的主数据库(称为故障转移)。当原主数据库修复后,又可以作为备用数据库加入HADR对。
即使主数据库服务器没有故障,我们通过接管命令(TAKEOVER)切换主数据库和备用数据库的角色。
db2 takeover HADR on db test by force
#当primary DB故障时紧急接管,takeover命令只运行在standby DB上。
db2 takeover HADR on db testdb
#普通接管
配置示例
hostname:primary.ade.com
IP:172.16.72.11
OS:RHEL7.0
package:db2 V10.1FP4 ESE
instance:a3intest
port:60000
db:testdb
hostname:standby.ade.com
IP:172.16.72.12
OS:RHEL7.0
package:db2 V10.1FP4 ESE
instance:a3intest
port:60000
db:testdb (restored from primary)
#primary & standby
DB2_a1intest 60000/tcp (/etc/services)
db2set db2comm=tcpip
db2 update dbm cfg using svcename DB2_a3intest
##make sure the following port is available for HADR.
echo "DB2_HADR_1 61001/tcp" >> /etc/sevices
echo "DB2_HADR_2 61002/tcp" >> /etc/sevices
#归档日志
db2 update db cfg for testdb using logarchmeth1 logretain
##索引日志记录参数
db2 UPDATE DB CFG FOR testdb USING LOGINDEXBUILD ON
db2 UPDATE DB CFG FOR testdb USING INDEXREC RESTART
##primary
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.12 PORT 60000
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_HOST 172.16.72.11
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_SVC DB2_HADR_1
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_HOST 172.16.72.12
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_SVC DB2_HADR_2
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_INST a3intest
db2 UPDATE DB CFG FOR testdb USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR testdb USING HADR_TIMEOUT 120
db2 CONNECT TO testdb
db2 QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS
db2 UNQUIESCE DATABASE
db2 CONNECT RESET
##backup db on primary
db2 backup db testdb to /db/a3intest/db2backup
##restore db on standby
db2 restore db testdb from /db/a3intest/db2backup/ taken at 20150203203651 replace history file without prompting
##standby
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.11 PORT 60000
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_HOST 172.16.72.12
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_SVC DB2_HADR_2
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_HOST 172.16.72.11
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_SVC DB2_HADR_1
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_INST a3intest
db2 UPDATE DB CFG FOR testdb USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR testdb USING HADR_TIMEOUT 120
db2 update db cfg for testdb using logarchmeth1 logretain
db2 UPDATE DB CFG FOR testdb USING LOGINDEXBUILD ON
db2 UPDATE DB CFG FOR testdb USING INDEXREC RESTART
#start HADR on standby
db2 deactivate db testdb
db2 start hadr on db testdb as standby
#start HADR on primary
db2 deactivate db testdb
db2 start hadr on db testdb as primary
##HADR status
db2pd -db testdb -hadr
##HADR_STATE = PEER 表示连接正常
db2 get snapshot for db on testdb
##可以查询HADR的连接状态
##stop HADR
#primary
db2 stop hadr on db testdb
#standby
db2 deactivate db testdb
db2 stop hadr on db testdb
##test HADR
#primary:
db2 connect to testdb
db2 "CREATE TABLE HADRTEST(ID INTEGER NOT NULL WITH DEFAULT,NAME VARCHAR(10),PRIMARY KEY (ID))"
db2 "INSERT INTO HADRTEST (ID,NAME) VALUES (1,‘a‘)"
db2 "INSERT INTO HADRTEST (ID,NAME) VALUES (2,‘b‘)"
db2 "INSERT INTO HADRTEST (ID,NAME) VALUES (3,‘b‘)"
##standby
db2 takeover hadr on db testdb
db2 get snapshot for db on testdb
db2 connect to testdb
db2 "select * from hadrtest"
首先,说明几个需要注意的问题:
(1). HADR pair不可以使用circular logging。大家可以参照db2 infocenter,阅读以下DB2的log方式
(2). HADR的从机是由主机的备份镜像恢复而成的
(3). 启动HADR的时候应该首先启动standby,然后在启动primary
(4). Standby和Primary上和HADR相关的参数一定要一致,否则会在系统握手校验的时候失败
现在我们假设HADR Pair部署在主机hostp和从机hosts上
第一步,分别在主机和从机上创建数据库:
db2 create db hadrdb
第二步,设置主数据库配置参数:
db2 update db cfg for hadrdb using logretain on
db2 update db cfg for hadrdb using trackmod on
db2 update db cfg for hadrdb using logindexbuild on
db2 update db cfg for hadrdb using indexrec restart
db2 update db cfg for hadrdb using HADR_LOCAL_HOST hostp
db2 update db cfg for hadrdb using HADR_LOCAL_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_HOST hosts
db2 update db cfg for hadrdb using HADR_REMOTE_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_INST db2inst1
db2 update db cfg for hadrdb using HADR_TIMEOUT 120
db2 update db cfg for hadrdb using HADR_PEER_WINDOW 10
db2 update db cfg for hadrdb using HADR_SYNCMODE sync
第三步,备份主数据库,生成一个备份文件
db2 backup db hadrdb
这里需要注意一下,如果你是第一次将日志的方式设置为retain方式,这次备份会使数据库跳出backup pending方式。当从数据库恢复时,不要使用这个备份文件,而是需要重新备份一次,使用第二次备份的文件。假设文件名是:HADRDB.0.sfbao.NODE0000.CATN0000.20091116071458.001
第四步,将刚才备份的数据库日志文件拷贝到一个从机可以使用的文件系统里面
第五步,在从数据库上恢复数据库:
db2 restore db hadrdb from HADRDB.0.sfbao.NODE0000.CATN0000.20091116071458.001
第六步,配置从数据库的参数:
db2 update db cfg for hadrdb using logretain on
db2 update db cfg for hadrdb using trackmod on
db2 update db cfg for hadrdb using logindexbuild on
db2 update db cfg for hadrdb using indexrec restart
db2 update db cfg for hadrdb using HADR_LOCAL_HOST hosts
db2 update db cfg for hadrdb using HADR_LOCAL_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_HOST hostp
db2 update db cfg for hadrdb using HADR_REMOTE_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_INST db2isnt1
db2 update db cfg for hadrdb using HADR_TIMEOUT 120
db2 update db cfg for hadrdb using HADR_PEER_WINDOW 10
db2 update db cfg for hadrdb using HADR_SYNCMODE sync
其实,对于这一步,你只要更新HADR_LOCAL_HOST和HADR_REMOTE_HOST就可以了,因为其他的参数在restore db的时候都会恢复出来。
第七步,启动从数据库:
db2 start hadr on db hadrdb as standby
第八步,启动主数据库:
db2 start hadr on db hadrdb as primary