Oracle Data Guard 用来保护 Oracle 数据,可提供最高级别的数据保护和可用性的同时,使 Oracle 数据库保持最卓越的性能。它的运行遵循一个原则:传输重做数据,然后应用重做数据。
它分成两种实现方式,分别为逻辑备库( logical standby )和物理备库 (physical standby) ,用于不同的应用场景。如逻辑备库用于数据库的读写分离,物理备库用于数据库异地灾备。
在 Oracle 10g 逻辑备库中 ,如主库出现故障,备库也是可以迅速切换成主库使用。
在 Oracle 10g logical standby 模式下,主库损毁,逻辑备库如何 完成切换成主库的任务?
在 Data Guard 之逻辑备库的故障切换 (logical standby failover) ( http://mikixiyou.iteye.com/blog/1530120 ) 一文中,我介绍一种切换操作过程,但那是在主库的日志文件还没有丢失的情况下进行的操作。
在本文中,我们介绍在主库日志文件没有传输到逻辑备库时,逻辑备库上的应用的日志 SCN 和最新的日志 SCN 不一致的情况下,如何完成逻辑备库到主库的切换操作。
在切换过程中报 ORA-00308 错误,显示缺少归档日志文件。
我以 logical standby failover ora-00308 在 google 搜很多文档,也没有发现合适的解决方法和解决建议。
于是,只好自己去查阅文档和测试解决方法。
( miki 西游 @mikixiyou 文档,原文链接 : http://mikixiyou.iteye.com/blog/1558314 )
第一步,检查逻辑备库上应用进程的 applied scn 和 latest scn
SQL> r
1* select to_char(applied_scn),to_char(latest_scn) from v$logstdby_progress
TO_CHAR(APPLIED_SCN) TO_CHAR(LATEST_SCN)
---------------------------------------- ----------------------------------------
11565985537 11565985750
如果有两者相等,请参照文档 Data Guard 之逻辑备库的故障切换 (logical standby failover) 去完成逻辑备库的灾难切换工作。
关键点就是,我们这里的 SCN 是不相等的,否则也就没了下文了。
再次调用一下逻辑备库的日志应用操作。
SQL> alter database start logical standby apply immediate;
Database altered.
在后台警告日志文件中,发现此错误,说缺少一个日志文件。
Mon Jun 11 14:00:27 2012
LOGMINER: Error 308 encountered, failed to read missing logfile +VG2/archivelog/standby/1_31907_739157941.dbf
停止逻辑备库日志应用工作。
SQL> alter database stop logical standby apply;
Database altered.
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY FINISH;
Database altered.
停止 logical standby 的日志应用工作,再使用新的命令去启用日志应用。
在警告日志文件中,还是报错,依然是缺少日志文件。
Mon Jun 11 13:55:16 2012
LOGMINER: Error 308 encountered during failover, failed to read missing logfile +VG2/archivelog/standby/1_31907_739157941.dbf
LOGSTDBY status: ORA-00308: cannot open archived log '+VG2/archivelog/standby/1_31907_739157941.dbf'
ORA-17503: ksfdopn:2 Failed to open file +VG2/archivelog/standby/1_31907_739157941.dbf
ORA-15173: entry '1_31907_739157941.dbf' does not exist in directory 'standby'
即使我们使用激活逻辑备库为主库模式的操作命令去强行切换,也是会出错的。道理很简单,在切换过程中缺少相应的归档日志文件。
ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY
这个语句的作用是停止 RFS 进程,应用所有保存在 standby 日志文件中重做日志,停止 SQL 应用,将控制文件切换成主库模式的控制文件,去掉 GUARD 保护状态使得所有人可以像正常库一样使用此库,最后激活主库模式,完成切换。
这里 finish apply 是一个可选子句。如果不带上这个子句,那么将有部分重做日志会不被应用。
那么,我们如何解决呢
两种方法:一种是找到归档日志文件,手工拷贝过来,然后注册进去。这样就可以切换成功。另一种,是采用忽略的方式切换。
SQL> alter database activate logical standby database ;
Database altered.
将数据库的角色,确认是主库了。
SQL> select
2 database_role from v$database;
DATABASE_ROLE
----------------
PRIMARY
在归档日志环节上,我陷入了误区,想去找到如何 until scn 的方法,类似于 rman 中的 recover 方式。
其实,在这种环境下,解决起来很简单。直接 alter database activate logical standby database; 而不需要去加子句 finish apply 。