归档日志管理

Oracle 归档模式配置、归档日志管理、空间优化策略

最后更新: 2026-04-15
页面目录

第六章:归档日志管理

文档信息
  • 适用版本:Oracle 12c / 19c / 21c
  • 阅读时间:约 40 分钟
  • 关键概念:归档模式、日志切换、归档空间管理

6.1 归档模式概述

6.1.1 归档 vs 非归档

┌─────────────────────────────────────────────────────────────────┐
│                    日志模式对比                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   NOARCHIVELOG (非归档)          ARCHIVELOG (归档)              │
│   ─────────────────────          ─────────────────              │
│                                                                 │
│   在线日志循环覆盖                在线日志归档保存                │
│        │                              │                        │
│        ▼                              ▼                        │
│   ┌─────────┐                    ┌─────────┐  ┌─────────┐      │
│   │ Redo01  │──覆盖──►│ Redo02  │  │ Redo01  │──归档──►│ ARC0001 │      │
│   └─────────┘                    └─────────┘  └─────────┘  └─────────┘      │
│        ▲                              │                        │        │
│        └──────────────────────────────┘                        │        │
│                                     ┌─────────┐  ┌─────────┐   │
│                                     │ Redo02  │──归档──►│ ARC0002 │   │
│                                     └─────────┘  └─────────┘   │
│                                                                 │
│   特点:                           特点:                        │
│   • 无法时点恢复                   • 支持完全恢复                │
│   • 只能冷备份                     • 支持热备份                  │
│   • DataGuard 不可用               • DataGuard 必需              │
│   • 日志空间自动回收               • 需要管理归档空间            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

6.1.2 开启归档模式

-- 1. 检查当前日志模式
SELECT log_mode FROM v$database;

-- 2. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 3. 启动到 MOUNT 状态
STARTUP MOUNT;

-- 4. 开启归档
ALTER DATABASE ARCHIVELOG;

-- 5. 打开数据库
ALTER DATABASE OPEN;

-- 6. 确认归档已开启
ARCHIVE LOG LIST;
-- 或
SELECT log_mode, open_mode FROM v$database;

6.2 归档配置

6.2.1 归档目的地配置

-- 本地归档(必需)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL' SCOPE=SPFILE;

-- 远程归档(DataGuard)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ORCLDG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCLDG' SCOPE=BOTH;

-- 启用/禁用归档目的地
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER;  -- 临时禁用

-- 查看归档配置
SELECT 
    dest_id,
    destination,
    status,
    binding,
    target
FROM v$archive_dest
WHERE destination IS NOT NULL;

6.2.2 日志切换策略

-- 手动切换日志
ALTER SYSTEM SWITCH LOGFILE;

-- 查看日志切换历史
SELECT 
    sequence#,
    first_time,
    next_time,
    ROUND((next_time - first_time) * 24 * 60, 2) as minutes
FROM v$log_history
ORDER BY sequence# DESC
FETCH FIRST 10 ROWS ONLY;

-- 查看当前日志状态
SELECT 
    group#,
    sequence#,
    bytes/1024/1024 as mb,
    status,
    archived
FROM v$log;

6.3 归档空间管理

6.3.1 空间监控

-- 查看归档空间使用
SELECT 
    destination,
    ROUND(SPACE_LIMIT/1024/1024/1024, 2) as limit_gb,
    ROUND(SPACE_USED/1024/1024/1024, 2) as used_gb,
    ROUND((SPACE_USED/SPACE_LIMIT)*100, 2) as usage_pct,
    NUMBER_OF_FILES
FROM v$recovery_file_dest;

-- 查看归档文件详情
SELECT 
    name,
    completion_time,
    blocks * block_size / 1024 / 1024 as size_mb
FROM v$archived_log
WHERE deleted = 'NO'
ORDER BY completion_time DESC;

6.3.2 归档清理策略

-- 方式1:基于 RMAN 保留策略
-- 配置保留策略(保留最近 7 天)
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

-- 删除过期归档
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

-- 方式2:基于备份次数(保留 2 份备份)
RMAN> DELETE ARCHIVELOG UNTIL SEQUENCE = 12345 THREAD = 1;

-- 方式3:强制删除(谨慎使用)
RMAN> DELETE FORCE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';

6.3.3 自动化清理脚本

#!/bin/bash
# archive_cleanup.sh - 归档日志自动清理

export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# 保留天数
RETENTION_DAYS=7

# 检查归档空间使用率
USAGE=$(sqlplus -s / as sysdba <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT ROUND((SPACE_USED/SPACE_LIMIT)*100, 0) FROM v\$recovery_file_dest;
EXIT;
EOF
)

# 如果使用率超过 80%,执行清理
if [ $USAGE -gt 80 ]; then
    echo "$(date): Archive usage is ${USAGE}%, cleaning up..."
    rman target / <<EOF
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$RETENTION_DAYS';
DELETE EXPIRED ARCHIVELOG ALL;
EXIT;
EOF
    echo "$(date): Cleanup completed"
else
    echo "$(date): Archive usage is ${USAGE}%, no cleanup needed"
fi

6.4 归档故障处理

6.4.1 常见故障

故障现象 原因 解决方案
ORA-00257: archiver error 归档空间满 清理归档或扩容
日志切换挂起 归档目的地不可用 检查磁盘/网络
归档 Gap 网络中断 使用 RMAN 增量恢复
归档延迟 I/O 性能问题 优化存储或增加 ARCn 进程

6.4.2 ORA-00257 处理

-- 1. 检查归档空间
SELECT * FROM v$recovery_file_dest;

-- 2. 临时增加归档进程(加速归档)
ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=4;

-- 3. 手动清理旧归档
-- 使用 RMAN 删除
-- 或移动到其他存储

-- 4. 临时切换归档目的地(应急)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/tmp/arch_temp' SCOPE=MEMORY;

-- 5. 数据库恢复
ALTER SYSTEM RESUME;  -- 如果之前挂起了归档

6.5 本章小结

核心要点
  1. 归档模式:DataGuard 和时点恢复的基础
  2. 空间管理:定期清理,设置告警阈值
  3. 保留策略:根据 RPO 要求设置保留期
  4. 监控重点:空间使用率、日志切换频率、归档延迟

下一步:学习 第十四章:闪回技术详解