【DG】 DataGuard 中处理archive gap的方法

【DG】 DataGuard 中处理archive gap的方法




DG 中处理archive gap的方法

====================

当Primary Database的某些日志没有成功发送到Standby Database, 这时候Standby DB上就会出现归档裂缝(Archive Gap)。

Oracle主要由两个参数处理Archive Gap:

FAL_* 是Fetch Archive Log的缩写,通过配置FAL_server和FAL_client实现Gap检测的一种机制。从FAL 这个名字可以看出,这个过程是Standby DB主动发起的“取”日志的过程,Standby DB就是FAL_CLIENT. 它是从FAL_server中取这些缺失的Gap, 10g中,这个FAL_server可以是Primary DB, 也可以是其他的Standby DB。如:FAL_SERVER='PR1,ST1,ST2';

       当Lgwr和Arch进程发送redo/archive到standby端的时候,当前log sequence会同standby端RFS进程上次接收到的log sequence做比较,如果发现二者有断档,RFS会根据FAL_Server发送请求,要求主库传送缺失的日志。或者当备端的RFS进程收到archivelog的时候,更新standby的控制文件以记录这些归档信息,一旦MRP发现控制文件被更新,会进行Recover/Apply log。如果MRP发现所需的日志出现缺失或者所需的日志文件不可用(损坏或者被物理移除等),也会通过FAL_Server来发送相应的处理请求。

       MRP是standby端的恢复进程,不像RFS进程一样与parimary有直接关联,通过FAL的参数配置来主动请求primary处理gap。

       从9i以后,一般都不需要手工处理确实的日志,FAL自动会帮我们处理这些问题。 但是,并非我们就完全不用手工处理了,比如,你的磁盘空间爆满,归档日志在传到备库前被转移到其他地方,这种情况下FAL是不能解决问题的,需要手工处理一下。 

解决办法:

解决gap的方法有两种,方法虽然略有不同,但是原理是相同的

一、gap较少,可以直接将缺少的归档scp到standby,在standby手工注册下即可

二、gap较多,在primary 做基于scn的backup,同时创建一个新的standbycontrolfile,将备份好的backupset ,standbycontrolfile 拷贝的备库的相应目录下,进行restore、recover的操作即可因为这个案例中,standby丢失的归档太多,推荐用第二种方法

///////////////////////////////////////////////////////////////////////////////////////////////////

方法一:手工处理日志GAP的步骤:

1、在备库检查是否有日志缺失

SQL> select * from V$ARCHIVE_GAP;

THREAD#   LOW_SEQUENCE#     HIGH_SEQUENCE#

------------ ----------------------- ----------------------

1                  99                               109

从上面的信息可以看出,备库中缺失了99到109的日志。

2、在主库中查询缺失的日志的所在路径和名称

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 99 AND 109 ;

NAME

--------------------------------------------------------------------------------

/u01/archivelog/1_99_626106231.arc

/u01/archivelog/1_100_626106231.arc

/u01/archivelog/1_101_626106231.arc

/u01/archivelog/1_102_626106231.arc

/u01/archivelog/1_103_626106231.arc

/u01/archivelog/1_104_626106231.arc

/u01/archivelog/1_105_626106231.arc

/u01/archivelog/1_106_626106231.arc

/u01/archivelog/1_107_626106231.arc

/u01/archivelog/1_108_626106231.arc

/u01/archivelog/1_109_626106231.arc

如果把日志移动到其他路径,则把日志所在路径换成当前实际所在路径。

3、把日志拷贝到备库上

4、在备库上手工注册上一步中从主库拷贝来的日志

SQL> ALTER DATABASE REGISTER LOGFILE '/u01/archivelog/1_99_626106231.arc';

Database altered.

......

SQL> ALTER DATABASE REGISTER LOGFILE '/u01/archivelog/1_109_626106231.arc';

Database altered.

5、稍等片刻,观察备库的alert日志信息 :

Sun Aug 12 20:38:47 2007

