目录

一文看懂Oracle体系结构:实例与数据库的协作

在数据库领域中,Oracle是一个广泛使用的关系型数据库管理系统(RDBMS)。它的体系结构由实例和数据库两部分组成。接下来我们将详细介绍Oracle的体系结构,并深入探讨实例和数据库的组成要素。

在这里插入图片描述

体系结构

Oracle的体系结构是一个高度可扩展和可靠的架构,它将数据存储在持久的数据库中,并通过实例提供对数据的访问和管理。实例负责处理数据库的各种操作和管理数据库的内存结构,而数据库负责存储实际的数据、相关的控制信息和日志。

一. 实例(Instance)

实例是Oracle数据库的运行环境,它是由内存结构和一系列后台进程组成的。每个数据库在运行时都有一个对应的实例。实例负责管理数据库的访问、内存分配、并发控制、故障恢复等任务。

1. 程序全局区 PGA(Program Global Area)

当连接到数据库实例的用户进程请求数据库时,由Oracle的服务器进程负责解析并执行。启动服务器进程的时候,Oracle会给这个进程分配一块内存区域,即程序全局区 PGA。PGA中存放服务器进程的数据和控制信息,是每个用户进程的私有内存区域,不能被其它进程共享。PGA主要由以下几个部分构成:

a.会话区(Session Area)

用于保存用户会话所具有的权限、角色、性能统计信息。

b.排序区(Sort Area)

主要用于存放排序操作所产生的临时数据。

c.游标区(Cursor Area)

用于存放执行游标操作时所产生的数据。

d.堆栈区(Stack Area)

用于保存会话过程中的绑定变量、会话变量等信息。

2. 系统全局区 SGA(System Global Area)

当启动一个实例时,Oracle会分配内存区域给这个实例,即系统全局区 SGA。SGA中存放数据和数据库实例的控制信息,是一组共享的内存结构,多个用户可以同时连接到同一个实例,共享SGA中的数据。SGA主要由以下几个部分构成:

a. 数据库缓冲区缓存(Database Buffer Cache)

数据缓存区用于缓存数据库中当前或最近使用的从磁盘读取的数据块,来优化数据库的I/O减少物理读/写,提高数据的访问速度。Oralce依据类似LRU算法(Least Recently Used:最近最少使用页面置换算法,简单理解就是将访问次数最少、访问时间距现在最远的内存块作为牺牲者调出内存)对该内存区域进行block-level的更新。
(1)脏缓存快(Dirty buffers)
数据被修改过并且已经commit但是还未写入磁盘的数据缓存块,脏缓存块最终被DBWR进程写入到磁盘的数据文件中永久保存。
(2)命中缓存块(Pinned buffers)
最近正在被访问的缓存块,始终被保留在数据高速缓存中,不会被写入数据文件。
(3)空闲缓存块(Free buffers)
该缓存块中没有数据,等待被写入数据。oracle从数据文件中读取数据后,寻找空闲缓存块,以便写入其中。

b. 重做日志缓冲区(Redo Log Buffer)

日志缓存区是一块比较小的内存区域,它是用来短期存储将写入到磁盘中的重做日志信息,以实现数据库的恢复和故障保护。日志缓冲区也是为了减少磁盘IO,减少用户的等待时间。

c. 共享池(Shared Pool)

共享池主要用于存储频繁访问的数据字典信息和系统参数、已完成解析和执行的 SQL语句和PL/SQL 代码、SQL和PL/SQL结果缓存等,提高了查询的性能。
(1)数据字典缓存区(Data Dictionary Cache)
该区域用于存放SQL语句相关的数据文件、表、索引、列、用户、其他的数据对象的定义和权限信息等。
(2)库缓存区(Librabry Cache)
该区域存放共享SQL和PL/SQL代码。服务器进程在执行语句时,首先会匹配库缓存,如果存在相同语句则无需编译直接使用已编译的执行计划(缓存中key对应的是sql语句的ascill码,所以select变成SELECT也需要重新编译)。绑定变量不是在编译阶段赋值的,而是在运行阶段赋值的,因此含有绑定变量的SQL语句可以不用重新编译。
(3)SQL和PL/SQL结果缓存
该区域用于存放SQL和PL/SQL的执行结果,同样的语句会将结果直接返回。当执行了修改结果对象的语句时,会自动使对应的结果缓存失效。

