深入理解LOG_ARCHIVE_DEST_n与STANDBY_ARCHIVE_DEST

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:深入理解LOG_ARCHIVE_DEST_n与STANDBY_ARCHIVE_DEST

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

一、案例引入
朋友的dg配置如下,问我为什么归档日志都放在了use_db_recovery_file_dest

主库
log_archive_dest_1='location=/U01/app/oracle/oradata/bfodb/arch,valid_for=(ONLINE_LOGFILE,ALL_ROLES)'
log_archive_dest_2='service=tnsname,ARCH SYNC NOAFFIRM delay=0 OPTIONAL max_failure=0 max_connections=1   reopen=300  register net_timeout=180  valid_for=(online_logfile,primary_role)'
standby_archive_dest='location=use_db_recovery_file_dest'
备库
log_archive_dest_1='location=/U01/app/oracle/oradata/bfodb/arch,valid_for=(ONLINE_LOGFILE,ALL_ROLES)'
log_archive_dest_2='location=location=use_db_recovery_file_dest,valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)'
standby_archive_dest='location=use_db_recovery_file_dest'

我很惯性的回答,直接传输过来的日志放到LOG_ARCHIVE_DEST_n下面,fal_*过来的归档放置在standby_archive_dest中,也没有过多的思考为什么,因为我们的库都是这样的规则,我已经认为是一种准则了。这个规则也整合符合了他们的要求(都在use_db_recovery_file_dest)中,没有仔细的去看他们的配置,当朋友说到valid_for的属性的时候,我感觉有点不对头了。
1)他们的log_archive_dest_1配置的是ONLINE_LOGFILE,这个是备库,所以肯定不会放到这里
2)难道是通过log_archive_dest_2使得直接传输过来的日志放置到了use_db_recovery_file_dest中?让朋友查询v$standby_log,发现他们的库没有使用standby redo logfile,也就是说,log_archive_dest_2不可能用来传输日志了,现在剩下来可以传输日志的,只有standby_archive_dest了。
3)问题解决了,都传输到use_db_recovery_file_dest,因为LOG_ARCHIVE_DEST_n都不能用(只是从排除法证明)

二、问题深入分析
standby_archive_dest和log_archive_dest_*到底有什么关系,在什么情况下传输到对应的目录中?

如果备库利用standby redo log在备库端自动归档,那么归档日志将会被放置到LOG_ARCHIVE_DEST_n
如果备库是利用主库的arch进程传输过来的归档,那么将会被放置到STANDBY_ARCHIVE_DEST
补充说明:
1)主库的LOG_ARCHIVE_DEST_n='service'默认的arch传输方式,primary会远程将archived log传输到standby_archive_dest下
2)fal_*是通过arch传输过来的,所以使用的是STANDBY_ARCHIVE_DEST目录,如果不存在这个目录,就使用LOG_ARCHIVE_DEST_n
3)If both parameters are specified, the STANDBY_ARCHIVE_DEST initialization parameter
  overrides the directory location specified with the LOG_ARCHIVE_DEST_n parameter.
如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n两个参数指定,STANDBY_ARCHIVE_DEST初始化覆盖LOG_ARCHIVE_DEST_n目录指定位置参数。
4)If none of the initialization parameters have been specified, then archived redo log files are stored in the default location for the STANDBY_ARCHIVE_DEST initialization parameter.
如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n都没有配置,将会把归档日志放到STANDBY_ARCHIVE_DEST的默认目录
5)如果STANDBY_ARCHIVE_DEST未配置,而配置了LOG_ARCHIVE_DEST_n,那么产生的归档将放置到LOG_ARCHIVE_DEST_n
6)建议:STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n=‘location’的配置相同
7)在11g,已经不建议使用STANDBY_ARCHIVE_DEST,也就是说建议配置dg的时候尽量使用standby redo logfile

