归档模式配置与切换

1、归档模式基本概念

Oracle 数据库运行时,所有数据修改操作(INSERT/UPDATE/DELETE/DDL)都会先写入在线重做日志组(Online Redo Log Group)。在线重做日志是循环覆盖的:当一组日志写满后,系统自动切换到下一组,当所有组都写满后,会回到第一组覆盖原有内容。

归档模式(ARCHIVELOG MODE) 是 Oracle 的一种运行模式,开启后,Oracle 会在每次日志切换时,将即将被覆盖的在线重做日志完整复制到指定的磁盘 / ASM 位置,生成的文件就是归档日志(Archive Log)。

与之相对的是非归档模式(NOARCHIVELOG MODE):日志切换时直接覆盖原有内容,不保留历史重做日志。

1.1、归档模式 vs 非归档模式

对比维度 归档模式 非归档模式
数据恢复能力 支持时间点恢复(PITR),可恢复到故障前任意时刻 只能恢复到最近一次全量备份时刻,备份后的数据全部丢失
备份方式 支持热备份(数据库打开状态下备份) 只能进行冷备份(数据库关闭状态下备份)
高可用支持 是 Data Guard、GoldenGate 等高可用方案的必要前提 不支持任何高可用方案
备份一致性 热备份可获得一致性备份 冷备份才能获得一致性备份
磁盘空间消耗 需要额外空间存储归档日志 无额外空间消耗
适用场景 所有生产环境、核心业务系统 仅用于测试环境、开发环境、可重建的非核心系统

生产环境铁律:所有承载业务数据的 Oracle 数据库,必须运行在归档模式下。

2、开启归档模式原因

  • 实现时间点恢复:这是归档模式最核心的价值。没有归档日志,RMAN 只能恢复到备份时刻,备份之后的所有数据都会丢失。
  • 支持热备份:可以在数据库正常运行的情况下进行备份,不中断业务。
  • 高可用基础:Data Guard、GoldenGate、RAC 等所有 Oracle 高可用技术都依赖归档日志进行数据同步。
  • 数据一致性保障:数据库崩溃后,归档日志可以用来恢复未写入数据文件的事务,保证数据一致性。
  • 合规要求:等保 2.0、PCI-DSS、银保监会等监管标准都明确要求数据库必须开启归档模式。

3、单实例数据库归档模式配置与切换

3.1、配置前准备

a、规划归档存储

1、归档日志必须存储在独立于数据文件和在线重做日志的磁盘 / ASM 磁盘组上

2、建议至少保留 30 天的归档日志,存储空间按 "每日归档量 ×30×1.5" 计算

3、生产环境推荐使用 ASM 磁盘组(如+ARCH)存储归档日志

b、确认维护窗口:开启 / 关闭归档模式需要重启数据库,必须安排在业务低峰期

c、备份数据库:切换模式前执行一次全量冷备份,作为安全保障

3.2、从非归档模式切换到归档模式

sql 复制代码
-- 步骤1:以sysdba身份登录数据库
sqlplus / as sysdba

-- 步骤2:查看当前数据库模式
SELECT log_mode FROM v$database;
-- 输出 NOARCHIVELOG 表示当前为非归档模式

-- 步骤3:关闭数据库
SHUTDOWN IMMEDIATE;

-- 步骤4:启动数据库到mount状态
STARTUP MOUNT;

-- 步骤5:配置归档日志路径(二选一)
-- 方式A:单归档路径(推荐使用ASM)
ALTER SYSTEM SET log_archive_dest_1='LOCATION=+ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=SPFILE;

-- 方式B:多归档路径(冗余备份,生产推荐)
ALTER SYSTEM SET log_archive_dest_1='LOCATION=+ARCH1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_dest_2='LOCATION=+ARCH2 VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=SPFILE;

-- 步骤6:配置归档日志格式(建议统一格式)
ALTER SYSTEM SET log_archive_format='%t_%s_%r.arc' SCOPE=SPFILE;
-- 格式说明:%t=线程号 %s=日志序列号 %r=重置日志ID(12c+必须包含)

-- 步骤7:开启归档模式
ALTER DATABASE ARCHIVELOG;