d.Java池(Java Pool)

Java池主要用于支持在数据库中运行Java代码。

e.大池(Large Pool)

大池是Oracle可选的内存结构,可以分担共享池的压力,在使用RMAN备份和并行查询时会用到大池。

f.流池(Streams Pool)

流池是Oracle可选的内存结构,会用于缓存流进程在数据库间移动/复制数据时使用的队列消息。

3. 后台进程(Background Processes)

后台进程是在实例启动时自动创建的一系列进程,它们负责执行各种后台任务,如内存管理、故障恢复、数据刷新、日志写入等。常见的后台进程包括:

a. 进程监视器 PMON(Process Monitor)

监控用户进程和后台进程的状态,负责重启失败的进程。

b. 系统监视器 SMON(System Monitor)

负责数据库的恢复和一致性检查,以及清理未完成的事务。

c. 实例封锁 LCKn(Lock Process)

处理并发控制中的锁管理,确保数据的一致性和完整性,仅用于RAC。

d. 分布式数据库恢复 RECO(Recovery Process)

处理分布式事务的故障恢复。

e. 检查点 CKPT(Checkpoint Process)

负责在数据库中创建检查点,以确保数据的一致性和恢复性。

f. 数据写入 DBWR(Database Writer)

负责将数据缓存区中的数据写到磁盘(因为允许多进程写数据文件,所以也叫DBWn)。

g. 日志写入 LGWR(Log Writer)

负责将日志缓存区中的数据写到磁盘。

h. 归档日志 ARCH(Archiver Process)

负责归档日志文件,以便进行数据库的备份和恢复。

二. 数据库(Database)

数据库是物理存储数据的地方,它由一系列文件组成,包括参数文件、控制文件、数据文件、日志文件和归档日志文件等。数据库存储了用户的数据和数据库对象,如表、索引、视图等。

1. 参数文件(Parameter File)

参数文件包含了Oracle数据库的配置参数,如内存分配、并发连接数、日志文件大小等。它在数据库启动时被读取,用于初始化实例的各种参数。

2. 控制文件(Control File)

控制文件是数据库的元数据文件,它记录了数据库的结构信息、数据文件和日志文件的位置、数据库的日志序列号等。控制文件在数据库启动时被读取,用于恢复数据库的一致性。

3. 数据文件(Data File)

数据文件是数据库中存储实际数据的文件,它包含了表、索引和其他数据库对象的数据。数据文件在数据库创建时被分配,并在磁盘上存储数据块。

数据文件在逻辑结构上由表空间(tablespace)、段(segment)、区(extent)、块(block)组成。

a. 表空间(Tablespace)

表空间用于在逻辑上存储数据库对象,如表、索引等,一个数据库在逻辑上由一个或多个表空间组成。表空间又由一个或多个数据文件在物理上支持,表空间中的数据库对象的数据实际上是存储在数据文件中。表空间按性质可以分为以下几类:

系统表空间(System Tablespace)

系统表空间包含了系统级别的元数据,如数据字典、系统表和存储过程等。例如SYSTEM表空间用于保存数据库的数据字典、PL/SQL程序的源代码和解释代码、数据库对象的定义等;SYSAUX表空间用于存储数据库组件等信息,以减小SYSTEM表空间的负荷。

回滚表空间(Undo Tablespace)

回滚表空间用于回滚信息的自动管理。当需要撤销或回滚数据库中的操作时,回滚表空间记录了相关的数据变化信息,以确保数据库的一致性和事务的原子性。

临时表空间(Temporary Tablespace)

临时表空间用于处理数据库中的临时数据和临时操作。例如执行排序等SQL语句产生的大量临时数据和临时表的创建,都会使用临时表空间。临时表空间中的数据在会话结束后会自动被清除。

用户表空间(User Tablespace)

用户表空间用于存储用户创建的数据库对象,如表、索引、视图、存储过程等。

b. 段(Segment)

