Oracle 实例架构概述
1.1 实例(Instance)与数据库(Database)的区别
Oracle 实例(Instance)是由内存结构(SGA)和后台进程组成的运行时环境,而数据库(Database)是存储在磁盘上的物理文件集合(数据文件、控制文件、重做日志文件)。一个实例可以打开一个数据库,但在RAC(Real Application Clusters)环境中,多个实例可以同时打开同一个数据库。
核心组件对比:
|
对比项 |
实例(Instance) |
数据库(Database) |
|
组成 |
SGA + 后台进程 |
数据文件 + 控制文件 + 重做日志 |
|
存在形式 |
内存中(运行时) |
磁盘上(持久化) |
|
生命周期 |
启动到关闭 |
永久存在 |
|
命名 |
通过 ORACLE_SID 标识 |
通过 DB_NAME 标识 |
案例:理解实例与数据库的关系
S — Situation(场景):某开发团队在测试环境执行 SHUTDOWN IMMEDIATE 后,发现数据库文件(数据文件、控制文件)仍然存在于磁盘上,但无法通过 SQL*Plus 连接。开发人员困惑:"数据库是不是被删了?"
T — Task(任务):向开发团队解释实例与数据库的区别,并演示如何正确启动数据库。
A — Action(行动):
1、确认数据库文件完整性:
SELECT NAME FROM V$DATAFILE;
SELECT NAME FROM V$CONTROLFILE;
--文件均存在,数据库未被删除
2、检查实例转态:
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
--无返回,说明实例未启动
3、启动实例并打开数据库
STARTUP;--等价于 STARTUP MOUNT → ALTER DATABASE OPEN
R — Result(结果):开发团队理解了实例是内存中的运行环境,数据库是磁盘上的文件集合。SHUTDOWN 关闭的是实例,不会删除数据库文件。STARTUP 重新创建实例并打开数据库。
1.2 SGA(System Global Area)体系结构
SGA 是 Oracle 实例最重要的内存结构,是一组共享内存段,所有服务器进程都可以访问。SGA 包含多个子组件,每个组件负责不同的功能。
SGA 核心组件:
|
组件 |
功能 |
关键参数 |
|
Database Buffer Cache |
缓存数据文件中的数据块 |
DB_CACHE_SIZE |
|
Shared Pool |
缓存 SQL/PLSQL 执行计划、数据字典 |
SHARED_POOL_SIZE |
|
Redo Log Buffer |
缓存重做日志条目 |
LOG_BUFFER |
|
Large Pool |
RMAN 备份、并行查询、共享服务器 |
LARGE_POOL_SIZE |
|
Java Pool |
Java 存储过程内存 |
JAVA_POOL_SIZE |
|
Streams Pool |
Streams/GoldenGate 复制 |
STREAMS_POOL_SIZE |
|
Fixed SGA |
实例固定开销 |
自动管理 |
|
In-Memory Area |
列式存储缓存(12c+) |
INMEMORY_SIZE |
案例:SGA 组件监控与调优
S — Situation(场景):某数据库在大促期间出现性能下降,AWR 报告显示 Shared Pool 命中率仅为 85%,Buffer Cache 命中率 90%,存在大量硬解析和物理读。
T — Task(任务):分析 SGA 各组件使用情况,调整参数提升命中率。
A — Action(行动):
1、查看当前 SGA 配置:
SELECT COMPONENT, CURRENT_SIZE/1024/1024 AS SIZE_MB FROM V$SGA_DYNAMIC_COMPONENTS;
2、查看 Shared Pool 命中率:
SELECT NAMESPACE, GETHITRATIO FROM V$LIBRARYCACHE WHERE NAMESPACE IN ('SQL AREA', 'TABLE/PROCEDURE', 'BODY');
3、查看 Buffer Cache 命中率:
SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME IN ('physical reads', 'db block gets', 'consistent gets');
4、动态调整参数(无需重启):
ALTER SYSTEM SET SHARED_POOL_SIZE = 4G SCOPE=BOTH;
ALTER SYSTEM SET DB_CACHE_SIZE = 8G SCOPE=BOTH;
5、配置自动 SGA 管理:
ALTER SYSTEM SET SGA_TARGET = 24G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE = 24G SCOPE=SPFILE; --需重启
R — Result(结果):Shared Pool 命中率提升至 98%,Buffer Cache 命名率提升至 97%。硬解析减少 60%,物理读降低 45%,数据库响应时间从平均 50ms 降至 12ms。
1.3 PGA(Program Global Area)体系结构
PGA 是每个服务器进程独占的内存区域,用于排序、哈希连接、位图合并等操作。Oracle 12c 引入了 PGA_AGGREGATE_LIMIT 参数,防止 PGA 无限增长导致系统内存耗尽。
PGA 管理参数:
- PGA_AGGREGATE_TARGET:所有服务器进程 PGA 总量的目标值
- PGA_AGGREGATE_LIMIT(12c+):PGA 硬上限,超过后终止高消耗会话
- _PGA_MAX_SIZE:单个会话 PGA 最大值(隐含参数,一般不修改)
案例:PGA 过大导致系统 OOM (全称 Out Of Memory(内存溢出))
S — Situation(场景):某 OLAP 系统运行大量报表查询,服务器 128GB 内存,PGA 使用量经常飙升到 80GB+,导致操作系统触发 OOM Killer,数据库实例被终止。
T — Task(任务):限制 PGA 使用量,防止 OOM,同时保证报表查询正常运行。
A — Action(行动):
1、查看当前 PGA 使用情况:
SELECT NAME, VALUE/1024/1024 AS MB FROM V$PGASTAT WHERE NAME IN ('aggregate PGA target parameter', 'total PGA allocated', 'maximum PGA allocated');
2、设置合理的 PGA 目标(总内存 128GB,OS 预留 16GB,SGA 48GB):
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 48G SCOPE=BOTH;
3、设置 PGA 硬限制(12c+ 新特性,关键!):
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 64G SCOPE=BOTH;
4. 验证配置:
SHOW PARAMETER PGA;
R — Result(结果):PGA 使用量稳定在 48GB 以内,极端情况不超过 64GB。操作系统内存充足,不再触发 OOM Killer。超限查询被自动终止并报错 ORA-04036,DBA 可通过告警及时处理。
1.4 核心后台进程
Oracle 实例依赖多个后台进程协同工作,每个进程负责特定的功能。
|
进程 |
全称 |
功能 |
|
DBWn |
Database Writer |
将脏缓冲区写入数据文件 |
|
LGWR |
Log Writer |
将重做日志缓冲区写入联机重做日志 |
|
CKPT |
Checkpoint |
触发检查点,更新数据文件头和控制文件 |
|
SMON |
System Monitor |
实例恢复、空间合并、清理临时段 |
|
PMON |
Process Monitor |
清理失败进程、释放锁和资源 |
|
MMON |
Manageability Monitor |
AWR 快照收集、告警生成 |
|
MMAN |
Memory Manager |
自动内存管理(AMM/ASMM) |
|
ARCn |
Archiver |
归档重做日志 |
|
MMNL |
Manageability Monitor Light |
轻量级 AWR 采样 |
|
CJQn |
Job Queue Coordinator |
调度 DBMS_JOB/DBMS_SCHEDULER 任务 |
案例:后台进程异常导致数据库挂起
S — Situation(场景):某生产数据库突然无法写入数据,应用报 ORA-00494: enqueue [CF] 相关错误,数据库 Alert Log 中出现 LGWR 进程异常告警。
T — Task(任务):快速定位 LGWR 故障原因并恢复数据库服务。
A — Action(行动):
1、检查后台进程状态:
SELECT PNAME, PID, STATUS FROM V$PROCESS WHERE PNAME = 'LGWR';
-- 发现 LGWR 状态为 DEFUNCT
2、检查 Alert Log:
-- 发现 LGWR 因联机重做日志所在磁盘满而无法写入
3、检查磁盘空间:
-- 确认 +REDO 磁盘组使用率 100%
4、清理磁盘空间并切换日志:
-- 删除过期归档日志
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM CHECKPOINT;
5、验证 LGWR 恢复:
SELECT PNAME, STATUS FROM V$PROCESS WHERE PNAME = 'LGWR';
R — Result(结果):LGWR 进程恢复正常,数据库写入操作恢复。后续建立了磁盘空间监控告警,当磁盘使用率超过 85% 时自动清理归档日志。
更多推荐

所有评论(0)