Skip to content

Oracle 总览

Oracle 不是“会写几条 SQL、知道 SGA/PGA/Undo/Redo”就算学会。真正能上商业项目,必须能把下面这条链路讲清楚:

业务建模 -> SQL 执行 -> 优化器计划 -> Buffer Cache 读块 -> Undo 一致性读 -> Redo 崩溃恢复 -> SCN 时间点 -> 锁等待排查 -> 备份高可用。

Oracle 常见于金融、政企、运营商、医院核心系统、传统大型交易系统。它的难点不在语法,而在“为什么稳定、为什么能恢复、为什么慢、为什么会锁、为什么会 snapshot too old”。

你应该按什么顺序学

mermaid
flowchart TD
    A["1. 基础 SQL 和对象"] --> B["2. 从零到生产主线"]
    B --> C["3. 架构与存储"]
    C --> D["4. SQL 执行全过程"]
    D --> E["5. Undo、Redo、SCN"]
    E --> F["6. 索引、优化器、执行计划"]
    F --> G["7. 事务、锁、等待事件"]
    G --> H["8. 备份、高可用、排查"]
    H --> I["9. 面试标准回答"]

学习顺序不要反过来。你还不知道表空间、段、区、块,就去背 AWR、RAC、Data Guard,会只剩名词;你还不会看执行计划,就去谈 SQL 调优,会变成猜索引。

专栏学习地图

页面学什么学完要会什么
基础 SQLvarchar2numbersequencedual、分页、日期能写 Oracle 常见业务 SQL
从零到生产级掌握Oracle 完整主线能把 SQL、内存、Undo、Redo、SCN、排查串起来
商业场景训练营医疗资产、状态流转、锁、快照过旧能把原理放进项目场景
架构与存储Instance、Database、SGA、PGA、表空间、段区块能解释 Oracle 数据到底放在哪里
核心全过程原理连接、解析、优化、Buffer Cache、ROWID、Undo、Redo能讲一条 SQL 和一条 UPDATE 怎么走
索引与优化器B-tree、Bitmap、ROWID、统计信息、计划能判断为什么走索引仍然慢
事务与锁一致性读、行锁、隔离、阻塞能排查 enq: TX - row lock contention
Undo、Redo 与 SCN 原理Undo 回滚、一致性读、Redo 恢复、SCN能解释 commit、恢复、snapshot too old
备份与高可用RMAN、归档、Data Guard、RAC 思路能理解备份恢复和容灾边界
性能排查执行计划、等待事件、AWR/ASH 思路能按证据排查慢 SQL、锁、TEMP、Redo
Oracle 面试标准回答和追问能短答面试题,并跳回原理页

从零理解 Oracle 的对象层次

很多人一开始分不清 Instance、Database、User、Schema、Tablespace。先建立这张图:

mermaid
flowchart TD
    A["Instance<br/>SGA + 后台进程"] --> B["Database<br/>数据文件、控制文件、Redo 文件"]
    B --> C["Tablespace 表空间"]
    C --> D["Data File 数据文件"]
    C --> E["Segment 段<br/>表段、索引段"]
    E --> F["Extent 区"]
    F --> G["Block 块"]
    H["User / Schema"] --> E

如果不理解这个层次,会出现这些问题:

不懂什么线上后果
不懂表空间表空间满了只会找 Java 问题
不懂段区块不知道表和索引空间怎么增长
不懂 SGA/PGA分不清 SQL 缓存、数据块缓存、排序内存
不懂 Redo/Undo讲不清提交、回滚、恢复和一致性读
不懂 SCN讲不清查询为什么能看到一致时间点

最小商业 Demo:医疗资产表

sql
create table medical_asset (
  id number primary key,
  asset_no varchar2(64) not null,
  hospital_id number not null,
  department_id number,
  asset_name varchar2(128) not null,
  status varchar2(20) not null,
  created_at date default sysdate not null,
  updated_at date default sysdate not null,
  constraint uk_medical_asset_no unique (asset_no),
  constraint ck_medical_asset_status
    check (status in ('IDLE', 'USED', 'REPAIR', 'SCRAPPED'))
);

