问题描述
准生产环境的 RAC + DG,目前主备实时同步正常,现做切换演练(2017年)。
主库关闭第2节点,在第1节点上执行如下命令将主库降级为备库:
SQL> alter database commit to switchover to physical standby WITH SESSION SHUTDOWN;
备库第2节点不用动,在第1节点上执行如下命令,将备库升级为主库:
SQL> alter database commit to switchover to primary WITH SESSION SHUTDOWN;
在备库节点1和节点2上执行如下命令打开实例:
SQL> alter database open;
在主库节点1和节点2都执行如下命令打开实例:
SQL> startup
此时报错,提示数据文件需要recover....
问题原因
主库第1节点上做了一个计划任务,每10分钟删除所有归档(RMAN 里配置了归档删除策略:应用到备库上后才能删除)。
但最后一组归档日志产生于2天前,且对应日志组一直是 ACTIVE 状态(切换之前实时同步正常,很明显这组日志已经应用到了备库上)。
主切备时,oracle 实际上做的是 shutdown abort 的操作。所以,在重新启动主的时候,需要 ACTIVE 状态和 CURRENT 状态的日志做实例恢复,而 ACTIVE 状态的那组归档日志已经被删除。
说明(添加于 2020.04.23):这个原因应该是不成立的。已经实验验证,哪怕是介质恢复,如果需要的日志仍在 online logfile 里,尽管已经归档,删除相应的归档也没有影响,Oracle 直接使用的是在线日志组文件进行恢复。
改善建议
在做主切备的命令之前,先做一个 checkpoint 可避免该问题(最好先做一个 switch logfile)。
解决办法
从备份或备库中找回相应的归档日志,或者将原主库作为备库,重建。
切换前检查
检查监听(都出现过问题):
local listener 为 IP
remote listener 为 SCAN
检查文件的正确性与一致性:
tnsnames
密码文件
对主库降级前检查主备库:
SQL> select switchover_status from gv$database;
主库的状态为 TO STANDBY 或 SESSIONS ACTIVE,备库的状态应为 NOT ALLOWED。
对主库执行降级命令后检查备库:
SQL> SELECT OPEN_MODE, SWITCHOVER_STATUS FROM V$DATABASE;
OPEN_MODE SWITCHOVER_STATUS
--------------------- ------------------------------------
READ ONLY WITH APPLY TO_PRIMARY