Data Guard之逻辑备库的故障切换(logical standby failover)(2)

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     

 

猜你喜欢

转载自mikixiyou.iteye.com/blog/1558314