知识库✳

教程与手册

全部教程
  1. 01Oracle 函数手册
  2. 02性能优化手册
  3. 03Linux Shell
  4. 04Oracle 学习与演练
  5. 05网络基础学习
  6. 06数据治理与管理
返回个人网站
甲Oracle 学习教程从 SQL 到 PL/SQL 与运维
首页课程目录搜索演练场
知识库

已完成 0 / 22 章

模块一 · 入门与准备

  • 01Oracle 数据库体系结构
  • 02环境安装与连接方式
  • 03SQL*Plus 与常用工具

模块二 · SQL 查询基础

  • 04SELECT 查询基础
  • 05过滤与排序
  • 06单行函数
  • 07多表连接
  • 08分组聚合与 HAVING
  • 09子查询

模块三 · 数据与对象

  • 10DML 与事务控制
  • 11表与数据类型
  • 12约束
  • 13索引与执行计划
  • 14视图、序列与同义词

模块四 · PL/SQL 编程

  • 15PL/SQL 块与变量
  • 16流程控制与游标
  • 17存储过程与函数
  • 18触发器
  • 19异常处理

模块五 · 运维与进阶

  • 20用户与权限管理
  • 21表空间与存储管理
  • 22备份与恢复
❖

Oracle 学习教程

返回个人网站知识库

示例代码基于 Oracle AI Database 26ai / 23ai,查询示例使用官方 HR 示例方案。

以 Next.js 16 · Tailwind CSS v4 · HeroUI v3 装帧

01
  1. 首页
  2. 课程目录
  3. Oracle 数据库体系结构

第 1 章◆入门◆建议 45 分钟◆模块一 · 入门与准备

Oracle 数据库体系结构

理解「实例」与「数据库」的区别、内存结构、后台进程,以及逻辑与物理存储的映射关系。

学完这一章,你应该能

  • 说清实例(Instance)和数据库(Database)的区别
  • 记住 SGA 的主要组件及各自作用
  • 认识核心后台进程并知道谁负责写盘
  • 理解「表空间 → 段 → 区 → 块」的逻辑层次

1.1实例 ≠ 数据库

这是初学者最容易混淆的一对概念。数据库是磁盘上的一堆文件(数据文件、控制文件、重做日志文件),是「持久化」的;实例是内存结构加后台进程,是「运行时」的。启动 Oracle 的过程,本质上是先分配内存、拉起进程(实例),再由实例去打开磁盘上的文件(数据库)。

  • 数据库:物理文件的集合,断电数据还在
  • 实例:内存 + 后台进程,关机就没了
  • 一个实例在同一时刻只能打开一个数据库(RAC 例外:多个实例对应一个数据库)
  • 启动分三步:NOMOUNT(读参数文件)→ MOUNT(读控制文件)→ OPEN(打开数据文件)
查看当前实例与启动状态
SELECT instance_name, host_name, version, status, startup_time
FROM   v$instance;

只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。

1.2SGA:共享内存区

SGA(System Global Area)是所有服务进程共享的内存区域,随实例启动分配。其中最重要的三块是数据库缓冲区缓存、共享池和重做日志缓冲区。

  • Database Buffer Cache:缓存从数据文件读入的数据块,减少物理 I/O
  • Shared Pool:存放解析后的 SQL(库缓存)和数据字典缓存;硬解析就发生在这里
  • Redo Log Buffer:暂存重做记录,由 LGWR 写入在线重做日志
  • Large Pool:供 RMAN 备份、并行执行、共享服务器使用
  • PGA:每个服务进程私有,用于排序、哈希连接等,不属于 SGA
查看 SGA 各组件大小
SELECT name, ROUND(bytes/1024/1024, 2) AS mb
FROM   v$sgainfo
ORDER  BY bytes DESC;

只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。

查看关键初始化参数
SHOW parameter sga_target
SHOW parameter pga_aggregate_target
SHOW parameter db_block_size

1.3后台进程:谁在干活

用户进程自己不写磁盘,所有落盘动作都由后台进程完成。理解这一点,才能理解提交(COMMIT)为什么快、以及为什么断电可能丢数据。

  • DBWn(数据库写进程):把脏缓冲区写回数据文件,写得比较「懒」
  • LGWR(日志写进程):把重做日志缓冲区写入在线重做日志,COMMIT 时必写
  • CKPT(检查点进程):更新控制文件和数据文件头,标记一致性位点
  • SMON / PMON:实例恢复、清理异常终止的进程
  • ARCn(归档进程):归档模式下把写满的重做日志复制到归档目录
查看后台进程
SELECT paddr, name, description
FROM   v$bgprocess
WHERE  paddr <> '00'
ORDER  BY name;

只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。

提示 COMMIT 之所以比「把所有修改写回表」快得多,是因为它只需保证重做日志落盘(write-ahead logging)。数据文件晚一点写没关系,崩溃后可以用重做日志重放。

1.4逻辑结构与物理结构

Oracle 用「逻辑结构」组织数据,用「物理结构」把它落到磁盘。两者的映射关系是理解存储管理的关键。

  • 逻辑层次:数据库 → 表空间 → 段 → 区(Extent)→ 数据块(Block)
  • 物理文件:数据文件(.dbf)、控制文件(.ctl)、在线重做日志(.log)
  • 一个表空间可以对应多个数据文件;一个数据文件只属于一个表空间
  • 数据块大小由 DB_BLOCK_SIZE 决定,创建库后不可修改(默认 8KB)
查看表空间与数据文件对应关系
SELECT t.tablespace_name,
       t.status,
       ROUND(d.bytes/1024/1024, 2) AS file_mb,   -- 容量取自 dba_data_files
       d.file_name
FROM   dba_tablespaces t
JOIN   dba_data_files d
       ON d.tablespace_name = t.tablespace_name
ORDER  BY t.tablespace_name, d.file_name;

注意 dba_tablespaces 里没有 BYTES 列,表空间容量必须从 dba_data_files 汇总。

只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。

练习

3 题 · 先自己写,再展开对照

提示 有一个 SQL*Plus 命令,也可以在 SQL 里取值。

参考答案

SHOW con_name

-- 或者在 SQL 里取
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS con_name FROM dual;

自评要点

  • 知道 CDB$ROOT 与具体 PDB 名称的区别
  • 业务操作应该在 PDB 里做,不在 CDB$ROOT

提示 想清楚 COMMIT 到底保证了什么落盘。

参考答案

不一定。

COMMIT 只保证重做日志被 LGWR 写入在线重做日志(write-ahead logging),
并不保证脏数据块已经写回数据文件——脏块由 DBWn 延迟批量写回。

如果此刻实例崩溃,重启时会用重做日志重放这些变更(实例恢复),
数据不会丢。这正是 COMMIT 比「把所有修改写回表」快得多的原因。

自评要点

  • COMMIT 保证的是重做日志落盘,不是数据文件
  • 提到 DBWn 负责脏块写回
  • 提到崩溃后靠重做日志重放恢复

参考答案

查 SGA:SELECT name, bytes FROM v$sgainfo ORDER BY bytes DESC;

排序、哈希连接主要消耗 PGA(由 pga_aggregate_target 控制)。
PGA 是每个服务进程私有的内存区,不属于 SGA。

自评要点

  • V$SGAINFO
  • PGA 不属于 SGA
下一章 →

环境安装与连接方式