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% 时自动清理归档日志。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