实例 ≠ 数据库
这是初学者最容易混淆的一对概念。数据库是磁盘上的一堆文件(数据文件、控制文件、重做日志文件),是「持久化」的;实例是内存结构加后台进程,是「运行时」的。启动 Oracle 的过程,本质上是先分配内存、拉起进程(实例),再由实例去打开磁盘上的文件(数据库)。
- 数据库:物理文件的集合,断电数据还在
- 实例:内存 + 后台进程,关机就没了
- 一个实例在同一时刻只能打开一个数据库(RAC 例外:多个实例对应一个数据库)
- 启动分三步:NOMOUNT(读参数文件)→ MOUNT(读控制文件)→ OPEN(打开数据文件)
SELECT instance_name, host_name, version, status, startup_time
FROM v$instance;只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。
SGA:共享内存区
SGA(System Global Area)是所有服务进程共享的内存区域,随实例启动分配。其中最重要的三块是数据库缓冲区缓存、共享池和重做日志缓冲区。
- Database Buffer Cache:缓存从数据文件读入的数据块,减少物理 I/O
- Shared Pool:存放解析后的 SQL(库缓存)和数据字典缓存;硬解析就发生在这里
- Redo Log Buffer:暂存重做记录,由 LGWR 写入在线重做日志
- Large Pool:供 RMAN 备份、并行执行、共享服务器使用
- PGA:每个服务进程私有,用于排序、哈希连接等,不属于 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后台进程:谁在干活
用户进程自己不写磁盘,所有落盘动作都由后台进程完成。理解这一点,才能理解提交(COMMIT)为什么快、以及为什么断电可能丢数据。
- DBWn(数据库写进程):把脏缓冲区写回数据文件,写得比较「懒」
- LGWR(日志写进程):把重做日志缓冲区写入在线重做日志,COMMIT 时必写
- CKPT(检查点进程):更新控制文件和数据文件头,标记一致性位点
- SMON / PMON:实例恢复、清理异常终止的进程
- ARCn(归档进程):归档模式下把写满的重做日志复制到归档目录
SELECT paddr, name, description
FROM v$bgprocess
WHERE paddr <> '00'
ORDER BY name;只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。
逻辑结构与物理结构
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 汇总。
只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。