如何安全地逐步删除 RMAN 中的备份
2026-06-12
2026-06-12
2026-06-11
2026-06-11
Oracle 重做日志记录对数据库所做的每一项更改。当用户运行 INSERT、UPDATE 或 DELETE 时,Oracle 不会直接将更改写入磁盘。它会先记录更改,然后将其刷新到重做日志文件中。
如果实例崩溃,Oracle 会在下次启动时重放这些记录的更改,恢复每个已提交的事务。这是 ACID 合规性中持久性的基础。

Oracle 维护两种类型:
在深入探讨之前,这里有四个术语,您将在本指南中频繁看到:
重做日志文件是磁盘上预分配的固定大小文件。与数据文件不同,重做日志是循环的。当最后一个组写满时,Oracle 循环回第一个组并覆盖它,但前提是该组已被归档且其更改已写入数据文件(已执行检查点)。
Oracle 将重做日志文件组织成两层结构:组和成员。组是由一个或多个相同的成员文件组成的逻辑单元。日志写入进程(LGWR)同时将相同的重做条目写入当前组中的每个成员。
多路复用 意味着将同一组的多个成员存储在不同的物理磁盘上。如果一个磁盘发生故障并损坏了一个成员文件,只要该组中至少有一个成员保持可读,Oracle 就会继续运行。如果没有多路复用,丢失单个重做日志文件就可能导致整个数据库宕机。
当您查询 V$LOG 时,每个组将显示以下四种状态之一:
| 状态 | 含义 |
|---|---|
| CURRENT | LGWR 正在主动写入的组 |
| ACTIVE | 日志切换已发生,但更改尚未完全检查点到数据文件。实例恢复仍需要此日志 |
| INACTIVE | 更改已被检查点。此组可以安全地重用 |
| UNUSED | 该组刚刚添加,从未被写入过 |
要查看您的组、成员、大小和当前状态:
SELECT
a.GROUP#,
a.STATUS,
b.MEMBER,
a.BYTES/1024/1024 AS SIZE_MB
FROM V$LOG a
JOIN V$LOGFILE b ON a.GROUP# = b.GROUP#
ORDER BY a.GROUP#;
添加新组(为多路复用,在独立磁盘上创建两个成员):
ALTER DATABASE ADD LOGFILE GROUP 4
('/u01/app/oracle/oradata/REDO/log4a.rdo',
'/u02/app/oracle/oradata/REDO/log4b.rdo') SIZE 512M;
向现有组添加成员:
ALTER DATABASE ADD LOGFILE MEMBER
'/u02/app/oracle/oradata/REDO/log1b.rdo' TO GROUP 1;
删除组:
ALTER DATABASE DROP LOGFILE GROUP 4;
CURRENT 或 ACTIVE 的组。要删除当前组,请先运行 ALTER SYSTEM SWITCH LOGFILE,等待其状态变为 INACTIVE,然后再删除。为重做日志文件找到正确的位置归结为两个优先事项:性能和冗余。
如果您使用 Oracle 托管文件(OMF),Oracle 会根据 DB_CREATE_ONLINE_LOG_DEST_n 参数自动处理命名和放置。但无论文件如何放置,有一条规则始终适用:切勿将同一组的成员存储在同一个物理磁盘上。 如果两个成员都位于同一个故障卷上,多路复用就无法提供任何保护。始终将成员分散到不同的挂载点、存储控制器或 ASM 磁盘组中。
查询 V$LOGFILE 以查看每个成员的存储位置以及它是位于常规文件系统还是 ASM 中:
SELECT
GROUP#,
TYPE,
MEMBER
FROM V$LOGFILE
ORDER BY GROUP#;
在将日志迁移到更快的存储或纠正放置问题时,请使用以下步骤。下面的重命名方法适用于所有 Oracle 版本。
1. 干净地关闭数据库,以便所有重做数据刷新到磁盘:
SHUTDOWN IMMEDIATE;
2. 在操作系统层面将文件复制到新位置,使用 cp(Linux)或 copy(Windows)。Oracle 不会为您移动文件 — 此步骤必须手动完成。
3. 挂载数据库:
STARTUP MOUNT;
4. 使用新路径更新控制文件:
ALTER DATABASE RENAME FILE '/old_disk/log1a.rdo' TO '/new_disk/log1a.rdo';
ALTER DATABASE RENAME FILE '/old_disk/log1b.rdo' TO '/new_disk/log1b.rdo';
5. 在打开数据库之前验证路径是否已更新:
SELECT GROUP#, TYPE, MEMBER FROM V$LOGFILE ORDER BY GROUP#;
6. 打开数据库:
ALTER DATABASE OPEN;
日志大小和切换频率直接相关。重做日志的大小决定了 Oracle 在必须切换到下一个组之前可以记录多少更改数据。每次切换都会触发检查点,强制数据库写入进程(DBWn)将内存中修改的数据刷新到磁盘。
当日志太小时,切换过于频繁。持续的检查点会造成 I/O 瓶颈,通常会在等待事件中显示为“log file switch (checkpoint incomplete)”。
目标是在峰值负载期间每 15 到 30 分钟切换一次。比这更频繁是日志大小不足的明确信号。
查询 V$LOG_HISTORY 以查看过去七天内每小时发生的切换次数:
SELECT
TRUNC(FIRST_TIME, 'HH') AS HOUR,
COUNT(*) AS SWITCHES
FROM V$LOG_HISTORY
WHERE FIRST_TIME > SYSDATE - 7
GROUP BY TRUNC(FIRST_TIME, 'HH')
ORDER BY 1;
查找切换次数较多的小时。这些是您的峰值时段,也是您配置大小的参考点。
使用以下公式作为起点:
峰值重做速率(MB/分钟) × 30 分钟 = 理想日志大小
对于标准 OLTP 工作负载,500 MB 到 1 GB 是合理的基线。对于有大量批处理作业或日终处理的数据库,请根据峰值负载(而非日平均值)来配置大小。根据平均值配置意味着您的数据库将在性能最关键的时候恰好停滞。
一个真实示例:一个使用 200 MB 日志的数据库,在夜间批处理负载期间每小时发生 456 次切换。将日志大小增加到 22 GB 后,“log file switch (checkpoint incomplete)”等待事件完全从 AWR 前几位等待事件中消失,批处理窗口缩短了 40%。
您无法直接调整现有日志文件的大小。过程是:添加更大的组,循环使用它们,然后删除旧组。
1. 按目标大小添加新组:
ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/oracle/oradata/redo04.log') SIZE 2G;
ALTER DATABASE ADD LOGFILE GROUP 5 ('/u01/app/oracle/oradata/redo05.log') SIZE 2G;
ALTER DATABASE ADD LOGFILE GROUP 6 ('/u01/app/oracle/oradata/redo06.log') SIZE 2G;
2. 强制日志切换,使 Oracle 移动到新组:
ALTER SYSTEM SWITCH LOGFILE;
3. 一旦旧组达到 INACTIVE 状态,删除它们:
ALTER DATABASE DROP LOGFILE GROUP 1;
4. 对每个剩余的旧组重复步骤 3。
ALTER SYSTEM SWITCH LOGFILE 来循环使用所有旧组。在删除之前,始终在 V$LOG 中确认组的状态为 INACTIVE。每个 Oracle 数据库都以两种模式之一运行:NOARCHIVELOG 或 ARCHIVELOG。
在 NOARCHIVELOG 模式下,已填充的重做日志会被直接覆盖。恢复只能到最后一次完整备份为止——之后的任何数据都会丢失。
在 ARCHIVELOG 模式下,Oracle 在重用每个重做日志之前会保存其永久副本。这允许您恢复旧备份并重放归档日志,以便在故障发生的那一刻进行恢复。对于任何生产数据库来说,ARCHIVELOG 模式是不可或缺的。
当实例崩溃并重新启动时,Oracle 自动运行两步恢复过程:
无需手动干预。此过程在数据库打开之前完成。
检查您当前的归档状态:
ARCHIVE LOG LIST;
如果输出显示“No Archive Mode”,请按照以下步骤启用它:
1. 关闭数据库:
SHUTDOWN IMMEDIATE;
2. 挂载数据库:
STARTUP MOUNT;
3. 启用 ARCHIVELOG 模式:
ALTER DATABASE ARCHIVELOG;
4. 打开数据库:
ALTER DATABASE OPEN;
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| 每 1-2 分钟切换一次 | 日志文件太小 | 使用添加/删除方法增加日志大小 |
| log file sync 等待事件 | 日志磁盘 I/O 瓶颈 | 将日志移至更快的存储(SSD 或 NVMe) |
| log file switch (checkpoint incomplete) | 日志组数量不足 | 增加更多日志组,为 DBWn 留出检查点时间 |
| 归档目标已满;数据库挂起 | 归档空间未监控 | 扩展存储、重新定位归档文件或通过 RMAN 清理 |
重做日志是 Oracle 的第一道防线。它们自动处理崩溃恢复,并确保在实例意外宕机时不会丢失任何已提交的事务。
但重做日志有其局限性。它们无法从意外数据删除、永久性磁盘故障或已经检查点到数据文件的损坏中恢复。它们也无法提供跨多个数据库管理备份策略的集中方式。
对于这些场景,您需要一个专用的备份解决方案。i2Backup 是一个企业级备份平台,旨在覆盖重做日志无法覆盖的领域。
完整的数据保护堆栈
对于还需要高可用性或实时复制的 Oracle 环境,英方软件提供了两款互补产品:
与 i2Backup 一起,这些工具涵盖了从实例级崩溃恢复到跨平台灾难恢复的完整数据保护需求。
您可以点击按钮免费试用英方软件的灾备解决方案。
Oracle 重做日志是数据库持久性的基础。它们记录每个已提交的更改,启用自动崩溃恢复,并且在正确配置大小时,可以让您的数据库运行而不会出现性能瓶颈。
本指南的关键要点:
也就是说,重做日志不是备份策略。它们保护免受实例崩溃的影响,但不能防止意外删除、硬件故障或跨多个数据库管理恢复的需要。为此,像英方软件的 i2Backup 这样的专用解决方案填补了这一空白——提供持续的 Oracle 备份、时间点恢复以及跨环境的集中管理。
公告
邮件
销售