Oracle备库GV$ARCHIVED_LOG.APPLIED的最新归档日志状态为"IN-MEMORY"(已经应用成功)对应主库的状态为"NO"

Oracle备库GV$ARCHIVED_LOG.APPLIED的最新归档日志状态为"IN-MEMORY"对应主库的状态为"NO"

问题

公司数据库每天的0,6,12,18这几个时间点均进行归档备份并删除操作,在OEM查看RMAN的备份状态总是"COMPLETED WITH WARNINGS"。

具体查看备份日志,发现的报错如下:

在主库归档删除策略为:CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

则报错为:RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process

在主库归档删除策略为:CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;

则报错为:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby

[oracle@XXXXXX1 2021-03-03]$ ll -ltrh *.log
-rw-r--r-- 1 oracle oinstall 7.2K Mar  2 23:56 rman_archbak_20210303000001.log
-rw-r--r-- 1 oracle oinstall  29K Mar  3 01:44 rman_db1_20210303.log
-rw-r--r-- 1 oracle oinstall 6.1K Mar  3 05:56 rman_archbak_20210303060001.log
-rw-r--r-- 1 oracle oinstall 7.2K Mar  3 11:57 rman_archbak_20210303120001.log
-rw-r--r-- 1 oracle oinstall 7.2K Mar  3 17:57 rman_archbak_20210303180001.log
[oracle@XXXXXX1 2021-03-03]$ grep RMAN- *.log 
rman_archbak_20210303000001.log:RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process
rman_archbak_20210303060001.log:RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process
rman_archbak_20210303120001.log:RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process
rman_archbak_20210303180001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_db1_20210303.log:RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process[oracle@XXXXXX1 2021-03-03]$ 
[oracle@XXXXXX1 2021-03-03]$ cd ../2021-03-04
[oracle@XXXXXX1 2021-03-04]$ ll -ltrh *.log
-rw-r--r-- 1 oracle oinstall 7.5K Mar  3 23:56 rman_archbak_20210304000001.log
-rw-r--r-- 1 oracle oinstall  32K Mar  4 01:45 rman_db1_20210304.log
-rw-r--r-- 1 oracle oinstall 7.1K Mar  4 05:56 rman_archbak_20210304060001.log
-rw-r--r-- 1 oracle oinstall 7.9K Mar  4 11:56 rman_archbak_20210304120001.log
-rw-r--r-- 1 oracle oinstall 7.2K Mar  4 17:57 rman_archbak_20210304180001.log
[oracle@XXXXXX1 2021-03-04]$ grep RMAN- *.log 
rman_archbak_20210304000001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304060001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304060001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304060001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304060001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304060001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304120001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_archbak_20210304180001.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_db1_20210304.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_db1_20210304.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_db1_20210304.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_db1_20210304.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
rman_db1_20210304.log:RMAN-08120: WARNING: archived log not deleted, not yet applied by standby

探究

数据库架构为双节点RAC+单节点ADG。

每次查看主库GV$ARCHIVED_LOG.APPLIED的值为"NO"的记录,总是存在并且只有一条。

而且该条记录对应的归档总是其中一个节点(有时候是1节点有时候是2节点都有可能)的最新产生的归档日志序列号。

如下,查看APPLIED='NO'的记录此刻为日志序列号40031的归档日志,并且该归档日志为当前1节点最新的归档日志。

14:53:32 SYS@XXXXXX1(1862)> select recid, dest_id, thread#, sequence#, first_time, completion_time, creator, registrar, archived, applied, deleted, status from v$archived_log where standby_dest='YES' and status='A' and applied='NO';

     RECID    DEST_ID    THREAD#  SEQUENCE# FIRST_TIME          COMPLETION_TIME     CREATOR               REGISTRAR             ARCHIVED  APPLIED                     DELETED   STA
---------- ---------- ---------- ---------- ------------------- ------------------- --------------------- --------------------- --------- --------------------------- --------- ---
     83754          2          1      40031 2021-03-05 14:00:16 2021-03-05 14:30:15 LGWR                  LGWR                  YES       NO                          NO        A

Elapsed: 00:00:00.08
14:53:36 SYS@XXXXXX1(1862)> select thread#,max(sequence#) "Last Primary Seq Generated" from v$archived_log val,v$database vdb where val.resetlogs_change#=vdb.resetlogs_change# group by thread# order by 1;

   THREAD# Last Primary Seq Generated
---------- --------------------------
         1                      40031
         2                      27724

