2. Oracle数据库体系结构回顾

要理解Oracle的备份恢复,不能只记住RMAN命令,而必须先看清“谁在写、写到哪里、坏了以后靠什么恢复”。Oracle数据库由实例(Instance)和数据库(Database)两部分组成:实例是内存结构加后台进程,数据库是磁盘上的物理文件集合。两者通过SGA、后台进程和文件之间的读写关系耦合在一起,备份恢复正是围绕这些关系展开的。

一、实例:SGA与后台进程

实例由SGA(System Global Area)和一组后台进程构成。SGA中最关键的区域包括:

  • Database Buffer Cache(数据库缓冲区缓存):缓存从数据文件读入的数据块。用户修改数据时,先在缓冲区中修改,此时内存中的块与磁盘上的块不一致,称为“脏块”。
  • Redo Log Buffer(重做日志缓冲区):记录所有数据块变更的重做向量。它是恢复的“原始凭证”,只要重做日志在,已提交的变更就不会丢。
  • Shared Pool(共享池):缓存SQL解析结果、执行计划、数据字典信息。控制文件中的部分元数据也会被读入这里。
  • Large Pool / Java Pool / Streams Pool:为RMAN备份、并行执行、Java等提供大块内存,RMAN备份时大量使用Large Pool。

后台进程负责把内存中的变化安全地落到磁盘:

  • DBWn(数据库写进程):把Buffer Cache中的脏块写入数据文件。它写得“慢而随机”,不保证提交时立即落盘。
  • LGWR(日志写进程):把Redo Log Buffer中的重做记录顺序写入联机重做日志文件。用户执行COMMIT时,LGWR必须先把该事务的重做写入日志,才返回提交成功——这就是“日志先行(Write-Ahead Logging)”。
  • CKPT(检查点进程):触发检查点,通知DBWn写脏块,并更新控制文件和数据文件头中的检查点信息(SCN)。检查点越新,实例崩溃后需要应用的redo就越少。
  • SMON(系统监控进程):实例恢复时负责前滚已提交事务、回滚未提交事务,并清理临时段。
  • PMON(进程监控进程):清理失败的用户进程,释放资源。
  • ARCn(归档进程):在ARCHIVELOG模式下,把写满的联机重做日志复制到归档日志目录。

二、数据库:物理文件与逻辑结构

磁盘上的数据库由三类核心文件支撑:

  • 数据文件(Data File):存放实际数据,属于某个表空间。一个数据文件由若干数据块组成,块头记录该文件的最新检查点SCN。
  • 控制文件(Control File):记录数据库名、DBID、数据文件与重做日志的路径、当前SCN、检查点信息、归档日志记录、备份记录(RMAN信息库)。控制文件是“数据库的地图”,一旦全部丢失且无备份,恢复将极其困难。
  • 联机重做日志文件(Online Redo Log):以组(Group)和成员(Member)形式循环使用,记录所有变更。写满一组后切换(Log Switch),ARCn将其归档。

此外还有归档日志(Archived Log):它是联机重做日志的历史副本,是介质恢复的关键。只有ARCHIVELOG模式才产生归档日志,也才支持热备份和不丢数据的完全恢复。

三、备份恢复与这些组件的关系

把上述组件串起来,就能看清备份恢复的逻辑:

  • 数据文件备份:RMAN备份数据文件中的数据块,可做全备份或增量备份。恢复时用备份的数据文件替换损坏文件,再用归档日志和联机日志把数据“前滚”到指定时间点。
  • 控制文件备份:控制文件记录数据文件与日志的对应关系,必须备份。RMAN可自动备份控制文件,也可用ALTER DATABASE BACKUP CONTROLFILE TO TRACE生成重建脚本。
  • 归档日志备份:归档日志是介质恢复的“燃料”。没有归档日志,只能恢复到最近一次全备份的检查点,之后的数据全部丢失。
  • 联机重做日志:实例崩溃恢复时使用,把Buffer Cache中未落盘的已提交事务前滚;介质恢复时,若归档日志缺失,可用当前联机日志补齐最后一段。
