环境介绍: 本地两个虚拟机(通过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。