环境介绍: 本地两个虚拟机(通过VMware的克隆), CentOS7, primary主机IP:  192.168.232.136, standby主机IP: 192.168.232.137

DB2版本: 9.7 fp11

搭建步骤:

1. 在主机和备机上安装DB2,创建缺省实例db2inst1,服务端口:60006,(可在/etc/services中配置)

密码:db2inst1, 并在主机上创建数据库testdb

2. 设置HADR监听端口:DB2INST1_HADR/DB2INST2_HADR 在主备两端/etc/services中都添加:

     DB2INST1_HADR   50001/tcp

     DB2INST2_HADR   50002/tcp

3.在主机端设置DB2 db cfg参数:

db2 update db cfg for testdb using LOGARCHMETH1 disk:/home/db2inst1/db2log/testdb
    
   db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_HOST 192.168.232.136
   db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_SVC DB2INST1_HADR
   db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_HOST 192.168.232.137
   db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_SVC DB2INST2_HADR
   db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_INST db2inst1
   db2 UPDATE DB CFG FOR testdb USING HADR_SYNCMODE NEARSYNC
   db2 UPDATE DB CFG FOR testdb USING HADR_PEER_WINDOW 300
   db2 UPDATE DB CFG FOR testdb USING HADR_TIMEOUT 120
    
  db2 UPDATE DB CFG FOR testdb USING INDEXREC RESTART LOGINDEXBUILD ON LOGFILSIZ 4096

这里IP也可以用hostname来代替。HADR_PEER_WINDOW 和USING HADR_TIMEOUT的值两端必须一致

4. 生成备机端数据库:

全量在线备份Primay database数据库testdb并拷贝备份文件到standby上。

 backup  database testdb online to . compress

恢复数据到rollforward pending状态:  restore db testdb

rollforward pending之后注意不需要执行前滚操作,HADR在启动之后会自动从primary追日志。等主备切换之后备机就可以连db了。

 

5.在备机端设置DB2 db cfg参数:

db2 update db cfg FOR testdb using LOGARCHMETH1 disk:/home/db2inst1/db2log/testdb

db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_HOST 192.168.232.137
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_SVC DB2INST1_HADR
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_HOST 192.168.232.136
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_SVC DB2INST1_HADR
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_INST db2inst1
db2 UPDATE DB CFG FOR testdb USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR testdb USING HADR_PEER_WINDOW 300
db2 UPDATE DB CFG FOR testdb USING HADR_TIMEOUT 120
db2 UPDATE DB CFG FOR testdb USING INDEXREC RESTART LOGINDEXBUILD ON LOGFILSIZ 4096

因为是备机,所以这里几个标示主备的参数要对换,同样,IP也可以用hostname代替。表时间的两个参数要和主机一致。

最好设置下DB2_HADR_ROS注册表变量设置为 ON,表示备库可读。

 

6.配置自动客户端重新路由:

在主数据库服务器上:
 db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 192.168.232.137 PORT 50002

在备用数据库服务器上:
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 192.168.232.136 PORT 50001

注意,这里IP和port都是对方数据库的,HOSTNAME 是对方的主机名(也可以是IP), port是对方的hadr监控端口而非实例端口

 

7. 启动HADR

首先启动备用数据库服务器的HADR

db2 DEACTIVATE DATABASE TESTDB

db2 START HADR ON DATABASE TESTDB AS STANDBY

然后启动主数据库服务器的HADR

db2 DEACTIVATE DATABASE TESTDB

db2 START HADR ON DATABASE TESTDB AS PRIMARY

注意:如果你先启动主数据库服务器HADR,那么你必须保证在HADR_TIMEOUT参数指定的时间内(单位为秒)启动备用数据库服务器HADR, 否则将启动失败。

 

8.查看状态/测试:

查看hadr的状态:   db2pd -db testdb -hadr

测试, 在主机端:

[db2inst1@192 ~]$ db2 "create table TEST.PRIMARY_TAB(ID INT)"
DB20000I  The SQL command completed successfully.
[db2inst1@192 ~]$ db2 "insert into  TEST.PRIMARY_TAB values(1),(2)"
DB20000I  The SQL command completed successfully.

注意,此时备机端是无法连数据库的:

[db2inst1@192 ~]$  db2 connect to testdb
SQL1776N  The command is not supported on an HADR standby database or on an
HADR standby database with the current configuration or state.  Reason code =
"1".

需要等到主备切换之后才能连db,去验证表是否在 备机端也存在。

 

9. HADR的停止:

db2 deactivate db testdb   --两端都做