Elapsed: 00:00:00.08
14:54:27 SYS@XXXXXX1(1862)> select * from v$log order by THREAD#,SEQUENCE#;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS                                           FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --------- ------------------------------------------------ ------------- ------------------- ------------ -------------------
         3          1      40029 1073741824        512          2 YES       INACTIVE                                            2.2413E+11 2021-03-05 13:00:15   2.2413E+11 2021-03-05 13:30:17
         1          1      40030 1073741824        512          2 YES       INACTIVE                                            2.2413E+11 2021-03-05 13:30:17   2.2413E+11 2021-03-05 14:00:16
         4          1      40031 1073741824        512          2 YES       INACTIVE                                            2.2413E+11 2021-03-05 14:00:16   2.2414E+11 2021-03-05 14:30:15
         2          1      40032 1073741824        512          2 NO        CURRENT                                             2.2414E+11 2021-03-05 14:30:15   2.8147E+14
        13          2      27722 1073741824        512          2 YES       INACTIVE                                            2.2413E+11 2021-03-05 13:00:15   2.2413E+11 2021-03-05 13:30:14
        11          2      27723 1073741824        512          2 YES       INACTIVE                                            2.2413E+11 2021-03-05 13:30:14   2.2413E+11 2021-03-05 14:00:13
        14          2      27724 1073741824        512          2 YES       INACTIVE                                            2.2413E+11 2021-03-05 14:00:13   2.2414E+11 2021-03-05 14:30:15
        12          2      27725 1073741824        512          2 NO        CURRENT                                             2.2414E+11 2021-03-05 14:30:15   2.8147E+14

8 rows selected.

Elapsed: 00:00:00.01

在主库创建测试表,备库立马可以看到新建的表,同步时间基本保持在毫秒级别内不存在GAP和大的延迟。

从备库的警告日志看,40031的日志在14:26:53秒就在备库归档成功,但是从上边查询记录看,14:53:32主库的查看结果为APPLIED='NO'。

查询备库的应用情况,40031的状态为"IN-MEMORY",当前的MRP进程应用日志为主库V$LOG.STATUS='CURRENT'的40032(表示实时同步):

14:52:53 SYS@xxxxxxstb(1308)> select sequence#  from gv$archived_log where applied ='IN-MEMORY';

 SEQUENCE#
----------
     40031

Elapsed: 00:00:00.14
14:52:54 SYS@xxxxxxstb(1308)> select process, pid, status, thread#, sequence#, block# from v$managed_standby where process='MRP0';

PROCESS                            PID STATUS                                  THREAD#  SEQUENCE#     BLOCK#
--------------------------- ---------- ------------------------------------ ---------- ---------- ----------
MRP0                             15085 APPLYING_LOG                                  1      40032     643116

Elapsed: 00:00:00.00

到这里就有点奇怪了,40031已经在备库应用了,只不过备库的400031的APPLIED='IN-MEMORY'。

但确实是应用了,主库40031的APPLIED状态没实时更新为YES。

原因

根据文档The Latest Archivelog On Standby Database Keep The Status Of In-Memory (文档 ID 1384371.1)中指出(右键翻译中文),

备库最新日志状态为"IN-MEMORY",表示已完全应用存档的日志,但恢复检查点尚未移出日志。

从Broker的角度来看,“ IN-MEMORY”等效于“ YES”,因为Broker关心是否已通过恢复应用日志,而不关心日志是否已被检查点。

从RMAN的角度来看,“ IN-MEMORY”等效于“ NO”,因为RMAN只关心是否可以删除日志。幸运的是,此txn不需要更改RMAN,因为今天查看此列的所有RMAN代码都会检查该值是“ YES”或者不是“ YES”。

通常,只有在运行备用恢复时(或在备用实例崩溃后),才能在备用数据库上看到此值。

当备用恢复会话结束时,只要实例不死,任何“内存中”状态都将更改为“是”或“否”。如果恢复正常,恢复将检查所有内容,从而使所有处于“ IN-MEMORY”状态的归档日志都变为“ YES”。如果异常结束并且恢复无法将检查点移到前面,则所有未完全检查点的具有“ IN-MEMORY”状态的日志都将更改为“ NO”。如果备用实例崩溃,则不会执行此操作。

状态“IN-MEMORY”来自Oracle 11g恢复概念的变化。 在以前的版本中,一旦完全读取了日志文件(已到达日志文件的最后一个SCN),我们将执行完整的恢复检查点,即。 此日志序列中的所有更改都将写入数据库文件中,并且标题和控制文件也将更新。

从Oracle 11g开始,我们执行某种“延迟检查点”,实际上我们在以后的某个时间执行该检查点,以提高恢复和整体性能。 因此,当状态为“内存中”时,这意味着在实例中更改了相应的块,但是这些更改尚未写入数据库文件中。 因此,我们必须使那些ArchiveLogs保持可用,因为在发生崩溃的情况下,我们仍然需要那些ArchiveLogs从数据库文件中的最后一个SCN恢复恢复。
因此,这是您案例中的预期行为。

也就是说,这是正常的。

那么要解决RMAN的报错,可以直接忽略该报错。

要么就是先备份归档日志,再删除半个小时前的已经被备份的归档日志了(数据库强制每半个小时归档一次)。

参考

The Latest Archivelog On Standby Database Keep The Status Of In-Memory (文档 ID 1384371.1)

v$archived_log: applied column is not marked if recovery applied the redo from SRL (文档 ID 1481927.1)

原文地址:https://www.cnblogs.com/PiscesCanon/p/14486731.html