create sequence seq_medical_asset start with 1 increment by 1;

create index idx_asset_hospital_status_time
on medical_asset(hospital_id, status, created_at);

插入资产:

sql
insert into medical_asset (
  id, asset_no, hospital_id, department_id, asset_name, status
) values (
  seq_medical_asset.nextval, 'A001', 1001, 10, 'CT-001', 'IDLE'
);

commit;

状态流转:

sql
update medical_asset
set status = 'USED',
    updated_at = sysdate
where asset_no = :asset_no
  and status = 'IDLE';

commit;

这个 Demo 背后的原理:

  1. uk_medical_asset_no 防止并发导入重复资产。
  2. check 约束防止非法状态进入数据库。
  3. 查询 asset_no 会走唯一索引,叶子块拿到 ROWID,再回表取行。
  4. update 会加行锁,生成 Undo 和 Redo。
  5. commit 关键是 LGWR 刷 Redo,不是立刻刷所有数据块。
  6. 查询会基于 SCN 做一致性读,必要时用 Undo 构造旧版本。

Oracle 最容易被问的原理

问题你应该跳到哪里
Oracle Instance 和 Database 区别架构与存储
SGA 和 PGA 区别架构与存储
一条 SELECT 怎么执行核心全过程原理
Undo、Redo、SCN 分别做什么Undo、Redo 与 SCN 原理
为什么 commit 不刷数据块从零到生产级掌握
snapshot too old 为什么发生Undo、Redo 与 SCN 原理
B-tree 和 Bitmap 怎么选索引与优化器
行锁等待怎么排查事务与锁
AWR/ASH 看什么性能排查

商业项目中 Oracle 怎么用

适合:

场景为什么适合
金融核心交易事务、恢复、审计、高可用成熟
政企核心系统权限、运维、生态稳定
医院核心业务库数据正确性、审计、恢复要求高
复杂报表和历史系统SQL 能力和工具链成熟

不建议:

  1. 把报表大查询直接压在核心交易库上。
  2. 一个事务处理几十万行。
  3. 高频 OLTP 更新字段上滥用 Bitmap 索引。
  4. 把远程接口调用放进数据库事务。
  5. 不做归档,让核心表无限增长。

学完 Oracle 专栏的验收标准

你要能讲清:

  1. Oracle 实例、数据库、用户、表空间、段、区、块是什么关系。
  2. Shared Pool、Buffer Cache、Redo Log Buffer、PGA 分别什么时候用。
  3. SQL 为什么有硬解析和软解析。
  4. 优化器为什么依赖统计信息。
  5. B-tree 索引叶子块保存什么,ROWID 怎么回表。
  6. Undo 为什么既能回滚又能支持一致性读。
  7. Redo 为什么能支持崩溃恢复。
  8. SCN 为什么能表达一致时间点。
  9. commit 为什么主要等待 LGWR 刷 Redo。
  10. 锁等待、TEMP 爆、Redo 暴涨、snapshot too old 分别怎么排查。

面试标准回答

text
Oracle 是成熟的企业级关系型数据库,常用于金融、政企、医院核心系统和大型交易系统。学习 Oracle 要按实例和数据库、用户和表空间、段区块、SGA/PGA、SQL 解析优化、索引 ROWID、Undo/Redo/SCN、事务锁、备份恢复和等待事件排查这条线掌握。Oracle 用 Undo 支持回滚和一致性读,用 Redo 支持崩溃恢复,用 SCN 标识一致性时间点。commit 时关键是 LGWR 把 Redo 刷到日志文件,数据块可以由 DBWR 后台后续写回。生产排查不能只猜索引,要结合执行计划、统计信息、等待事件、锁、Undo、Redo、TEMP 和 AWR/ASH。