zoukankan      html  css  js  c++  java
  • Archivelog Completed Before VS UNTIL TIME

    有网友在T.ASKMACLEAN.COM上 提问关于"DELETE ARCHIVELOG ALL COMPLETED BEFORE" 与 "DELETE ARCHIVELOG UNTIL TIME "的区别。为了了解这2个命令细微的差别,我们先来温习一些 ARCHIVED LOG的知识。  
    V$ARCHIVED_LOG:
    
    FIRST_TIME             DATE     Timestamp of the first change
    NEXT_TIME              DATE     Timestamp of the next change
    COMPLETION_TIME        DATE     Time when the archiving completed
        FIRST_TIME代表该归档日志中LOW SCN对应的时间戳, 而NEXT_TIME代表HIGH SCN对应的时间戳; COMPLETION_TIME指该日志实际归档成功的时间,当归档可以快速完成时 NEXT_TIME往往等于COMPLETION_TIME,但是也存在因为LOGFILE SIZE尺寸较大导致archive归档操作持续较长时间,导致 NEXT_TIME << COMPLETION_TIME的情况存在。     我们来看一个例子:   首先通过修改log_archive_max_processes=1,保证实例只拥有一个ARC0归档进程:    
    SQL> select * from V$version;
    
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
    PL/SQL Release 10.2.0.5.0 - Production
    CORE    10.2.0.5.0      Production
    TNS for Linux: Version 10.2.0.5.0 - Production
    NLSRTL Version 10.2.0.5.0 - Production
    
    SQL>
    SQL> select * from global_name;
    
    GLOBAL_NAME
    --------------------------------------------------------------------------------
    www.oracledatabase12g.com
    
    SQL> alter system set log_archive_max_processes=1;
    System altered.
    
    [oracle@vrh8 udump]$ ps -ef|grep arc|grep -v grep
    oracle   21777     1  0 07:22 ?        00:00:00 ora_arc0_G10R25
    
    SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
    Session altered.
    
    SQL> select  SEQUENCE#, FIRST_CHANGE# from v$log where status='CURRENT';
    
     SEQUENCE# FIRST_CHANGE#
    ---------- -------------
           232       2476748
        CURRENT LOGFILE当前在线日志的SEQUENCE#=232, FIRST_CHANGE#=2476748。 我们利用oradebug suspend 命令将ARC0归档后台进程强制挂起,这将导致归档长时间无法完成; 注意不要在生产环境做这样的操作!!    
    SQL> oradebug setospid 21777;
    Oracle pid: 20, Unix process pid: 21777, image: oracle@vrh8.oracle.com (ARC0)
    
    SQL> oradebug suspend;
    Statement processed.
    
    SQL> alter system switch logfile;
    
    System altered.
    
    SQL> alter system switch logfile;
    
    System altered.
    
    WAIT A MOMENT;
    
    SQL> select sequence#,name,first_time,next_time,COMPLETION_TIME from v$archived_log where sequence# =( select max(sequence#) from v$archived_log);
    
     SEQUENCE#
    ----------
    NAME
    --------------------------------------------------------------------------------
    FIRST_TIME          COMPLETION_TIME
    ------------------- -------------------
           231
    /s01/flash_recovery_area/G10R25/archivelog/2012_05_17/o1_mf_1_231_7v9rh2rg_.arc
    2012-05-17 07:32:44 2012-05-17 07:32:50
        可以看到手动suspend ARC0后switch logfile,归档没有照常发生,V$ARCHIVED_LOG中最大的SEQUENCE#仍是 231。 之后我们resume ARC0:  
    SQL> exec dbms_lock.sleep(60);
    
    SQL> oradebug resume;
    Statement processed.
    
    SQL>  set linesize 80  pagesize 1400;
    SQL>  select sequence#,name,first_time,next_time,COMPLETION_TIME from v$archived_log where sequence# =( select max(sequence#) from v$archived_log);
    
     SEQUENCE#
    ----------
    NAME
    --------------------------------------------------------------------------------
    FIRST_TIME          NEXT_TIME           COMPLETION_TIME
    ------------------- ------------------- -------------------
           232
    /s01/flash_recovery_area/G10R25/archivelog/2012_05_17/o1_mf_1_232_7v9s3dcf_.arc
    2012-05-17 07:32:50 2012-05-17 07:41:32 2012-05-17 07:43:40
        NEXT_TIME=07:41:32 而 COMPLETION_TIME= 07:43:40,相差了2分钟左右。   DUMP LOGFILE可以了解更多信息:    
    SQL> alter system dump logfile '/s01/flash_recovery_area/G10R25/archivelog/2012_05_17/o1_mf_1_232_7v9s3dcf_.arc';
    
    System altered.
    
    SQL> oradebug setmypid;
    Statement processed.
    
    SQL> oradebug tracefile_name
    /s01/admin/G10R25/udump/g10r25_ora_21848.trc
    
    SQL> !vi /s01/admin/G10R25/udump/g10r25_ora_21848.trc
    
     Low  scn: 0x0000.0025cacc (2476748) 05/17/2012 07:32:50
     Next scn: 0x0000.0025cb8f (2476943) 05/17/2012 07:41:32
     Enabled scn: 0x0000.0005eca9 (388265) 11/07/2011 03:58:11
     Thread closed scn: 0x0000.0025cacc (2476748) 05/17/2012 07:32:50
        以上我们复习了 关于ARCHIVED LOG 的FIRST_TIME和 COMPLETION_TIME的知识,接下来我们实际来了解"DELETE ARCHIVELOG ALL COMPLETED BEFORE" 与 "DELETE ARCHIVELOG UNTIL TIME "的区别。   RMAN会通过$ORACLE_HOME/rdbms/admin/recover.bsq将RMAN命令解析成PL/SQL包的调用,包括:DBMS_RCVMAN和DBMS_BACKUP_RESTORE等内置PACKAGE。   当使用BACKUP/DELETE ARCHIVELOG "Completed Before"/"UNTIL TIME"时DBMS_RCVMAN会调用以下一个SQL语句,查询V$ARCHIVED_LOG视图中是否有满足条件的归档日志:  
    HASH_VALUE=  3114867949
    
    SELECT :B20 TYPE_CON,
           RECID KEY_CON,
           RECID RECID_CON,
           STAMP STAMP_CON,
           TO_NUMBER(NULL) SETSTAMP_CON,
           TO_NUMBER(NULL) SETCOUNT_CON,
           TO_NUMBER(NULL) BSRECID_CON,
           TO_NUMBER(NULL) BSSTAMP_CON,
           TO_NUMBER(NULL) BSKEY_CON,
           TO_NUMBER(NULL) BSLEVEL_ CON,
           TO_CHAR(NULL) BSTYPE_CON,
           TO_NUMBER(NULL) ELAPSESECS_CON,
           TO_NUMBER(NULL) P IECECOUNT_CON,
           NAME FILENAME_CON,
           TO_CHAR(NULL) TAG_CON,
           TO_NUMBER(NULL) COPYNUM BER_CON,
           STATUS STATUS_CON,
           BLOCKS BLOCKS_CON,
           BLOCK_SIZE BLOCKSIZE_CON,
           'DISK' DEVICETYPE_CON,
           COMPLETION_TIME COMPTIME_CON,
           TO_DATE(NULL) CFCREATIONTIME_CON,
           TO_NUMBER(NULL) PIECENUMBER_CON,
           TO_DATE(NULL) BPCOMPTIME_CON,
           TO_CHAR(NULL) BPC OMPRESSED_CON,
           :B19 TYPE_ACT,
           TO_NUMBER(NULL) FROMSCN_ACT,
           TO_NUMBER(NULL) TOSCN _ACT,
           TO_DATE(NULL) TOTIME_ACT,
           TO_NUMBER(NULL) RLGSCN_ACT,
           TO_DATE(NULL) RLGTIM E_ACT,
           TO_NUMBER(NULL) DBINCKEY_ACT,
           TO_NUMBER(NULL) LEVEL_ACT,
           TO_NUMBER(NULL) DFNUMBER_OBJ,
           TO_NUMBER(NULL) DFCREATIONSCN_OBJ,
           TO_NUMBER(NULL) CFSEQUENCE_OBJ,
           TO_DATE(NULL) CFDATE_OBJ,
           SEQUENCE# LOGSEQUENCE_OBJ,
           THREAD# LOGTHREAD_OBJ,
           RES ETLOGS_CHANGE# LOGRLGSCN_OBJ,
           RESETLOGS_TIME LOGRLGTIME_OBJ,
           FIRST_CHANGE# LOGLO WSCN_OBJ,
           FIRST_TIME LOGLOWTIME_OBJ,
           NEXT_CHANGE# LOGNEXTSCN_OBJ,
           NEXT_TIME LOGN EXTTIME_OBJ,
           DECODE(END_OF_REDO_TYPE, 'TERMINAL', 'YES', 'NO') LOGTERMINAL_OBJ,
           T O_CHAR(NULL) CFTYPE_OBJ,
           TO_NUMBER(NULL) KEEP_OPTIONS,
           TO_DATE(NULL) KEEP_UNTIL,
           TO_NUMBER(NULL) AFZSCN_ACT,
           TO_DATE(NULL) RFZTIME_ACT,
           TO_NUMBER(NULL) RFZSCN_A CT,
           TO_CHAR(NULL) MEDIA_CON,
           IS_RECOVERY_DEST_FILE ISRDF_CON
      FROM V$ARCHIVED_LOG
     WHERE (:B18 IS NULL OR THREAD# = :B18)
       AND (:B17 IS NULL OR SEQUENCE# = :B17)
       AND (:B16 IS NULL OR FIRST_CHANGE# = :B16)
       AND (:B15 IS NULL OR NAME LIKE :B15)
       AND (:B14 IS NULL OR COMPLETION_TIME >= :B14)
       AND (:B13 IS NULL OR COMPLETION_TIME <= :B13)
       AND DECODE(:B10,
                  :B12,
                  DECODE(STATUS, 'A', :B9, :B11),
                  DBMS _RCVMAN.ISSTATUSMATCH(STATUS, :B10)) = :B9
       AND STANDBY_DEST = 'NO'
       AND (ARCHIVE D = 'YES')
       AND (:B8 IS NULL OR THREAD# = :B8)
       AND (:B7 IS NULL OR SEQUENCE# >= :B7)
       AND (:B6 IS NULL OR SEQUENCE# <= :B6)
       AND (:B5 IS NULL OR NEXT_CHANGE# > :B5)
       AND (:B4 IS NULL OR FIRST_CHANGE# < :B4)
       AND (:B3 IS NULL OR NAME LIKE :B 3)
       AND (:B2 IS NULL OR NEXT_TIME > :B2)
       AND (:B1 IS NULL OR FIRST_TIME <= :B1)
     ORDER BY RESETLOGS_CHANGE#,
              RESETLOGS_TIME,
              THREAD#,
              SEQUENCE#,
              LOGTERMINAL_OB    J DESC,
              STAMP_CON         DESC
        已知该语句的HASH_VALUE=3114867949 ,虽然该语句使用了绑定变量且似乎10046 TRACE capture不到其BIND VALUE,但仍可以通过v$sql_bind_capture视图找到:     当DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';执行时:  
    col name for a20
    col value_string for a50		  
    
    SQL> select name,value_string from v$sql_bind_capture where hash_value='3114867949';
    
    :B20
    :B19
    :B18                 NULL
    :B18                 NULL
    :B17                 NULL
    :B17                 NULL
    :B16                 NULL
    :B16                 NULL
    :B15                 NULL
    :B15                 NULL
    :B14                 NULL
    :B14                 NULL
    :B13                 NULL
    :B13                 NULL
    :B10                 27
    :B12                 1
    :B9                  1
    :B11                 0
    :B10                 27
    :B9                  1
    :B8                  NULL
    :B8                  NULL
    :B7                  NULL
    :B7                  NULL
    :B6                  NULL
    :B6                  NULL
    :B5                  NULL
    :B5                  NULL
    :B4                  NULL
    :B4                  NULL
    :B3                  NULL
    :B3                  NULL
    :B2                  NULL
    :B2                  NULL
    :B1                  05/10/12 07:15:26
    :B1                  05/10/12 07:15:26
    
    36 rows selected.
      其中有意义的绑定值为: :B1 05/10/12 07:15:26 =》即SYSDATE - 7 可以在上述SQL中找到相关条件:B1 IS NULL OR FIRST_TIME <= :B1,即 FIRST_TIME <= 'SYSDATE-7'; 即 UNTIL TIME 的TIME指的是 ARCHIVELOG的FIRST_TIME ,即归档日志中LOW SCN对应的时间戳;其意思为找出所有LOW SCN TIMESTAMP小于等于指定的时间变量的归档日志。   当DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';执行时:  
    SQL> select name,value_string from v$sql_bind_capture where hash_value='3114867949';
    
    :B20
    :B19
    :B18                 NULL
    :B18                 NULL
    :B17                 NULL
    :B17                 NULL
    :B16                 NULL
    :B16                 NULL
    :B15                 NULL
    :B15                 NULL
    :B14                 NULL
    :B14                 NULL
    :B13                 05/10/12 07:21:00
    :B13                 05/10/12 07:21:00
    :B10                 27
    :B12                 1
    :B9                  1
    :B11                 0
    :B10                 27
    :B9                  1
    :B8                  NULL
    :B8                  NULL
    :B7                  NULL
    :B7                  NULL
    :B6                  NULL
    :B6                  NULL
    :B5                  0
    :B5                  0
    :B4                  281474976710656
    :B4                  281474976710656
    :B3                  NULL
    :B3                  NULL
    :B2                  NULL
    :B2                  NULL
    :B1                  NULL
    :B1                  NULL
    其中有意义的绑定值为 :B13 05/10/12 07:21:00=> 'SYSDATE-7' SQL中的相关条件:B13 IS NULL OR COMPLETION_TIME <= :B13 即   COMPLETION_TIME <='SYSDATE=7'; COMPLETED BEFORE指的是ARCHIVELOG的COMPLETION_TIME,即实际归档操作完成的时间;其意思为找出所有归档完成时间小于指定的时间变量的归档日志。     当DELETE ARCHIVELOG ALL COMPLETED  AFTER    'SYSDATE-7';执行时:  
    SQL> select name,value_string from v$sql_bind_capture where hash_value='3114867949';
    
    :B20
    :B19
    :B18                 NULL
    :B18                 NULL
    :B17                 NULL
    :B17                 NULL
    :B16                 NULL
    :B16                 NULL
    :B15                 NULL
    :B15                 NULL
    :B14                 05/10/12 07:23:03
    :B14                 05/10/12 07:23:03
    :B13                 NULL
    :B13                 NULL
    :B10                 27
    :B12                 1
    :B9                  1
    :B11                 0
    :B10                 27
    :B9                  1
    :B8                  NULL
    :B8                  NULL
    :B7                  NULL
    :B7                  NULL
    :B6                  NULL
    :B6                  NULL
    :B5                  0
    :B5                  0
    :B4                  281474976710656
    :B4                  281474976710656
    :B3                  NULL
    :B3                  NULL
    :B2                  NULL
    :B2                  NULL
    :B1                  NULL
    :B1                  NULL
        :B14 IS NULL OR COMPLETION_TIME >= :B14,类似的AFTER操作仅仅是从小于等于变成了大于等于。 COMPLETED AFTER指的是ARCHIVELOG的COMPLETION_TIME,即实际归档操作完成的时间;其意思为找出所有归档完成时间大于等于指定的时间变量的归档日志。   Summary : UNTIL TIME的TIME  指的是 ARCHIVELOG的FIRST_TIME ,即归档日志中LOW SCN对应的时间戳;其意思为找出所有LOW SCN TIMESTAMP小于等于指定的时间变量的归档日志。 COMPLETED BEFORE  指的是ARCHIVELOG的COMPLETION_TIME,即实际归档操作完成的时间;其意思为找出所有归档完成时间小于指定的时间变量的归档日志。 COMPLETED AFTER   指的是ARCHIVELOG的COMPLETION_TIME,即实际归档操作完成的时间;其意思为找出所有归档完成时间大于等于指定的时间变量的归档日志。   Question: 搞清楚这些细节对实际的工作由什么意义?   Answer: ARCHIVELOG相关过滤条件 UNTIL TIME 和 COMPLETED BEFORE是存在区别的,在平时备份BACKUP时可能感受不到这种区别。 试想这样一个场景, SEQUENCE A 的ARCHIVELOG 的First TIME为 07:45 、 NEXT TIME为08:10、归档操作耗费了1分钟即COMPLETION_TIME为08:11 SEQUENCE A+1即后续的一个ARCHIVELOG的 FIRST TIME为08:10,NEXT TIME为08:30........ 我们以08:00为时间变量, 若使用DELETE  ARCHIVELOG UNTIL TIME 08:00 ,因为SENQUENCE A的FIRST_TIME <08:00,所以SEQUENCE A将被删除,若没有相应的归档备份或COPY,则意味着08:00~08:10 这段时间将变成unrecoverable; 若使用DELETE ARCHIVELOG ALL  COMPLETED  BEFORE 08:00,因为SENQUENCE A的COMPLETION_TIME>08:00,所以SEQUENCE A将不被删除。   来实际体验一下这个结论,SEQUENCE 232的 FIRST_TIME=2012-05-17 07:32:50, NEXT TIME=2012-05-17 07:41:32, COMPLETION_TIME=2012-05-17 07:43:40    
    RMAN> DELETE ARCHIVELOG  ALL COMPLETED BEFORE "to_timestamp('2012-05-17 07:40:00','YYYY-MM-DD hh24:mi:ss')";
    
    released channel: ORA_DISK_1
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=140 devtype=DISK
    
    RMAN> DELETE ARCHIVELOG  UNTIL TIME "to_timestamp('2012-05-17 07:40:00','YYYY-MM-DD hh24:mi:ss')";
    
    released channel: ORA_DISK_1
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=140 devtype=DISK
    
    List of Archived Log Copies
    Key     Thrd Seq     S Low Time  Name
    ------- ---- ------- - --------- ----
    39      1    232     A 17-MAY-12 /s01/flash_recovery_area/G10R25/archivelog/2012_05_17/o1_mf_1_232_7v9s3dcf_.arc
    
    Do you really want to delete the above objects (enter YES or NO)? y
    deleted archive log
    archive log filename=/s01/flash_recovery_area/G10R25/archivelog/2012_05_17/o1_mf_1_232_7v9s3dcf_.arc recid=39 stamp=783503020
    Deleted 1 objects
  • 相关阅读:
    双11享Go了吗?2017阿里双11在线峰会续写科技盛宴!
    python django 原生sql 获取数据
    python 操作mysql
    django post 请求传参
    Django post 报错
    django get请求传参
    windows8.1下装kali linux 2017.3双系统(最新版)
    Django 速成
    Galera将死——MySQL Group Replication正式发布
    Galera将死——MySQL Group Replication正式发布
  • 原文地址:https://www.cnblogs.com/macleanoracle/p/2968294.html
Copyright © 2011-2022 走看看