欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 10:03:43
...

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