表空间由段组成,段是由一个或多个区组成的逻辑存储单元。一个表由一个或多个段组成,通常情况下普通表只有一个段,包含LOB列的表至少会有两个段(数据段和索引段),分区表的每个分区都会独立成段。

c. 区(Extent)

段由区组成,区是由连续的块组成的逻辑存储单元。区是Oracle数据库分配空间的最小单位。

d. 块(Block)

区由数据块组成,数据块简称块,是Oracle存取数据的最小单位。Oracle数据存储在块中,一个块占用一定的磁盘空间。Oracle每次访问数据的时候都以块为单位,块的大小一般是操作系统块大小的整数倍(一般情况下大多数操作系统的块容量为512字节或其整数倍,而数据块一般被默认设置为8KB)。数据块主要由以下五个部分构成:

数据块头(Header)

保存数据块的概要信息,例如块地址、数据块所属的段的类型(表、索引)。

表目录区(Table Directory)

保存所在的表的信息。

行目录区(Row Directory)

保存所在的行的信息。

可用空间区(Free Space)

块中预留的空余空间,由PCTFREE参数控制,默认为10%。

行数据区(Row Data)

保存具体的行的信息或者索引的信息。

4. 日志文件(Redo Log File)

日志文件用于记录数据库中的所有修改操作,包括数据的插入、更新和删除。它们用于数据库的恢复和故障保护,以确保数据的一致性和可恢复性。

5. 归档日志文件(Archived Redo Log File)

归档日志文件是已经被归档的重做日志文件,它们用于数据库的备份和恢复。归档日志文件可以被保存在磁盘上,以提供长期的数据保护。

SQL语句与体系结构

我们以SELECT查询语句或UPDATE更新语句为例,来看看它在执行过程中与Oracle体系结构的各个组成部分进行交互的过程:

  1. PGA(Program Global Area):

    • 当用户会话连接到数据库时,会话的连接信息和权限信息将存储在PGA中。
    • 执行SELECT查询语句时,查询的结果集可能会暂时存储在PGA的排序区中,供排序操作使用。
    • 执行UPDATE更新语句时,更新操作的数据可能会暂时存储在PGA中进行处理。
  2. SGA(System Global Area):

    • 执行SELECT查询语句时,查询语句的解析、优化和执行计划生成等操作会涉及SGA中的共享池。查询语句的解析结果和执行计划会被缓存到共享池中,以便下次相同的查询可以复用。
    • 执行UPDATE更新语句时,更新操作可能会引起数据缓存区的修改。被更新的数据块可能会从数据缓存区中读取到PGA中进行更新操作,然后再写回到数据缓存区。
  3. 后台进程(Background Processes):

    • PMON进程负责监控用户进程和后台进程的状态,如果发现有异常进程,会自动重启它们。
    • SMON进程负责数据库的恢复和一致性检查,确保查询和更新操作的数据一致性。
    • DBWR进程负责将更新操作的数据从PGA写回到数据缓存区。
    • LGWR进程负责将事务的重做日志写入日志缓存区,以保证查询和更新操作的持久性。
  4. 数据库文件

    • 执行SELECT查询语句时,查询的数据可能需要从数据文件中读取。数据文件包含了表、索引和其他数据库对象的实际数据。
    • 执行UPDATE更新语句时,被更新的数据块可能需要从数据文件中读取,并在更新后写回到数据文件中。同时,更新操作的重做日志也会被写入日志文件,以便进行恢复和故障保护。

当执行SELECT查询语句或UPDATE更新语句时,它们与Oracle的体系结构中的PGA、SGA、后台进程以及各种文件发生密切的关系。这些组件和过程协同工作,确保查询和更新操作的正确性、一致性和持久性。

总结

本文介绍了Oracle的体系结构,包括实例和数据库的组成。实例由PGA、SGA和一系列后台进程组成,负责管理数据库的运行环境和各种任务。数据库由参数文件、控制文件、数据文件、日志文件和归档日志文件等组成,用于存储用户的数据和数据库对象。深入理解Oracle的体系结构对于数据库工程师来说是至关重要的,它可以帮助他们更好地管理和优化Oracle数据库系统。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