1. 日志传输方式

有两种日志传输方式(ARC和LGWR),第一种是采用ARC进程传输日志,其示意图如下:

注:上图来自《大话Oracle RAC》

其大致过程如下:

1)主库:日志先写入在线重做日志,当在线重做日志满后(或人为切换), ARC0进程归档该日志至主库本地归档目录,归档完成后,ARC1马上将该归档日志传输到备库;

2)备库:RFS进程接收日志,如果备库有Standby重做日志,则把日志复制到Standby重做日志,接着把Standby重做日志归档至备库本地归档目录,最后应用归档日志;如果没有配置Standby重做日志,RFS进程接收日志后,直接把它放到备库的归档目录下,再应用该日志。

另外一种是使用LGWR进程传输日志,它又分为两种方式,分别是ASYNC和SYNC,下面是ASYNC的示意图:

 下面是SYNC的示意图如下:

注:上图来自《大话Oracle RAC》

用LGWR传输大致如下:

1)主库:只要有新的重做日志产生,LGWR进程将触发LNSn进程把新生成的日志传输到备库(注意:这里不能由LGWR直接传输,因为整个数据库实例只有一个LGWR,为了保证它的主要业务性能不受影响,不能由它直接传输);

2)备库:RFS进程接收到日志后,将其写入Standby重做日志,如果备库开启了实时应用,就立即做日志应用,如果没有开启,则等Standby重做日志归档后再应用。

3)其中,ASYNC和SYNC的区别在于:SYNC是在redo还在内存时,LNSn进程就开始传输,而ASYNC是在redo缓冲到online redo log后,LNSn才开始传输。

从上面可以得出,从同步的实时性来看,LGWR(SYNC) > LGWR(ASYNC)> ARCH

 2. 日志发送的配置
 主库的日志发送是由log_archive_dest_n参数设置(注意:同时还有一个和它相对应的开关参数log_archive_dest_state_n,用于指定该参数是否有效),下面简单介绍下该参数各个属性的含义。
 SERVICE(必须):指定备库的网络连接名;

SYNC/ASYNC(默认为ASYNC):指定日志的传输模式(同步/异步);

NET_TIMEOUT:指定当采用SYNC传输模式时,超过多少秒则表示网路超时(默认为30s),在使用SNYC模式时,强烈建议设置改参数;

AFFIRM/NOAFFIRM:AFFIRM表示只有当日志写入Standby重做日志后才算日志传输成功,NOAFFIRM则没有这个要求;

DB_UNIQUE_NAME:指定备库的DB_UNIQUE_NAME;

VALID_FOR:格式为(redo_log_type,database_role),只有这两个条件全部符合,才会发送日志;

其中redo_log_type有如下取值:ONLINE_LOGFILE, STANDBY_LOGFILE, ALL_LOGFILES

database_role有如下取值:PRIMARY_ROLE, STANDBY_ROLE, ALL_ROLES

REOPEN:指定当连接错误发生时,多少秒之后重试;

COMPRESSION:指定是否对日志进行压缩,已提高网络传输性能。

下面是log_archive_dest_n的一个例子:

 DB_UNIQUE_NAME=BOSTONLOG_ARCHIVE_CONFIG=\'DG_CONFIG=(BOSTON,CHICAGO,HARTFORD)\' LOG_ARCHIVE_DEST_2=\'SERVICE=CHICAGO ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILE, PRIMARY_ROLE) REOPEN=60 COMPRESSION=ENABLE  DB_UNIQUE_NAME=CHICAGO\' LOG_ARCHIVE_DEST_STATE_2=\'ENABLE\' LOG_ARCHIVE_DEST_3=\'SERVICE=HARTFORD SYNC AFFIRM NET_TIMEOUT=30 VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) REOPEN=60 COMPRESSION=ENABLE   DB_UNIQUE_NAME=HARTFORD\' LOG_ARCHIVE_DEST_STATE_3=\'ENABLE\'
 3. 日志接受的配置
 在备库,当RFS进程接受到日志后,就将其写入Standby日志文件里,备库的Standby日志文件可以看做是主库在线日志文件的一个镜像,当主库做日志切换时,备库的Standby日志也做相应的切换,切换后的Standby日志由备库的ARCH进程归档。 