-- 步骤8:打开数据库
ALTER DATABASE OPEN;

-- 步骤9:验证配置是否生效
SELECT log_mode FROM v$database;
-- 输出 ARCHIVELOG 表示切换成功

-- 查看归档日志配置
ARCHIVE LOG LIST;
-- 输出应显示 "Database log mode: Archive Mode"

3.3、从归档模式切换到非归档模式(建议:测试环境使用)

sql 复制代码
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE NOARCHIVELOG;
ALTER DATABASE OPEN;

-- 验证
SELECT log_mode FROM v$database;

4、归档日志管理

4.1、查看归档日志信息

sql 复制代码
-- 查看归档日志配置
ARCHIVE LOG LIST;

-- 查看所有已生成的归档日志
SELECT name, sequence#, first_time, next_time, blocks*block_size/1024/1024 AS size_mb
FROM v$archived_log
ORDER BY sequence#;

-- 查看每日归档量
SELECT TRUNC(first_time) AS day, COUNT(*) AS count, SUM(blocks*block_size/1024/1024) AS size_mb
FROM v$archived_log
GROUP BY TRUNC(first_time)
ORDER BY day;

4.2、手动切换日志并归档

sql 复制代码
-- 手动切换在线重做日志,触发归档
ALTER SYSTEM SWITCH LOGFILE;

-- 强制归档所有未归档的日志
ALTER SYSTEM ARCHIVE LOG ALL;

4.3、安全删除过期归档日志

绝对不要使用操作系统 rm 命令直接删除归档日志,必须使用 RMAN 命令删除,否则控制文件中的归档记录不会更新,会导致备份和恢复失败。

sql 复制代码
rman target /

-- 查看过期的归档日志
REPORT OBSOLETE ARCHIVELOG;

-- 删除所有已备份1次的归档日志
DELETE ARCHIVELOG ALL BACKED UP 1 TIMES TO DEVICE TYPE DISK;

-- 删除30天前的归档日志
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-30';

-- 删除过期的归档日志(根据RMAN保留策略)
DELETE OBSOLETE ARCHIVELOG;

实例:生产库归档模式切换的完整流程

**S --- Situation(场景):**某公司 Oracle 11g 生产库一直运行在非归档模式。随着业务增长,需要启用 Data Guard 实现容灾,但切换到归档模式需要停机。

**T --- Task(任务):**在 30 分钟维护窗口内完成归档模式切换,零数据丢失。

A --- Action(行动):

1、 提前配置归档目录和 FRA;

2、计划停机窗口(凌晨 2:00-2:30);

3、执行切换;

4、 执行全量 RMAN 备份作为归档模式基线;

5、验证归档日志正常生成。

**R --- Result(结果):**归档模式在 15 分钟内切换完成,归档日志正常生成。随后成功部署 Data Guard 备库,实现了零数据丢失的容灾架构。

相关推荐
卡次卡次11 小时前
vibecoding起步注意点:插件、Skills、MCP、Hooks
服务器·数据库·python·oracle
Elastic 中国社区官方博客1 小时前
每次操作一个 API 调用:Elastic Cloud Hosted 如何让大规模部署管理变得可行
大数据·运维·数据库·elasticsearch·搜索引擎·serverless
清溪5491 小时前
pgAdmin4 <= 9.1_RCE(CVE-2025-2945)复现
数据库·后端
清溪5492 小时前
pgAdmin4后台Restore RCE(CVE-2025-13780)复现
数据库·后端
煎饼皮皮侠2 小时前
【设计】设计一个web版的数据库管理平台后端(之三) -- 多数据库通用分页
数据库·web数据库·查询平台
Rick19932 小时前
mysql联合索引经典实例
java·数据库·mysql
anew___2 小时前
《数据库原理》精要解读(七)—— 数据库设计:从蓝图到现实的系统工程
数据库·oracle
独隅2 小时前
MySQL 接入不同 AI 大模型进行数据管理的全面指南(MySQL + AI)
数据库·人工智能·mysql
go不是csgo3 小时前
GORM 上手:一个 main.go 跑通 Go 数据库增删改查
jvm·数据库·golang