Oracle 归档日志删除策略配置详解与 RMAN 报错处理
常见 RMAN 报错
RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process
RMAN-08137: WARNING: archive log not deleted as it is still needed
# 在新版本中,错误可能为:
RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
RMAN-08591: WARNING: invalid archivelog deletion policy
RMAN-08591 处理
configure ARCHIVELOG DELETION POLICY clear;
常见误区
以前一直以为归档删除策略就只是限制归档日志被误删除。其实即便是设置 TO NONE,如果归档日志没有被备份过且归档日志均已传输至所指定的所需远程目标 LOG_ARCHIVE_DEST_n 的话,也是没有办法被删除的。
另外归档删除策略对于 BACKUP ... DELETE INPUT、DELETE ARCHIVELOG 或 DELETE OBSOLETE 命令均生效。在 10G 中,如 DELETE ARCHIVELOG 或 DELETE INPUT 不遵守这个配置(参考文档 ID 1577382.1)。
另外,对于在 FRA 里的归档日志,Oracle 会根据策略自动删除。
归档删除策略的持久配置说明
以下基于 11gR2 版本整理:
| 语法元素 | 描述 |
|---|---|
| ARCHIVELOG DELETION POLICY | 确定何时可以删除已归档的重做日志文件。 归档的日志删除策略适用于所有日志归档目标,包括快速恢复区域。该策略不适用于备份集中的归档重做日志文件。 数据库仅自动删除快速恢复区域中的已归档重做日志文件。您可以执行 BACKUP ... DELETE INPUT、DELETE ARCHIVELOG 或 DELETE OBSOLETE 命令从日志归档目标,包括恢复区手动删除日志。如果 FORCE 未在删除命令上指定,则这些删除命令将遵循已归档的日志删除策略。如果 FORCE 指定,则删除命令将忽略存档的日志删除策略。 在恢复区域中,数据库会尽可能长地保留符合删除条件的日志。需要磁盘空间时,数据库将首先删除最早的日志。当恢复区域处于磁盘压力下时,数据库可能会删除 Oracle Streams 所需的存档重做日志文件。 注意:删除策略不适用于外部归档的重做日志文件,这些文件是逻辑备用数据库为 LogMiner 会话接收的日志。其他地方的说明:(11gR2) |
| TO APPLIED ON [ALL] STANDBY | 指定如果同时满足以下两个条件,则可以删除已归档的重做日志文件: 1. 已将已归档的重做日志文件应用于所需的备用数据库。 2. BACKED UP ... TIMES TO DEVICE TYPE 删除策略不需要日志。如果 BACKED UP 未设置该策略,则始终满足此条件。 考虑哪些远程目标取决于以下条件: 1. 如果未指定 ALL,则在将归档的重做日志文件应用于所有 mandatory 远程目标之后,它们才有资格删除。 2. 如果指定 ALL,则已归档的重做日志文件在所有远程目标(无论是否 mandatory)上应用或消耗后才是具备条件的。 例如,备用数据库 sby1 可能是唯一接收日志的远程目标,但是其他远程目标可以通过引用上的相同位置来应用日志 sby1。使用 ALL,sby1 在不需要时立即将主数据库上的日志标记为已使用,但是直到该日志被引用相同位置的所有其他从属远程目标应用或使用后,才允许删除该日志。注意:TO APPLIED 与 NONE 或 TO SHIPPED 子句组合指定子句是无效的。另请参见相关文档以获取详细信息。 |
| TO NONE | 禁用存档的日志删除策略。这是默认设置。 归档的重做日志文件可以位于快速恢复区域的内部或外部。可以通过手动命令删除任何位置的日志。数据库只能自动删除快速恢复区域中的日志。 如果将删除策略设置为 NONE,则 RMAN 如果满足以下两个条件,则认为已归档的重做日志文件符合删除条件: 1. 归档的重做日志文件(无论是在 Fast Recovery Area 中还是在其外部)均已传输至所指定的所需远程目标 LOG_ARCHIVE_DEST_n。 2. Fast Recovery Area 中的存档重做日志文件已至少备份一次到磁盘或 SBT,或者根据备份保留策略,这些日志已过时。 仅当 guaranteed restore point 不需要日志并且 Flashback Database 不需要日志时,备份保留策略才认为日志已过时。如果日志创建时间晚于 SYSDATE-'DB_FLASHBACK_RETENTION_TARGET',则 Flashback Database 需要已归档的重做日志文件。 例如,假设已将已归档的重做日志文件传输到所需的远程目标。根据恢复窗口保留策略,日志已过时,但尚未备份。在这种情况下,日志可以删除。或者,假设日志已过时并且已备份到 SBT,但尚未传输到所需的远程目标。在这种情况下,日志不符合删除条件。 如果删除策略设置为 NONE,并且对快速恢复区域之外的归档重做日志文件执行删除命令,则 RMAN 仅遵守在删除命令上指定的条件。 |
| TO SHIPPED TO [ALL] STANDBY | 指定如果同时满足以下两个条件,则可以删除已归档的重做日志文件: 1. 归档的重做日志文件已传输到所需的远程目标。 2. TO SHIPPED TO … STANDBY 或 TO APPLIED ON … STANDBY 删除策略不需要日志。如果未设置任何备用删除策略,则始终满足此条件。 考虑哪些远程目标取决于以下条件: 1. 如果未指定 ALL,则仅在传输到 mandatory 远程目标后才可以删除已归档的重做日志文件。 2. 如果指定 ALL,则在转移到所有远程目标(无论是否 mandatory)之后,都可以删除日志。 注意:TO SHIPPED 与 NONE 或 TO APPLIED 子句组合指定子句是无效的。另请参见相关文档以获取详细信息。 |
关于 MANDATORY 的含义,参考相关文档。
在 10gR2 中关于归档日志删除策略的描述,貌似是在基于 Fast Recovery Area 的前提下来进行的。
FRA 前提处配置示例:
-- Primary database
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY
-- Standby database (where backups are made)
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE
-- Other standby databases
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY
因此,若是手工删除,如果违反归档删除策略,就会报错 RMAN-08137,更高版本为 RMAN-08120。
另外,对于子句 TO APPLIED ON [ALL] STANDBY 和子句 TO SHIPPED TO [ALL] STANDBY 在设置归档删除策略的时候,报错 RMAN-08591: WARNING: invalid archivelog deletion policy。
原因是因为默认情况下,归档删除策略是基于 mandatory 的,有隐含参数 _log_deletion_policy 控制。
SQL> create or replace view h$parameter as
2 select a.ksppinm name,
3 a.ksppdesc description,
4 b.ksppstvl session_value,
5 c.ksppstvl system_value
6 from x$ksppi a, x$ksppcv b, x$ksppsv c
7 where a.indx = b.indx
8 and a.indx = c.indx;
View created.
SQL> set line 500
SQL> col name for a25
SQL> col DESCRIPTION for a70
SQL> col SESSION_VALUE for a15
SQL> col SYSTEM_VALUE for a15
SQL> select * from h$parameter where name='_log_deletion_policy';
NAME DESCRIPTION SESSION_VALUE SYSTEM_VALUE
------------------------- ---------------------------------------------------------------------- --------------- ---------------
_log_deletion_policy archivelog deletion policy for mandatory/ destination mandatory mandatory
关于 RMAN-08591,测试了如下两条语句(测试版本为 11.2.0.4.0):
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
前提条件 log_archive_dest_N 为 optional,并且对应的 log_archive_dest_state_N 为 enable。
如果不带'ALL',报错 RMAN-08591。如果带'ALL',那就不会报错。
因为根据上边 TO APPLIED ON [ALL] STANDBY 的说明,带有'ALL'的时候,确定远程目标包括了 optional 和 mandatory。不带'ALL'则只包含 mandatory。
那么如何解决 RMAN-08591?
3 种方法:
- 设置远程目标 log_archive_dest_N 的时候加上 mandatory 参数
- 使用如下语句来配置归档删除策略:
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
- 修改参数
_log_deletion_policy为 ALL(文档 ID 1577382.1,文档 ID 1602424.1 表示修改此参数需要重启 DB,但是实际可以动态修改并生效):
alter system set "_log_deletion_policy"='ALL' scope=both;
建议使用第 2、3 种方法,第 1 种在 FRA 空间紧张的时候会导致无法对 redolog 做归档。

