介绍

  DB2HA可以在OS级别使用专门的HA来实现,也可使用DB2内置的HADR来实现,且配置和管理很简单。

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

 

clip_p_w_picpath001

 

 

同步方式

primarystandby 的参数HADR_SYNCMODE用来设置日志的同步方式,参数的设置将取决于DB在事务的响应时间和事务丢失的可能性之间的平衡。

SYNC:primarystandby 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

#此命令用来在primarystandby DB上设置备用数据库信息.

#ACR 不使用HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 数据库配置参数

 

 

 

DB2 HADR的使用限制

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

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

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

  4. 不能在备用数据库上进行备份操作

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

  6. 日至归档操作只能在主数据库上进行。

  7. 带有COPY NO选项的LOAD命令是不支持的

  8. 主数据库和备用数据库必须是一对一的。

  1. HADR不能使用循环日志

  2. HADR不复制数据库配置参数、共享库、DLLsUDFs或存储过程

 

 

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"