One thought on “深入理解LOG_ARCHIVE_DEST_n与STANDBY_ARCHIVE_DEST

  1. 大哥,一直关注你的博客,在你博客里学习很多知识,非常感谢。但是看到这篇文章有些疑问,我翻阅了相关ORACLE 联机文档,在这里提出一下我的理解,你朋友的问题我理解是这样的:
    先看主库参数
    主库
    log_archive_dest_1=’location=/U01/app/oracle/oradata/bfodb/arch,valid_for=(ONLINE_LOGFILE,ALL_ROLES)’
    —本地归档:online_logfile,主库有online_logfile ,有效,没什么好解释的:)。
    log_archive_dest_2=’service=tnsname,ARCH SYNC NOAFFIRM delay=0 OPTIONAL max_failure=0 max_connections=1 reopen=300 register net_timeout=180 valid_for=(online_logfile,primary_role)’standby_archive_dest=’location=use_db_recovery_file_dest’
    —远程归档:log_archive_dest_2 valid_for 属性指定主库传输online_logfile 到standby 端,但却指定使用ARCH 进程传输–ARCH无法传输online_logfile,所以应该按默认属性,主库使用 ARCH 传输归档日志。那主库的归档日志传输到备库的什么位置上呢?—如果备库启用standby log,那么ARCH会把日志写到standby 端的standby log 上,但是备库没有standby log ,所以只能传输到主库中参数standby_archive_dest 指定位置。
    再看备库参数:
    备库
    log_archive_dest_1=’location=/U01/app/oracle/oradata/bfodb/arch,valid_for=(ONLINE_LOGFILE,ALL_ROLES)’
    –本地归档online_logfile:因为这是在备库,备库没有online_logfile,这个参数在备库是无效的,官方文档也有说明。
    log_archive_dest_2=’location=location=use_db_recovery_file_dest,valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)’standby_archive_dest=’location=use_db_recovery_file_dest’
    —-location 指定归档到本地,valid_for 属性指定归档standby_logfile,你文中有提到备库没有启用standby log,所以这个参数指定的归档无效.
    所以总结如下:
    log_archive_dest_n 和standby_archive_dest 应该没有什么必然的联系,我认为standby_archive_dest目前的作用就是
    在log_archive_dest_n无效的情况下,主库把日志传输到备库的一个路经。
    真正影响主库传输日志到远程哪个路经的还是log_archive_dest_n,还要看是使用LGWR 还是ARCH进程传输,还有备库是否启用standby log 以及 log_archive_dest_n valid_for 属性。
    以上不对之处,请指正。谢谢。

  2. tomcat,
    Typically, when redo data is received from the primary database, the redo data is
    written to archived redo log files that are stored in the directory you specify with the
    LOCATION attribute of the LOG_ARCHIVE_DEST_n parameter. Alternatively, you can
    specify the STANDBY_ARCHIVE_DEST initialization parameter on the standby
    database to indicate an alternate directory where the archived redo log files are to be
    stored when received from the primary database.
    If both parameters are specified, the STANDBY_ARCHIVE_DEST initialization
    parameter overrides the directory location specified with the LOG_ARCHIVE_DEST_n
    parameter.
    The location where archived redo log files are stored on the standby database is
    determined according to the following list of rules. When the database instance is
    started, the archived redo log files are evaluated in the list order:
    1. If the STANDBY_ARCHIVE_DEST initialization parameter is specified on the
    standby database, that location is used.
    2. If the LOG_ARCHIVE_DEST_n parameter contains the VALID_FOR=(STANDBY_
    LOGFILE,*) attribute, then the location specified for this destination is used.
    3. If the COMPATIBLE parameter is set to 10.0 or greater and none of the LOG_
    ARCHIVE_DEST_n parameters contain the VALID_FOR=(STANDBY_
    LOGFILE,*)attribute, then an arbitrary LOG_ARCHIVE_DEST_n parameter that is
    valid for the destination is used.
    4. If none of the initialization parameters have been specified, then archived redo log
    files are stored in the default location for the STANDBY_ARCHIVE_DEST
    initialization parameter.
    To see the implicit default value of the STANDBY_ARCHIVE_DEST initialization
    parameter, query the V$ARCHIVE_DEST view:

发表评论

邮箱地址不会被公开。 必填项已用*标注

5 + 2 =