Media Recovery Log /u01/archivelog/1_99_626106231.arc

Media Recovery Log /u01/archivelog/1_100_626106231.arc

Media Recovery Log /u01/archivelog/1_101_626106231.arc

Media Recovery Log /u01/archivelog/1_102_626106231.arc

......

从以上信息,可以看出之前注册的日志已经被正常应用。或者查询视图v$archived_log的applied字段

6、检查备库是否还有日志GAP

SQL> select * from V$ARCHIVE_GAP;

no rows selected

如果有行返回,则重复2-5步,直到查询结果是"no rows selected"。

如果日志只是临时移动到其他地方,过后会再移回原路径,则不用这么大费周折手工去手工处理了,把日志拷回原处后FAL会自动处理GAP。

//////////////////////////////////////////////////////////////////////////////

方法二:操作流程提纲:

(1)      standby 取消recover

SQL> select * from v$archive_gap ;

SQL> alter database recover managed standby database cancel;

(2)      在主库v$archived_log查询gap中LOW_SEQUENCE#-1对应的scn(即:first_change#)

SQL>select THREAD#,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE#from v$archived_log where SEQUENCE#=98;

  THREAD#    SEQUENCE#   FIRST_CHANGE#    NEXT_CHANGE#

  ---------- ---------- ------------- ------------

         1      481     542543    551725

(3)      在primary做基于该scn的增量备份

RMAN> run {

2> allocate channel c1 device type disk;

3> allocate channel c2 device type disk;

4> backup incremental from scn 542543 database format '/oradata/bak/ora_scn_%U.bak';    #incremental单词不要写错

5> release channel c1;

6> }

(4)      在primary创建新的standby controlfile

SQL> alter database create standby controlfile as '/oradata/bak/control.ctl';

(5)      将增量的备份集和创建好的standby controlfile 拷贝的备库

(6)      备库shutdown

SQL> shutdownimmediate

(7)      使用新的standby controlfile 启动备库到mount

SQL> startup mount;

(8)      Standby 做recover

RMAN> catalog start with '/oradata/bak/ora_scn_05ohoqvu_1_1';     ###放在standby的增量备份的备份集

RMAN> recover database noredo;

(9)      验证结果

Standby 执行接收并恢复日志操作

SQL> alterdatabase recover managed standby database disconnect from session;

SQL> select * fromv$archive_gap;

no rows selected

SQL> select THREAD#,max(SEQUENCE#) from v$archived_log group by THREAD#;

   THREAD# MAX(SEQUENCE#)

---------- --------------

         1           3729

 

Primary端验证结果

 

SQL> select THREAD# ,max(SEQUENCE#) from v$archived_log  group by THREAD#;

   THREAD# MAX(SEQUENCE#)

--------- --------------

1                                      3729

Primary进行日志切换,查看standby告警日志。



About Me


...............................................................................................................................

● 本文整理自网络

● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文博客园地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 联系我请加QQ好友(646634621),注明添加缘由

● 于 2017-06-02 09:00 ~ 2017-06-30 22:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

...............................................................................................................................

拿起手机使用微信客户端扫描下边的左边图片来关注小麦苗的微信公众号:xiaomaimiaolhr,扫描右边的二维码加入小麦苗的QQ群,学习最实用的数据库技术。

时间: 2024-10-23 20:14:22

【DG】 DataGuard 中处理archive gap的方法的相关文章

注意&#106avascript中RegExp对象的test方法

对象 javascript 中的 RegExp 对象用于正则表达式相关的操作,这个对象提供了一个方法 test 来判定某个字符串是否满足某个 pattern. 返回值是 true/false.今天我碰到了一个问题: <script type="text/javascript"><!--var re = /^\d+(?:\.\d)?$/ig;    alert(re.test('112.3'));alert(re.test('33'));//--></scr

java中看到类写在方法里面的类是什类啊