核心关系可以概括为:数据文件是“结果”,重做日志是“过程”,控制文件是“索引”,归档日志是“历史过程”。备份恢复的本质,就是用“过程”和“历史过程”去重建或修补“结果”,而“索引”告诉你哪些结果和过程需要被使用。

四、一个直观的恢复场景

假设某数据库运行在ARCHIVELOG模式,周日做了全备份,周一至周三归档日志正常。周三上午10:00,存放users01.dbf的磁盘损坏。恢复过程如下:

  1. 启动到MOUNT状态,RMAN从备份中还原users01.dbf。此时该文件是周日备份时的旧版本。
  2. 执行RECOVER DATABASE,Oracle从归档日志中读取周日之后的所有重做记录,逐条应用到该数据文件,把它前滚到周三10:00附近。
  3. 若归档日志完整,可恢复到故障前一刻;若归档日志缺失,只能恢复到最后一个可用归档日志的SCN,之后的数据丢失。
  4. 打开数据库后,SMON回滚未提交事务,数据文件与控制文件、联机日志重新保持一致。

这个场景说明:备份文件决定恢复的起点,归档日志决定恢复的终点,控制文件决定恢复的路径。三者缺一不可。

Oracle实例与数据库文件:备份恢复关系图 实例 Instance(内存 + 进程) SGA Buffer Cache Redo Log Buffer 后台进程 DBWn / LGWR / CKPT SMON / PMON / ARCn 内存中的“脏块”与“重做向量” 提交时 LGWR 先写日志 → 日志先行 DBWn 异步写数据文件 → 检查点推进 数据库 Database(磁盘文件) 数据文件 system01.dbf users01.dbf … 控制文件 DBID / SCN / 路径 RMAN 信息库 联机重做日志 Group 1 / 2 / 3 循环使用 归档日志 ARCHIVELOG 模式 介质恢复的燃料 DBWn LGWR ARCn 备份与恢复:从“过程”重建“结果” RMAN 备份 数据文件备份 控制文件 + 归档日志 恢复 RESTORE 用备份替换损坏文件 回到备份时点 恢复 RECOVER 应用归档日志 + 联机日志 前滚到目标 SCN 数据文件 = 结果 | 重做日志 = 过程 | 控制文件 = 索引 | 归档日志 = 历史过程 备份决定恢复起点,归档日志决定恢复终点,控制文件决定恢复路径 备份读取数据文件 / 控制文件 / 归档日志 归档日志用于前滚

五、关键判断:什么时候能完全恢复

是否能够做到“不丢数据”的完全恢复,取决于两个条件:

  1. 数据库运行在ARCHIVELOG模式,并且归档日志连续、可访问。如果数据库处于NOARCHIVELOG模式,只能恢复到最近一次全备份,之后的数据无法前滚。
  2. 控制文件可用。控制文件记录了数据文件与日志的对应关系,若控制文件损坏且没有备份,即使数据文件和归档日志都在,也无法正确挂载和恢复。
注意:联机重做日志是循环使用的。如果归档进程落后或归档目录写满,联机日志无法切换,数据库会挂起(ARCHIVER ERROR)。此时必须尽快清理归档空间或修复归档路径,否则业务写入会阻塞。

六、小结

从备份恢复的视角看,Oracle体系结构可以简化为一条链:用户修改 → Buffer Cache 脏块 → Redo Log Buffer → LGWR 写联机日志 → DBWn 写数据文件 → ARCn 归档。备份保存的是链上的“结果”和“历史过程”,恢复则是沿着这条链反向重建。理解这条链,才能在面对文件损坏、误删数据、实例崩溃时,准确判断该用哪份备份、哪些日志、恢复到什么时间点。