Oracle 数据库由两个核心部分组成:
Oracle 启动的本质是:
先启动实例,再通过控制文件关联数据库,最后打开数据文件和联机重做日志文件,使数据库能够正常提供服务。
完整启动过程:
SHUTDOWN(数据库关闭)
|
v
获取 ORACLE_SID
|
v
查找初始化参数文件 SPFILE / PFILE
|
v
读取初始化参数
|
v
分配 SGA 内存
|
v
启动 Oracle 后台进程
|
v
NOMOUNT(实例启动)
|
v
读取 CONTROL_FILES 参数
|
v
定位并打开控制文件
|
v
MOUNT(数据库装载)
|
v
读取数据库物理结构信息
|
v
定位数据文件和联机重做日志文件
|
v
检查数据库文件状态和 SCN
|
+------ 文件一致 ------+
| |
| v
| OPEN(数据库打开)
|
+------ 需要实例恢复 ------+
|
v
前滚 Roll Forward
|
v
数据库可以打开
|
v
事务回滚 Roll Back
(可能继续在后台进行)
注意:上图为逻辑流程。Oracle 的事务恢复不一定全部完成后才允许普通用户访问数据库。实例恢复的缓存恢复阶段完成后,数据库可以打开,部分未提交事务的回滚可以在后台继续进行。
NOMOUNT 是 Oracle 数据库启动的第一个阶段。
此时:
NOMOUNT = 内存 + 后台进程。
SID(System Identifier)用于在操作系统层面标识 Oracle 实例。
例如:
export ORACLE_SID=orcl
Oracle 根据当前实例标识和启动方式查找初始化参数文件。
在 Oracle Linux 上,默认查找路径通常位于:
$ORACLE_HOME/dbs/
典型的参数文件包括:
spfileorcl.ora
spfile.ora
initorcl.ora
默认搜索顺序通常为:
spfile<SID>.ora
|
v
spfile.ora
|
v
init<SID>.ora
如果使用:
STARTUP PFILE='/path/init.ora';
则会按指定路径读取参数文件。
初始化参数文件包含:
Oracle 读取初始化参数后,开始分配 SGA 内存并启动后台进程。
SGA 的主要组成:
| 内存区域 | 作用 |
|---|---|
| Database Buffer Cache | 缓存数据块 |
| Shared Pool | 缓存 SQL、执行计划、数据字典等 |
| Redo Log Buffer | 缓存重做记录 |
| Large Pool | 大型内存分配、并行执行、RMAN 等 |
| Java Pool | Java 虚拟机相关内存 |
| Streams Pool | 流处理及相关组件使用的内存 |
注意:PGA 是进程私有内存,不属于 SGA。
主要后台进程:
| 后台进程 | 作用 |
|---|---|
| PMON / PMON 相关清理机制 | 进程监控和异常进程资源清理 |
| SMON | 系统级维护及部分恢复协调 |
| DBWn | 将脏数据块写入数据文件 |
| LGWR | 将 Redo Log Buffer 中的重做记录写入联机重做日志 |
| CKPT | 更新检查点相关信息 |
| ARCn | ARCHIVELOG 模式下归档已完成的重做日志 |
| LREG | 向监听器注册数据库服务 |
当实例内存和必要后台进程启动完成后,数据库进入 NOMOUNT 状态。
常见操作:
STARTUP NOMOUNT;
可以用于:
查看实例状态:
SELECT instance_name, status
FROM v$instance;
预期:
INSTANCE_NAME STATUS
------------- -------
orcl STARTED
常见原因:
原因一:参数文件不存在或无法读取
可能出现:
ORA-01078
LRM-00109
检查:
echo $ORACLE_SID
echo $ORACLE_HOME
ls -l $ORACLE_HOME/dbs/
原因二:SGA 内存不足或共享内存配置异常
可能出现:
ORA-00845
ORA-27102
检查:
free -h
df -h /dev/shm
原因三:初始化参数配置错误
例如:
ORA-00821
ORA-01078
处理方法:
NOMOUNT 失败的排查重点:SID、参数文件、内存、操作系统资源和后台进程。
Oracle 完成 NOMOUNT 后,开始读取控制文件。
控制文件路径通常由初始化参数决定:
SHOW PARAMETER control_files;
例如:
/u01/app/oracle/oradata/ORCL/control01.ctl
/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl
Oracle 打开控制文件,将实例与数据库关联。
此时:
MOUNT = 实例 + 控制文件 + 数据库关联。
控制文件是 Oracle 数据库非常重要的物理元数据文件。
主要记录:
Oracle 根据控制文件中的信息,进一步定位数据库的数据文件和联机重做日志文件。
STARTUP MOUNT;
常见操作:
-- 查看数据库状态
SELECT name, open_mode
FROM v$database;
-- 开启归档模式(需满足相应前置条件)
ALTER DATABASE ARCHIVELOG;
-- 执行需要在 MOUNT 状态下进行的数据库恢复
RECOVER DATABASE;
-- 打开数据库
ALTER DATABASE OPEN;
原因一:控制文件不存在
可能出现:
ORA-00205
ORA-00210
原因二:控制文件无法访问
可能原因:
检查:
SHOW PARAMETER control_files;
操作系统检查:
ls -l /u01/app/oracle/oradata/ORCL/
df -h
原因三:控制文件与数据库身份信息不匹配
例如数据库名称、控制文件或恢复状态不一致。
应检查 Alert Log 和对应 ORA 错误,不要直接删除或重建控制文件。
MOUNT 失败的排查重点:CONTROL_FILES 参数、控制文件路径、权限、完整性和数据库身份信息。
数据库进入 MOUNT 状态后,Oracle 根据控制文件中的记录定位数据库物理文件。
主要包括:
控制文件
|
+---- 数据文件 system01.dbf
|
+---- 数据文件 sysaux01.dbf
|
+---- 数据文件 undotbs01.dbf
|
+---- 数据文件 users01.dbf
|
+---- 联机重做日志 redo01.log
|
+---- 联机重做日志 redo02.log
|
+---- 联机重做日志 redo03.log
这些路径只是示例,实际位置以控制文件和数据库视图为准。
Oracle 需要检查文件是否可访问,以及数据库是否满足打开条件。
SCN(System Change Number)是 Oracle 用来标识数据库逻辑变化顺序的重要编号。
数据库打开时,需要结合:
判断数据库是否需要恢复。
注意:不能简单理解为“所有数据文件头 SCN 必须与控制文件 SCN 完全相等”。
因为不同数据文件可能具有不同的检查点状态,Oracle 会根据恢复规则判断文件是否一致、是否需要介质恢复或实例恢复。
情况一:数据文件不存在
可能出现:
ORA-01157
ORA-01110
检查:
SELECT file#, name
FROM v$datafile;
情况二:数据文件需要介质恢复
可能出现:
ORA-01113
ORA-01110
此时需要根据数据库恢复状态、备份和归档日志进行处理。
情况三:联机重做日志文件异常
可能出现:
ORA-00313
ORA-00312
检查:
SELECT group#, member
FROM v$logfile;
情况四:数据库需要实例恢复
如果数据库上一次异常关闭,Oracle 通常会在 OPEN 过程中自动进行实例恢复。
如果恢复所需文件完整且可访问,实例恢复通常不需要 DBA 手动干预。
OPEN 失败的排查重点:数据文件、联机重做日志、SCN、文件状态和恢复需求。
Checkpoint 是 Oracle 数据库控制恢复工作量和维护数据库文件一致性的重要机制。
它涉及:
检查点不是简单地清空 Buffer Cache。
检查点写出脏块后,相关数据块仍然可以保留在缓存中供后续访问。
当 Oracle 修改数据时:
读取数据块
|
v
加载到 Database Buffer Cache
|
v
执行 UPDATE / INSERT / DELETE
|
v
修改缓存中的数据块
|
v
形成 Dirty Buffer(脏块)
|
v
DBWn 在适当时机写入数据文件
脏块是指缓存中的数据块发生了修改,且相关修改尚未全部写入数据文件。
Oracle 使用检查点 SCN 和相关恢复元数据,确定恢复需要从哪里开始。
可以理解为:
Redo Log:
旧日志记录 新日志记录
| |
v v
----+----------+--------------------------+
^
|
Checkpoint 位置
|
v
实例恢复需要从适当的
Redo 位置开始处理
增量检查点的位置与缓存中尚未写出的较早修改有关,但不能把所有检查点类型都理解成完全相同的机制。
检查点相关信息保存在控制文件中;某些检查点也会更新数据文件头。
| 进程 | 作用 |
|---|---|
| CKPT | 协调检查点,更新控制文件和数据文件头中的相关信息 |
| DBWn | 实际将脏数据块写入数据文件 |
| LGWR | 将重做记录写入联机重做日志 |
CKPT 通常不负责实际写入数据块,真正执行数据块写盘的是 DBWn。
针对某个 Redo Thread 推进检查点。
常见触发场景包括:
ALTER SYSTEM CHECKPOINT。注意:日志切换不意味着切换瞬间必须将所有脏块全部写完。
针对指定表空间或数据文件执行检查点相关操作。
例如:
Oracle 通过持续写出脏块,逐步推进实例恢复起点。
作用:
增量检查点推进时,CKPT 可以更新控制文件中的相关检查点位置,而不必每次都更新所有数据文件头。
实例恢复通常发生在数据库上一次未正常关闭时。
例如:
SHUTDOWN ABORT;
或者:
此时,数据文件中可能存在:
因此数据库需要利用 Redo 和 Undo 恢复一致性。
第一阶段:前滚(Roll Forward / Cache Recovery)
Oracle 根据检查点及恢复信息定位所需的 Redo。
然后重新应用必要的重做记录。
异常关闭
|
v
读取控制文件中的恢复信息
|
v
确定恢复起点
|
v
读取联机重做日志
|
v
应用必要的 Redo
|
v
恢复数据块修改
前滚会重建已提交和未提交事务相关的必要修改。
所以前滚完成后,数据库块中仍可能存在未提交事务造成的变化。
第二阶段:回滚(Roll Back / Transaction Recovery)
Oracle 利用 Undo 信息处理未提交事务。
前滚完成
|
v
识别需要恢复的未提交事务
|
v
读取 Undo 信息
|
v
撤销未提交事务的修改
|
v
完成事务恢复
回滚可以由后台恢复机制处理,部分回滚也可能在访问相关数据时按需进行。
假设数据库执行:
-- 事务 A
UPDATE accounts
SET balance = balance + 100
WHERE id = 1;
COMMIT;
随后执行:
-- 事务 B
UPDATE accounts
SET balance = balance - 200
WHERE id = 2;
-- 没有 COMMIT
这时服务器突然断电。
重新启动时:
服务器断电
|
v
Oracle STARTUP
|
v
检查数据库恢复状态
|
v
前滚:
重做必要的事务 A 和事务 B 修改
|
v
回滚:
撤销事务 B 未提交的修改
|
v
最终保留事务 A 的提交结果
最终结果:
| 事务 | 是否提交 | 恢复结果 |
|---|---|---|
| A | 已提交 | 保留 |
| B | 未提交 | 撤销 |
| 项目 | Redo | Undo |
|---|---|---|
| 核心作用 | 重做修改 | 撤销修改 |
| 主要恢复用途 | 前滚 | 回滚 |
| 典型存储 | redo01.log | undotbs01.dbf |
| 是否记录未提交事务 | 是 | 保存撤销所需信息 |
| 是否参与实例恢复 | 是 | 是 |
需要特别注意:
Redo 不只是记录已提交事务,未提交事务产生的修改也会生成 Redo。
Undo 本身也会产生 Redo,以支持故障后的恢复。
-- 启动到 NOMOUNT
STARTUP NOMOUNT;
-- 从 NOMOUNT 进入 MOUNT
ALTER DATABASE MOUNT;
-- 从 MOUNT 进入 OPEN
ALTER DATABASE OPEN;
也可以:
-- 直接启动到 MOUNT
STARTUP MOUNT;
-- 完整启动数据库
STARTUP;
查看状态:
SELECT instance_name, status
FROM v$instance;
SELECT name, open_mode
FROM v$database;
典型实例状态:
| 阶段 | V$INSTANCE.STATUS |
|---|---|
| NOMOUNT | STARTED |
| MOUNT | MOUNTED |
| OPEN | OPEN |
| 启动阶段 | 主要检查对象 | 常见问题 |
|---|---|---|
| NOMOUNT | 参数文件、SGA、后台进程 | 参数错误、内存不足 |
| MOUNT | 控制文件 | 文件丢失、权限错误 |
| OPEN | 数据文件、Redo、恢复状态 | 数据文件异常、需要恢复 |
| 实例恢复 | Redo、Undo、控制文件 | 恢复日志缺失、文件损坏 |
查看 Alert Log:
SELECT name, value
FROM v$diag_info
WHERE name = 'Diag Trace';
Oracle 19c 常见的 Alert Log 文本路径形式:
$ORACLE_BASE/diag/rdbms/<db_unique_name>/<SID>/trace/alert_<SID>.log
也可以使用 ADRCI 查看数据库诊断信息。
Oracle 数据库启动过程可以记为:
SID → 参数文件 → SGA + 后台进程 → NOMOUNT → 控制文件 → MOUNT → 数据文件 + Redo → 恢复检查 → OPEN。
三个阶段的核心区别:
实例恢复的核心:
Checkpoint 确定恢复起点,Redo 负责前滚,Undo 负责回滚。