Oracle规定备库的Standby日志文件大小不能小于主库在线日志文件最大的一个,一般情况下,为了管理方便,最好把所有的在线日志和Standby日志大小设为一样。

Oracle还规定备库的Standby日志文件至少要比主库的在线日志文件多一组。

通过下面语句可以查询主库在线日志的大小和组数:

SQL> SELECT GROUP#, BYTES FROM V$LOG;通过下面的语句可以查询备库Standby日志的大小和组数:

SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;假设主库有两组在线日志,每个日志文件大小为500M,那么我们至少需要3组Standby,且每个日志文件大小不少于500M:

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog1.rdo') SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog2.rdo') SIZE 500M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog3.rdo') SIZE 500M;

上面提到过,备库的Standby日志也会被归档,它的归档路径由备库的log_archive_dest_n参数的location属性设置,如下所示:

LOG_ARCHIVE_DEST_1 = \'LOCATION = /disk2/archiveVALID_FOR=(STANDBY_LOGFILE,STANDBY_ROLE)\'LOG_ARCHIVE_DEST_STATE_2=ENABLE

4. 日志传输状态的监控

第一步:在主库执行如下语句获得最新归档序列号:

SQL> SELECT MAX(SEQUENCE#), THREAD# FROM V$ARCHIVED_LOG GROUP BY THREAD#;

第二步:在主库执行如下语句确认最新归档的日志是否已经传输至备库:

SQL> SELECT DESTINATION, STATUS, ARCHIVED_THREAD#, ARCHIVED_SEQ# FROM V$ARCHIVE_DEST_STATUS   WHERE STATUS <> 'DEFERRED' AND STATUS <> 'INACTIVE';
DESTINATION         STATUS  ARCHIVED_THREAD#  ARCHIVED_SEQ#
------------------  ------  ----------------  -------------
/private1/prmy/lad   VALID                 1            947           standby                                                  ## 947如果状态不是VALID,则说明日志传输失败。

5. 手动解决日志传输GAP

Oracle DG会自动检测日志传输GAP并自动解决,但有时候GAP无法自动解决,必须DBA人工干预,下面我们讲讲手动解决的步骤:

首先,在备库执行下列语句查询是否有GAP:

SQL> SELECT * FROM V$ARCHIVE_GAP;    
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
-----------  -------------  --------------          
1              7              10                                                 ##HIGH_SEQUENCE   #减去LOW_SEQUENCE#就是当前的GAP数,上例显示备库缺少从7到10(不包含10)的归档日志。

接着,在主库查询这些归档日志的目录位置:

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
NAME
--------------------------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc /primary/thread1_dest/arcr_1_8.arc /primary/thread1_dest/arcr_1_9.arc

把这些归档日志从主库拷贝至备库,并在备库上注册:

SQL> ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_7.arc';
SQL> ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_8.arc';
SQL> ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_9.arc‘’;

Oracle DataGuard日志传输的更多相关文章

  1. ORACLE DATAGUARD 日志传输状态监控

    ORACLE DATAGUARD的主备库同步,主要是依靠日志传输到备库,备库应用日志或归档来实现.当主.备库间日志传输出现GAP,备库将不再与主库同步.因此需对日志传输状态进行监控,确保主.备库间日志 ...

  2. dataguard 日志传输服务

    1.日志传输可以分为 lgwr和ARCH,默认是arch,其中lgwr传输可以分为async和syncsync:同步服务,只有在事物参数的日志成功的传输到备库的目的地,事物才能提交.虽然同步服务没有限 ...

  3. 关于11G DataGuard 日志传输的案例

    案例探讨 在归档和非归档模式下,配置参数log_archive_dest_2后,DG的备库是否传输日志. 案例环境描述 本次环境如下,一套RAC+单机DG,然后从DG还原出来一个单独的测试库A,测试库 ...

  4. Oracle DataGuard主库丢失归档日志后备库的RMAN增量恢复一例

    第一部分  问题描述和环境状态确认 ----1. 问题场景 Oracle DataGuard主库丢失archivelog,如何不重建备库完成同步? 在Oracle DataGuard主从同步过程中可能 ...

  5. Dataguard中日志传输服务

    之前,原本已经尝试过配置oracle实例的逻辑和物理standby结构,并且做个一些role交换操作,可是由于昨天学习rman的部分命令时没留意,误删掉了primary DB上的所有归档日志,因为原来 ...

  6. Oracle Dataguard之switchover

    Oracle Dataguard的角色转换包含两类:Switchover和Failover.Switchover指主备之间角色转换,主库降为备库,备库升级为主库.而failover则是指主库出现问题时 ...

  7. Oracle Dataguard之Real-Time Apply

    Oracle Dataguard一共支持三种模式:最大可用模式(Maximum Availability),最大性能模式(Maximum Performance),最大保护模式(Maximum Pro ...

  8. Oracle Dataguard的原理与基本配置

    最近集团在做灾备方案,用于Oracle的高可用性,在不影响主库性能的前提下,我们选择使用DG的"最大性能"模式.   DG是Oracle数据库自带的数据同步功能,其基本原理是将日志 ...

  9. Oracle DataGuard 物理Standby 搭建(上)

    物理standby database 环境搭建 Arch asysnc Oracle Dataguard host IP Oracle_sid DB_unique_name FAL_server FA ...

随机推荐

  1. 详解微信小程序支付流程

    转发博主 https://blog.csdn.net/qq_38378384/article/details/80882980 花了几天把小程序的支付模块接口写了一下,可能有着公众号开发的一点经验,没 ...

  2. 两台电脑使用ROS通讯

    一.ROS分布式多机通讯简介 ROS是一种分布式软件框架,节点之间通过松耦合的方式组合,在很多应用场景下,节点可以运行在不同的计算平台上,通过Topic,Service通信. 但是各个节点只能共同拥有 ...

  3. CDH平台搭建解决离线安装依赖包的方法

    背景介绍: 1CDH开发平台在搭建的过程中,会遇到各种各样的问题,其中的各种依赖就是一个很让人头痛的问题.如果安装脚本文件出现了这种问题,那么就可以把以下的这种方法加入shell中,但是不要用yum来 ...

  4. AngularJs——基础小知识(二)

    AngularJs的过滤器 1.Currency :过滤器(金额货币格式化)       

  5. Soap从入门到实战

    Soap从入门到实战 参考文章:https://howtodoinjava.com/spring-boot/spring-soap-client-webservicetemplate/ 使用的技术:s ...

  6. [Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  7. httplib模块:(一个相对底层的http请求模块)

    httplib是一个相对底层的http请求模块,期上有专门的包装模块,如urllib内建模块,goto第三方模块,但是封装的越高就约不灵活,比如urllib模块里的请求错误是就不会返回结果页的内容,只 ...

  8. Java Split()方法按点(.)切分注意细节

    按点(.)切分,必须要注意转义!如:split("\\."). 例子: public class Test { public static void main(String[] a ...

  9. java 类加载及实例化的调用顺序

    1.没有继承的情况 单独一个类的场景下,初始化顺序为依次为 静态变量和静态代码块(看两者的书写顺序),继承的基类的构造函数,成员变量,被调用的构造函数. 代码呈现: public class Test ...

  10. 伪类和伪元素,review

    总是分不太清楚,然后容易忘记这个概念,项目中又遇到了,复习一遍 问题 1.哪些常用的伪类?伪元素? 怎么记: 除了4个伪元素,其他都是伪类 哪四个伪元素?:before :after :first-l ...