Oracle DB 体系结构

本贴最后更新于 2727 天前,其中的信息可能已经时移世异

内存结构:

  1. 系统全局区(SGA):数据库缓冲区高速缓存、重做缓冲区以及各种池
  2. 程序全局区(PGA)

进程结构:

  1. 用户进程和服务器进程
  2. 后台进程:SMON、PMON、DBWn、CKPT、LGWR、ARCn 等

存储结构:

  1. 逻辑:数据库、方案、表空间、段、区和 Oracle 块
  2. 物理: 数据文件、控制文件和重做日志文件

Oracle DB 服务器由一个数据库(Oracle DB)以及一个或多个数据库实例组成。每当启动一个实例时,都会分配一个称为系统全局区的共享内存区,并启动后台进程,然后装载数据库(与特定数据库相关联),一个 Oracle DB 实例可以有多个后台进程

对上述结构术语的详解:

  1. SGA 包含实例的数据和控制信息,主要包含以下结构:
    1)数据库缓冲区高速缓存:用于缓存从数据库(数据文件)中检索到的数据块
    2)重做日志缓冲区:存放有关对数据库所做更改的信息,用来缓存用于实例恢复的重做信息,直到可以将其写入磁盘中存储
    3)共享池:用于缓存可在用户间共享的各种结构,包括库高速缓存、数据字典高速缓存、SQL 查询结果高速缓存、PL/SQL 函数结果高速缓存、并行执行消息的缓冲区以及控制结构
    4)大型池:用于某些大型进程(例如 Oracle 备份和恢复操作)和 I/O 服务器进程
    5)Java 池:用于 Java 虚拟机(JVM) 中特定于会话的所有 Java 代码和数据
    6)流池:Oracle Streams 使用它来存储捕获和应用操作所需的信息
  2. 常见后台进程包括:
    1)数据库写进程(DBWn):将数据库缓冲区高速缓存中经过修改的缓冲区写入磁盘
    2)日志写进程(LGWR):将重做日志缓冲区写入磁盘上的重做日志文件中,在用户提交事务处理时会执行这个进程
    3)检查点进程(CKPT):将检查点信息记录在控制文件和每个数据文件头中
    4)系统监视器进程(SMON):在实例启动时执行恢复,同时负责清除不使用的临时段
    5)进程监视器进程(PMON):在用户进程失败时执行进程恢复,监视会话是否发生空闲会话超时,将数据库服务动态注册到监听程序
    6)恢复器进程(RECO):自动解决涉及分布式事务处理的故障
    7)作业队列进程
    8)归档进程(ARCn):在发生日志切换之后,将重做日志文件复制到指定的存储设备,可以收集事务处理重做数据,并将该数据传输到备用目标位置
    9)队列监视器进程(QMNn)

用一个网上的例子说明(非原创):

有一家叫甲骨文的粮店,老板很严谨,为了防止仓库的粮食在买入卖出的时候发生问题,他制订一套流程,首先进出仓库的每一担粮食都要求有一个编号(SCN),而且出入库之前必须先放到一个平台上(Buffer Cache),他命令仓库叫大头的伙计(Datafile Head)来首先记录这个编号,然后每隔一定的时间(log_checkpoint_timeout)或者库房平台上的粮食堆放到一定的数量或者仓库伙计换班(log swtich)的时候,一个叫“点点”(CKPT)的后院家奴就会把仓库伙计记录的信息拿给帐房先生同时还会催促把放在仓库平台的粮食入仓或者出仓(DBWn),帐房先生根据“点点”拿来的帐页记录到自己的帐本上。这样一来每天老板要和账房先生、仓库伙计进行账务的核对,一旦发现仓库伙计记录了而帐房先生没记录的情况就要求帐房先生把伙计记录的信息誊写到自己的帐本上,而如果发现帐房先生有记录了而仓库伙计这里却没有,那就麻烦大了,这说明仓库伙计有可能把之前的记录帐页给丢掉了,也就意味着粮食有丢失的危险,不过也不用过分担心,老板手下还有一个给力干将叫“SMON”, 是的,之所以给力就是因为是个洋和尚,外来的和尚会念经嘛。这个”SMON”的洋和尚会想办法去找这些编号的粮食,一旦找到就会让仓库伙计按照帐房先生的记录来重新同步自己的帐本,这事就算是完了,可一旦连“SMON”都搞不定,那么老板就头大了,生意就得关张,意味着有粮食可能会丢失。这时候要么从其他地方找来一摸一样的粮食充数,还要让帐房先生和仓库伙计的帐本都清空从 0 开始重新记录,以免又出现不同的情况。

SCN

System Change Number,当 Oracle 数据库更新后,由 DBMS 自动维护去累积递增的一个数字。

Buffer Cache

为了能够加快处理数据的速度,oracle 必须将读取过的数据缓存在内存里。而这些缓存在内存里的数据就是数据高速缓存区(Buffer Cache),buffer cache 就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。通过初始化参数:buffer_cache_size 来指定 buffer cache 的大小。

Datafile Head

数据文件头,是 datafile 的第 1 第 2 个 block(块),记录 SCN 和 CheckPoint

CKPT(checkpoint)

这是 Oracle 的一个内部事件,这个事件激活以后会触发数据库写进程(DBWR)将数据缓冲(DATA BUFFER CACHE)中的脏数据(被修改过的数据)块写出到数据文件中。

DBWn

和 DBWr(Database Writer)是一个概念,后来允许多进程写 data file,所以改成 DBWn 了,负责把 buffer cache 内的脏数据写入数据文件,一般是接收到 checkpoint 进程的指令后执行,但是当 server process 在 buffer cache 中无法找到可用的 buffer 时,也会调用 DBWn 清理 buffer cache,保证用户进程始终可以在 buffer cache 中找到空闲的位置

SMON

系统监视进程,System Monitor,可以利用一句话来概括,即人小鬼大。其负责的内容并不是很多,但是对于数据的安全与数据库的性能却有很关键的作用。随着表空间中的数据不断的建立、删除、更新等等,在表空间中难免会产生碎片。由于这些碎片的存在,数据库的性能会逐渐的降低。而 SMON 的作用,就可以解决这些碎片。

最后:一条 SQL 请求过程

用户运行一条 DML 类型的 SQL 语句并提交事务处理。服务器进程接收该语句,并检查共享池中是否有包含相同 SQL 语句的共享 SQL 区域。如果找到共享 SQL 区域,服务器进程将检查用户对于所请求数据的访问权限,并且使用现有的共享 SQL 区域处理该语句。如果未找到共享 SQL 区域,则为该语句分配一个新的共享 SQL 区域。共享 SQL 区域创建好后,服务器进程从实际数据文件(表)或数据库缓冲区高速缓存中存储的值中得到此次 SQL 的结果。由于提交了事务处理,日志写进程(LGWR)会把该事务处理记录到重做日志文件中。数据库写进程(DBWn)会待执行效率高时将修改后的块永久写入磁盘

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    343 引用 • 723 回帖
  • 进程
    15 引用 • 4 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...