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 调优,会变成猜索引。
专栏学习地图
| 页面 | 学什么 | 学完要会什么 |
|---|---|---|
| 基础 SQL | varchar2、number、sequence、dual、分页、日期 | 能写 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 背后的原理:
uk_medical_asset_no防止并发导入重复资产。check约束防止非法状态进入数据库。- 查询
asset_no会走唯一索引,叶子块拿到 ROWID,再回表取行。 update会加行锁,生成 Undo 和 Redo。commit关键是 LGWR 刷 Redo,不是立刻刷所有数据块。- 查询会基于 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 能力和工具链成熟 |
不建议:
- 把报表大查询直接压在核心交易库上。
- 一个事务处理几十万行。
- 高频 OLTP 更新字段上滥用 Bitmap 索引。
- 把远程接口调用放进数据库事务。
- 不做归档,让核心表无限增长。
学完 Oracle 专栏的验收标准
你要能讲清:
- Oracle 实例、数据库、用户、表空间、段、区、块是什么关系。
- Shared Pool、Buffer Cache、Redo Log Buffer、PGA 分别什么时候用。
- SQL 为什么有硬解析和软解析。
- 优化器为什么依赖统计信息。
- B-tree 索引叶子块保存什么,ROWID 怎么回表。
- Undo 为什么既能回滚又能支持一致性读。
- Redo 为什么能支持崩溃恢复。
- SCN 为什么能表达一致时间点。
- commit 为什么主要等待 LGWR 刷 Redo。
- 锁等待、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。