问题描述 java中看到类写在方法里面的类是什类啊 java中看到类写在方法里面的类是什类啊 void func (){class lei } 解决方案 方法内部的内部类的可见性更小,它只在方法内部可见,在外部类(及外部类的其它方法中)中都不可见了.同时,它有一个特点,就是方法内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员.同时另一个需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用. 解决方案二: 内部类(匿名内部类) 解

java方法-java中decodeStream方法和openStream方法有什么区别和联系

问题描述 java中decodeStream方法和openStream方法有什么区别和联系 java中decodeStream方法和openStream方法有什么区别和联系 URL方法的参数是有哪几个参数组成的 解决方案 http://www.cnblogs.com/yourancao520/archive/2012/06/25/2561367.htmlhttp://blog.sina.com.cn/s/blog_588508f801010dh6.html

c++-C++中链接SQL数据库的方法

问题描述 C++中链接SQL数据库的方法 求大神能不能分享一下比较好的C++代码中链接SQL数据库的资料, 真的很想学习这一块的知识.跪谢!!! 解决方案 http://download.csdn.net/download/miao420906189/1006139http://www.codefans.net/down/25108.shtml 完整的一本书,足够详细了吧. 解决方案二: C++连接SQL数据库 解决方案三: sql 链接数据库 执行方法 解决方案四: http://www.cn

在Python中操作字典之clear()方法的使用

  这篇文章主要介绍了在Python中操作字典之clear()方法的使用,是Python入门的基础知识,需要的朋友可以参考下 clear()方法将删除字典中的所有项目(清空字典) 语法 以下是clear()方法的语法: ? 1 dict.clear() 参数 NA 返回值 此方法不返回任何值. 例子 下面的例子显示了clear()方法的使用 ? 1 2 3 4 5 6 7 #!/usr/bin/python   dict = {'Name': 'Zara', 'Age': 7};   print

在Python中操作字典之fromkeys()方法的使用

  这篇文章主要介绍了在Python中操作字典之fromkeys()方法的使用,是Python入门的基础知识,需要的朋友可以参考下 fromkeys()方法从序列键和值设置为value来创建一个新的字典. 语法 以下是fromkeys()方法的语法: ? 1 dict.fromkeys(seq[, value])) 参数 seq -- 这是将用于字典的键准备的值的列表. value -- 这是可选的,如果提供的话则值将被设置为这个值 返回值 此方法返回列表. 例子 下面的例子显示fromkeys

在Python中操作字典之setdefault()方法的使用

  这篇文章主要介绍了在Python中操作字典之setdefault()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 setdefault()方法类似于get()方法,但会设置字典[键]=默认情况下,如果键不是已经在字典中. 方法 以下是setdefault()方法的语法: ? 1 dict.setdefault(key, default=None) 参数 key -- 这是要被搜索的键 default -- 这是没有找到键的情况下返回的值. 返回值 此方法返回字典可用的

在Python中处理字符串之isdecimal()方法的使用

  这篇文章主要介绍了在Python中处理字符串之isdecimal()方法的使用,是Python入门学习的基础知识,需要的朋友可以参考下 isdecimal()方法检查字符串是否仅由十进制字符组成.此方法只存在于unicode对象. 注意:要定义一个字符串为Unicode,只需前缀分配'u'左引号.以下是示例. 语法 以下是isdecimal()方法的语法: ? 1 str.isdecimal() 参数 NA 返回值 如果字符串中的所有字符为十进制此方法返回true,否则返回false. 例子

Excel中合并单元格中快速添加序号的方法

  Excel中合并单元格中快速添加序号的方法          如下图所示,需要在数据的A列加入序号: 如果我们利用传统的拖动填充方式添加序号,系统会弹出这样的提示:"此操作要求合并单元格都具有相同大小" 即不能对数据源格式进行修改,又不能用常规方法添加序号,怎么办呢? 要手工逐个的填写吗? 答案是否定的,如果数据量太大的话,我们不可能一个一个去手工添加吧. 这里给大家介绍一个简单的方法. 首先,选中要添加序号的单元格: 编辑栏输入公式: =MAX($A$1:A1)+1 注意关键的一