问题:DR test change后发现启动HADR失败。
环境:两个production server ,P1,P2,一台DR server,D1。6个生产数据库分别以primary role运行在P1 & P2,standby dbs 运行在D1。
DR test操作过程(db2部分):1、运行 db2 takeover hadr on db xx ,使D1上的数据库切换为primary
2、检查D1上DB的可用性
3、db2 stop hadr on db xx (on all servers) 这是出问题的关键点。
4、other operations
5 DR结束,要切换role,悲剧的发现HADR无法启动
DR test是另一个DBA操作的,到我接手时,HADR无法启动:
a3inpcp1@g01zcdrdb001:/home/a3inpcp1> db2 start hadr on db pcpprod as standby
SQL1767N Start HADR cannot complete. Reason code = "1".
原因分析:很显然,在DR test过程中,停止HADR是完全没必要的。其次即使停止HADR,那么由于是在takeover之后stop的,原生产库应该处于前滚暂挂状态。必然是前DBA或者应用的某些操作,导致其脱离前滚暂挂状态,至此,除重建外,别无它法。
information center的说明:
警告: 如果要停止指定的数据库,但仍然想保持其 HADR 主数据库角色或备用数据库角色,那么不要发出 STOP HADR 命令。如果发出 STOP HADR 命令,该数据库将变成标准数据库,并且可能要求进行重新初始化才能继续作为 HADR 数据库工作。而是,请发出 DEACTIVATE DATABASE 命令。
在以下示例中,停止数据库 SOCKS 上的 HADR 操作:
STOP HADR ON DATABASE SOCKS
如果针对不活动的主数据库发出此命令,数据库切换至标准数据库并保持脱机。
如果针对不活动的备用数据库发出此命令,数据库切换至标准数据库、置于前滚暂挂状态,并保持脱机。
如果在活动的主数据库上发出此命令,会停止将日志装入备用数据库,并且在主数据库上关闭所有 HADR 引擎分派单元(EDU)。数据库切换至标准数据库并保持联机。可以继续进行事务处理。可以发出带有 AS PRIMARY 选项的 START HADR 命令来将数据库角色重新切换为主数据库。
如果在活动的备用数据库上发出此命令,那么返回错误消息,指示必须取消激活备用数据库,然后才能尝试将其转换至标准数据库。
对于takeover hadr命令的说明:
- 只能对备用数据库发出 TAKEOVER HADR 命令。
- HADR 无法与 DB2® 故障监视器(db2fm)配合使用,此故障监视器可用于自动重新启动发生故障的数据库。如果启用故障监视器,应该知道在可能发生故障的主数据库上可能执行的故障监视器操作。
- 仅当主数据库和备用数据库处于对等状态,或备用数据库处于远程同步复制暂挂状态时,接管操作才会发生。如果备用数据库处于任何其他状态,将返回错误。
注: 通过将处于本地同步复制状态的备用数据库转换为标准数据库,可以使其正常使用。要执行此操作,通过发出 DEACTIVATE DATABASE 命令来关闭数据库,然后发出 STOP HADR 命令。一旦停止了 HADR,就必须先在前述的备用数据库上完成前滚操作,然后才能使用 HADR。当数据库从备用数据库转换为标准数据库之后,该数据库不能重新加入 HADR 数据库对。要在两台服务器上重新启动 HADR,请执行初始化 HADR 的过程。
解决方法:初始化HADR。
1、启动P1上的数据库,做online backup include logs,然后在D1上恢复数据库。需要强调的是,恢复之后不能做前滚操作。
2、在D1 db上运行db2 start hadr on db xx as standby (要先启动备库)
3、在P1 db上运行 db2 start hadr on db xx as primary
4、db2pd -hadr -d xx 检查hadr状态。
引申出一个问题,要对HADR备库做维护需要停机该怎么操作? 步骤如下:
db2 deactivate db xx
db2stop
不要停止hadr,这可能会导致角色丢失。
添加新评论5 条评论
2012-07-19 16:25
2012-04-10 17:08
2012-04-10 16:05
2012-04-10 15:48
因此我必须对前primary做rollforward, 做完备份后,db2rfpen on dbname, start hadr on dbname as
2012-04-09 17:39
因此我必须对前primary做rollforward, 做完备份后,db2rfpen on dbname, start hadr on dbname as standby,是否可行?