Standby 端:
db2 stop hadr on db testdb

Primary 端:
db2 stop hadr on db testdb

 

10.主备切换:

在备机端:   db2 TAKEOVER HADR ON DB dbname

强制切换:

TAKEOVER HADR ON DB dbname BY FORCE
primary故障时,可以将standby DB的Role向primary进行强制切换
primary DB侧没有发生任何处理 (尽管为primary的状态仍实施切换)    

注意:
一定要在primary为down的状态下执行
双方的DB的Roll作为primary起动,存在接受不同的更新处理的危险性

实施强制切换时,如果有未向STANDBY转送的log存在,此Transaction为lost
有必要进行HADR通信状态的监视
可以将HADR_TIMEOUT调整,使更新为WAIT状态

主备切换之后检查备机的那个表:

[db2inst1@192 ~]$ db2 TAKEOVER HADR ON DB testdb 
DB20000I  The TAKEOVER HADR ON DATABASE command completed successfully.

[db2inst1@192 ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 9.7.11
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

[db2inst1@192 ~]$ db2 "select * from ^C
[db2inst1@192 ~]$ db2 "select * from  TEST.PRIMARY_TAB"

ID         
-----------
          1
          2

  2 record(s) selected.

 

11. 监控HADR状态:

两种方法:

方法1. db2 get snapshot for database on testdb|grep -A  16 'HADR Status'     #Linux版本

           db2 get snapshot for database on testdb|grep -ip 'HADR Status'           #AIX版本

方法2. db2pd -db testdb -hadr

 

 

====================================其他:

HADR的四种同步模式:

The database configuration parameter hadr_syncmode can be set to one of the following values:

• SYNC: Transactions on the primary database commit only after relevant logs are written to disk on both the primary and the standby

• NEARSYNC: Transactions on the primary database commit only after the relevant logs are written to disk on the primary database and received into memory on the standby database  (较常用,推荐)

• ASYNC: Transactions on the primary database commit only after the relevant logs are written to local disk and sent to standby

• SUPERASYNC: Transactions on the primary database commit as soon as the relevant logs are written to local disk

 

HADR的限制:

为了获取高可用性灾难恢复 (HADR) 的最佳性能,请在设计高可用性 DB2® 数据库解决方案时考虑 HADR 的限制:

• 在分区数据库环境中,不支持 HADR。
• 主数据库和备用数据库的操作系统版本和 DB2 数据库系统版本都必须相同。
• 主数据库和备用数据库的 DB2 数据库系统软件的位大小必须相同(32 位或 64 位)
• 日志文件只能由主数据库进行归档。
• 只能对当前主数据库运行自调整内存管理器 (STMM)。
• 在备用数据库上不支持备份操作。
• 未进行日志记录的操作(例如对数据库配置参数和恢复历史记录文件所作的更改)不会被复制到备用数据库。
• 不支持指定了 COPY NO 选项的装入操作。
• HADR 不支持无限日志记录。
• HADR 主数据库的系统时钟必须与 HDAR 备用数据库的系统时钟同步。

在备用数据库上读取的限制

除了只读限制之外,此功能还存在应了解的下列限制 :
· 在重放 DDL 日志记录或维护操作期间(仅重放时间),用户连接无法访问备用数据库。有关更多信息,请参阅活动备用数据库上的仅重放时间。
· 在备用数据库上只支持未落实的读(UR)隔离级别。请求更高隔离级别的应用程序、语句或子语句将收到错误(SQL1773N 原因码 1)。有关更多信息,请参阅活动备用数据库上的隔离级别。
· 不会将实例级别审计配置复制到备用数据库。必须使用 db2audit 工具确保实例级别审计设置在主数据库和备用数据库上是相同的。
· 在备用数据库上不支持已声明临时表 (DGTT)。在备用数据库上尝试创建或访问它们将收到错误(SQL1773N 原因码 4)。
· 要成功查询 XML 和大对象 (LOB) 数据,这些数据必须是直接插入的,否则会返回错误(SQL1773N 原因码 3)。
· 在备用数据库上不支持说明工具(db2exfmt、db2expln 和 Visual Explain)和 db2batch 工具(SQL1773N 原因码 5)。如果要分析只读工作负载的性能,那么首先应在主数据库上运行这些工具,在主数据库上对工作负载进行必要的优化,然后将优化后的工作负载移至备用数据库。
· 在备用数据库上不支持创建和改变序列。同样,不能使用 NEXT VALUE 表达式来生成序列中的下一个值。
· 不能将备用数据库配置为 Federation Server。