1. 实例(Instance)概述
Oracle实例由两大部分构成:内存结构与后台进程。实例启动时,系统会自动分配SGA(System Global Area)并启动必要的后台进程。需要注意的是,一个实例只能连接一个数据库,但一个数据库可被多个实例访问,例如在RAC(Real Application Clusters)环境中。内存结构:SGA(System Global Area)
SGA是Oracle的核心内存区域,主要包括以下组件:- 共享池(Shared Pool)
- 数据库高速缓冲区(Database Buffer Cache)
- 重做日志缓冲区(Redo Log Buffer)
- 大池(Large Pool,可选)
- Java池(Java Pool,可选)
- Streams池(Streams Pool,可选)
- 其他锁信息和统计信息存储区域
必需的五个后台进程
实例成功运行依赖于以下五个关键后台进程的正常启动:- SMON:系统监督进程,负责实例恢复和空间整理
- PMON:进程监督进程,清理异常终止的会话资源
- DBWR:数据库写进程,将脏数据块写入数据文件
- LGWR:重做日志写进程,负责将重做日志条目写入磁盘
- CKPT:检查点进程,触发检查点操作以同步数据文件与控制文件状态
1.1 系统全局区(SGA)详解
1.1.1 共享池(Shared Pool)
共享池主要包含以下几个子结构:- 库高速缓存(Library Cache)
- 数据字典高速缓存(Data Dictionary Cache)
- 服务器结果缓存(Server Result Cache)
- 其他缓存结构
(1)库高速缓存
当服务器进程处理SQL或PL/SQL语句时,会将其文本、解析后的代码以及执行计划存入库高速缓存中。要实现语句共享,需满足两个条件:- 共享池容量足够大,避免频繁淘汰缓存内容
- SQL编写方式支持共享,如WHERE子句使用参数化形式,提升语句匹配度
(2)数据字典高速缓存
在执行SQL语句过程中,服务器进程会将表、索引、列、用户权限等对象的定义信息缓存在此区域,以便快速访问元数据。注意:并非所有SQL都能持续共享。一旦某个数据库对象被修改(如ALTER TABLE),所有引用该对象的缓存代码将失效,必须重新解析和编译。
补充:Oracle SQL执行流程
以执行SELECT * FROM dept 为例,整个过程分为三个阶段:
- 编译阶段(Parse)
- 检查共享池中是否存在相同SQL语句,判断是否可复用执行计划
- 若无匹配项,则进行语法检查
- 查询数据字典获取表和列的定义信息
- 对涉及的对象加编译锁
- 验证用户权限
- 生成最优执行计划
- 将SQL文本及执行计划存入共享SQL区(区别于共享PL/SQL区)
- 执行阶段(Execute):按照生成的执行计划执行操作
- 提取数据阶段(Fetch):从缓冲区或磁盘读取所需数据,并返回给客户端
1.1.2 数据库高速缓冲区(Database Buffer Cache)
该区域用于缓存从磁盘读取的数据块。当执行SQL语句时,Oracle首先在数据库高速缓冲区查找所需数据;若未命中,则从数据文件中读取并加载至该缓冲区,从而减少I/O开销,提高性能。1.1.3 重做日志缓冲区(Redo Log Buffer)
为保障数据安全,在执行任何DML或DDL操作前,Oracle会先将变更记录及其回滚信息写入重做日志缓冲区。这些信息随后由LGWR进程写入在线重做日志文件,确保故障恢复时能重放事务操作。1.1.4 大池(Large Pool)
大池不采用LRU(Least Recently Used)算法管理内存,通常用于多线程服务器(MTS)或共享服务器模式下的大型内存请求,如备份恢复操作中的直接I/O缓冲。1.1.5 Java池(Java Pool)
Java池专为支持Java应用而设计,用于存放Java虚拟机中编译的类、方法及相关运行时信息,便于在数据库内执行Java存储过程或函数。1.1.6 Streams池(Streams Pool)
该内存区域服务于Oracle Streams功能,用于存储数据捕获、传播和应用过程中所需的状态信息与消息队列。1.2 程序全局区(PGA:Program Global Area)
PGA是为每个服务器进程单独分配的私有内存区域,不可共享。它随服务器进程的创建而分配,随进程结束而释放。在专有服务器配置下,PGA主要包括以下部分:- 排序区(Sort Area):用于排序操作,如ORDER BY、GROUP BY
- Cursor状态区:保存游标执行过程中的中间状态
- 会话信息区:包括用户权限、优化器统计信息等
- 堆栈区:存储局部变量和调用栈信息
1.3 后台进程(Background Processes)
1.3.1 系统监督进程(SMON)
当数据库因异常关闭后重启时,SMON进程将自动执行实例恢复任务,具体包括:- 将已记录在重做日志文件中但尚未写入数据文件的已提交事务数据重新写入数据文件
- 回滚未提交的事务,保证数据一致性
说明:虽然SMON负责整体实例恢复,但个别服务器进程也可能参与回滚操作,仅限于其自身持有锁的数据行。
此外,SMON还承担一些系统维护职责,如合并空闲表空间碎片、清理临时段等。1.3.2 进程监控进程 PMON
当某个进程异常终止时,PMON(Process Monitor)将执行必要的清理操作,具体包括:
- 回滚该用户当前正在进行的事务
- 释放该用户在表级和行级上持有的所有锁
- 释放该用户占用的其他系统资源
1.3.3 数据库写进程 DBWR
数据库写进程(DBWR,Database Writer)的主要职责是将数据库高速缓存中的“脏数据”(即已被修改但尚未写入磁盘的数据)刷新到数据文件中。
以下情况会触发 DBWR 执行写操作:
- 脏数据块的数量超过预设阈值
- 达到设定的时间间隔
- 有进程请求空闲缓冲区但未找到可用空间
- 发生检查点(Checkpoint)事件
- 某个表被删除或截断(TRUNCATE)
- 某个表空间被设置为只读状态
- 执行类似
ALTER TABLESPACE users BEGIN BACKUP的命令进行联机备份 - 表空间被置为脱机状态或恢复为在线状态
在 Oracle 12c 版本中,最多可配置 100 个 DBWR 进程,标识为 DBW1 至 DBW100。可以通过以下方式查看当前实例中活跃的 DBWR 数量:
SHOW PARAMETER DB_WRITER_PROCESS;
1.3.4 重做日志写进程 LGWR
LGWR(Log Writer Process)负责将重做日志缓冲区中的记录顺序写入重做日志文件,确保事务变更能够持久化保存。
Oracle 使用“快速提交”机制来提升性能,其中引入了系统变更号(SCN)。每当一个事务提交时,Oracle 会为其分配一个唯一的 SCN,该编号在整个数据库中单调递增,作为内部时间戳使用,避免依赖操作系统时钟带来的不一致性问题,从而保障数据读取的一致性和恢复过程中的同步性。
当客户端执行 COMMIT 操作时,流程如下:
- 服务器进程将提交记录及对应的 SCN 写入重做日志缓冲区
- LWGR 将从缓冲区起始位置至当前提交记录的所有条目连续写入重做日志文件
- 向用户进程返回提交成功通知
- 服务器进程更新数据库高速缓存中相关数据的状态,并释放锁与资源
除 COMMIT 外,以下条件也会触发 LGWR 写操作,以防止因系统崩溃导致未写入的日志丢失:
- 重做日志缓冲区使用量超过其总容量的三分之一
- 在 DBWR 将修改过的数据块写入数据文件之前
- 每隔 3 秒自动触发一次
1.3.5 检查点进程 CKPT
检查点(Checkpoint)是一种用于提高系统恢复效率和保证数据库一致性的机制,通常由 CKPT 进程触发。它标志着某一时刻前的所有更改均已安全写入数据文件。
一旦检查点事件发生,Oracle 会执行以下操作:
- 将检查点编号写入各数据文件的文件头
- 将检查点编号、当前重做日志序列号、归档日志名称以及最高/最低 SCN 记录到控制文件中
CKPT 进程还会通知 DBWR 执行脏数据刷新动作。在大多数生产环境中,检查点间隔通常设置为 20 分钟或更长,以平衡性能与恢复速度。
1.3.6 归档日志进程 ARCH
ARCH 进程仅在数据库处于归档模式下才启用。由于重做日志文件采用循环覆盖的方式写入,若不加以保留,在数据库崩溃后可能无法完成完整恢复。
因此,归档日志文件相当于重做日志的备份副本。ARCH 进程的作用是将已填满并即将被覆盖的重做日志文件复制到指定的归档目录中,形成归档日志文件,供后续恢复使用。
可通过以下 SQL 查询当前数据库实例中存在的后台进程数量:
SELECT * FROM V$PROCESS WHERE BACKGROUND = '1';
2. 数据库(Database)
Oracle 数据库本质上是一组操作系统文件的集合,主要包括三类核心文件:
- 控制文件(Control Files):存储用于维护和验证数据库结构完整性的元信息
- 重做日志文件(Redo Log Files):记录所有数据库变更操作,用于故障恢复
- 数据文件(Data Files):存放实际的用户数据和系统数据
此外,还有一些不属于数据库本身但与实例运行密切相关的辅助文件:
- 初始化参数文件
- 密码文件:用于在数据库未启动时验证具有管理员权限用户的登录身份
- 归档重做日志文件
3. 客户端进程(Client Process)
客户端工具如 sqlplus 或其他应用程序均属于用户进程范畴。需要注意的是,这些用户进程运行在客户端机器上,不能直接访问数据库,必须通过服务器进程间接交互。
3.1 连接与会话
在向 Oracle 实例发送 SQL 命令前,用户必须先建立连接。
在默认的专用服务器连接模式下,当用户成功登录(例如通过 sqlplus 输入用户名和密码),Oracle 会在服务器端创建一个专属的服务器进程为之服务,形成一对一的关系,这种状态称为“会话”。
术语定义如下:
- 连接(Connection):指用户进程与数据库实例之间建立的通信链路
- 会话(Session):表示用户成功登录后与数据库实例交互的当前状态
除了专用连接外,还可配置共享连接模式,适用于高并发 OLTP 系统,例如 Oracle 9i 中的 MTS(多线程服务器)或之后版本中的共享服务器(Shared Server)架构。
专用连接支持三种通信方式:
- 基于主机的本地连接方式,如执行
sqlplus / as sysdba,此时用户进程与服务器进程通过操作系统级别的进程间通信机制进行交互
1.3.1 回收与合并空闲空间
在数据文件管理中,需定期对相邻的空闲区域进行回收与合并,以优化存储利用率;同时,临时段在使用完毕后应及时释放,避免资源浪费。
(2)客户端与服务器之间的通信依赖网络协议实现,采用的是两层架构模式。
(3)客户端通过应用服务器与后端服务器进行交互,结构上类似于两层模式,但扩展为三层架构模式。
2.2 服务器进程(Server Process)
-- 查看用户进程与会话关联信息
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.program,
s.machine,
p.spid AS "OS Process ID",
p.pid AS "Oracle Process ID",
s.logon_time
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.username IS NOT NULL;

雷达卡


京公网安备 11010802022788号







