19、Oracle 基础教程 - Oracle的体系结构

1. 物理结构

Oracle数据库的物理结构由参数文件、控制文件、数据文件和日志文件组成,用于存储和管理数据库的数据和元数据,每个文件都扮演着不可或缺的角色。

  • 参数文件用于配置数据库的初始化参数
  • 控制文件记录数据库的结构和状态信息
  • 数据文件存储了实际的数据
  • 日志文件记录了数据库的变更操作

 

数据库启动过程中,Oracle首先加载参数文件,然后读取控制文件,接着加载数据文件和日志文件。

参数文件中的配置信息会影响到数据库实例的初始化过程,决定了数据库的初始参数值。控制文件记录了数据库的结构和状态信息,包括数据文件和日志文件的列表。数据文件存储了数据库中的实际数据,而日志文件记录了数据库的变更操作。

在数据库运行时,如果需要修改参数值,可以通过修改参数文件(PFILE或SPFILE)或使用ALTER SYSTEM语句来实现。对于控制文件、数据文件和日志文件的管理,可以使用Oracle提供的工具和命令进行备份、恢复、重建等操作。

(1)参数文件(Parameter File)

参数文件是Oracle数据库实例的配置文件,它包含了一系列的参数和对应的取值,用于控制数据库系统的行为。

根据其使用方式和位置,Oracle参数文件分为两种类型:SPFILE(Server Parameter File)和PFILE(Parameter File)。

  • SPFILE以二进制格式存储,可以在数据库运行时动态修改参数值。它通常存储在服务器的文件系统中,如$ORACLE_HOME/dbs目录下的spfileSID.ora文件。SPFILE的主要优点是可以使用ALTER SYSTEM语句在运行时修改参数值,无需重新启动数据库。同时,SPFILE还提供了参数值的持久化功能,可以保证数据库在下次启动时使用最新的参数值。
  • PFILE是传统的文本格式参数文件,以ASCII格式存储。它需要手动编辑或使用工具进行修改。PFILE通常存储在服务器的文件系统中,如$ORACLE_HOME/dbs目录下的initSID.ora文件。与SPFILE相比,PFILE的主要不足之处是不能在数据库运行时动态修改参数值,需要重新启动数据库才能生效。

参数文件由一系列的参数和对应的取值组成,每个参数占据一行,以参数名和参数值的形式表示。

# This is a comment
processes = 200
db_block_size = 8192
sga_target = 4G

Oracle数据库有大量的参数,每个参数都有不同的作用和取值范围。以下是一些常见的Oracle参数及其作用:

  • processes:控制数据库实例能够同时处理的并发连接数。
  • db_block_size:定义数据块的大小,影响数据库存储和I/O性能。
  • sga_target:指定SGA(System Global Area)的目标大小,包括缓冲区高速缓存和共享池。
  • undo_tablespace:指定回滚段表空间的名称,用于管理事务的回滚和并发控制。
  • log_archive_dest:定义归档日志文件的位置和传输方式,用于实现数据备份和恢复。
  • optimizer_mode:确定SQL查询优化器的工作模式,影响SQL查询的执行计划和性能。

(2)控制文件(Control File)

控制文件是Oracle数据库的关键元数据之一,用于记录数据库的结构信息和运行状态。它包含了数据库的名称、创建时间、数据文件列表、日志文件列表以及重要的数据库参数值等信息。控制文件还记录了数据库的日志序列号,用于实现数据恢复和故障恢复。

每个Oracle数据库实例通常有一个或多个控制文件,其中至少有一个是当前的控制文件。控制文件通常存储在操作系统的文件系统中,如$ORACLE_HOME/dbs目录下的control01.ctl文件。为了提高可靠性和冗余性,可以配置多个控制文件,并在参数文件中进行相应的设置。

在数据库启动过程中,Oracle首先会读取控制文件,然后加载数据文件和日志文件,进而恢复数据库的一致性。因此,控制文件对于数据库的正常运行非常重要。如果控制文件损坏或丢失,可以使用备份的控制文件进行恢复。

(3)数据文件(Data File)

数据文件是Oracle数据库中存储实际数据的文件。每个表空间(Tablespace)都由一个或多个数据文件组成,用于存储表、索引、视图和其他数据库对象的数据。数据文件使用多个数据块(Data Block)来组织和管理数据,每个数据块有固定的大小,由数据库参数db_block_size定义。

Oracle数据库支持多种类型的数据文件,包括数据文件、索引文件、临时文件和控制文件备份等。数据文件通常存储在操作系统的文件系统中,如$ORACLE_HOME/dbs目录下的system01.dbf文件。为了提高性能和可靠性,可以将数据文件分散在不同的物理磁盘上。

数据文件可以根据需要进行扩展和收缩,以适应数据库的存储需求。此外,还可以对数据文件进行备份和恢复,以保证数据的可靠性和完整性。

(4)日志文件(Redo Log File)

日志文件是Oracle数据库的事务日志,用于记录数据库的变更操作。它包含了所有已提交的事务的更改信息,包括INSERTUPDATEDELETE等操作。日志文件的主要作用是支持数据库的恢复和故障恢复。

Oracle数据库有两种类型的日志文件:在线重做日志文件(Online Redo Log File)和归档日志文件(Archive Redo Log File)。

  • 在线重做日志文件是当前正在使用的日志文件,它记录了正在进行中的事务的更改操作。
  • 归档日志文件是已经被归档的日志文件,用于实现数据备份和恢复。

在线重做日志文件通常存储在操作系统的文件系统中,如$ORACLE_HOME/dbs目录下的redo01.log文件。归档日志文件可以存储在与数据文件不同的磁盘上,以提高可靠性和冗余性。

需要注意的是,日志文件的大小和数量都是可配置的,以适应数据库的需求。Oracle数据库会自动轮换使用在线重做日志文件,并将已满的在线重做日志文件写入归档日志文件以进行数据备份和恢复。

2. 内存结构

Oracle 实例是后台进程和内存结构的组合。必须启动实例才能访问数据库中的数据。每次启动实例都会分配一个系统全局区(SGA,System Global Area)并启动Oracle 后台进程。

2.1 SGA

SGA是一个内存区域,用于存储由数据库进程共享的数据库信息,包含Oracle服务器的数据和控制信息。

 

(1)DB buffer(数据高速缓存区)

内存中用来频繁访问的区域,包括默认缓存池、保存缓存池、再生缓存池。

处理查询时,服务器进程在数据库缓冲区高速缓存中查找任何所需的块。如果未在数据库缓冲区高速缓存中找到这个块,服务器进程就从数据文件读取这个块,并且在缓冲区高速缓存中放置一个副本。由于对同一个块的后续请求可以在内存中找到这个块,因此这些请求可能不需要物理读取。Oracle 服务器使用最近最少使用算法来释放近期未被访问的缓冲区,以便在缓冲区高速缓存中为新块腾出空间。

DML语句处理

 

  • 如果缓冲区高速缓存中尚不存在数据和回退块,那么服务器进程就会从数据文件中将它们读入缓冲区高速缓存。

  • 服务器进程在将要修改的行上放置锁。

  • 在重做日志缓冲区中服务器进程记录将要对回退和数据进行的更改。

  • 回退块更改记录数据修改以前的值。回退块用于存储成映像前的数据,以便必要的情况下DML 语句能够回退。

  • 数据块更改记录数据的新值。

  • 服务器进程将成映像前的数据记录到回退块中,并且更新数据块。这两种更改都是在数据库缓冲区高速缓存中进行的。缓冲区高速缓存中的任何已更改块都标记为灰数据缓冲区- 即与磁盘中相应的块不同的缓冲区。

缓冲区高速缓存中每个缓冲区的大小都与Oracle 块的大小相等,而且它由DB_BLOCK_SIZE参数指定。缓冲区的数目等于DB_BLOCK_BUFFERS 参数值。

(2)共享池

共享池的大小由SHARE_POOL_SIZE决定,包括库缓存区(共享SQL区,PL/SQL区)、字典缓存区。库高速缓存包含SQL语句文本,分析代码和执行计划;字典缓存区包含表,列和其他对象定义和权限。

(3)Redo buffer(重做日志缓冲区)

跟踪服务器和后台进程对数据库所做的更改,它的字节大小由LOG_BUFFER 参数定义。记录被更改的块、更改位置以及重做条目中的新值;重做条目不区分被更改块的类型,它只记录块中哪些字节发生了更改。重做日志缓冲区连续使用,而且一个事务处理所做的更改可能会与其它事务处理的更改交叉存取;它是在已满后可以重新使用的循环缓冲区,但是只有在所有旧的重做条目都记录在重做日志文件之后才能使用。

COMMIT提交处理:

  • 服务器进程随同系统更改号(SCN)一起在重做日志缓冲区中放置一个提交记录。
  • LGWR 向重做日志文件中连续写入直到提交记录含提交记录的所有重做日志缓冲区条目。这之后,Oracle 服务器就能够保证即使存在实例失败也不会丢失更改。
  • 通知用户COMMIT 命令已完成。
  • 服务器进程记录信息以指出事务处理已完成并且可以释放资源锁。

每当事务处理提交时,Oracle 服务器就把一个提交系统更改号(SCN) 分配给该事务处理。SCN 是简单递增的,而且在数据库中是唯一的。Oracle 服务器使用它作为内部时间戳以使数据同步。并且在从数据文件检索数据时提供读一致性。使用SCN 使 Oracle 服务器能够执行一致性检查,而不用依赖操作系统的日期和时间。

(4)大共享区

存储不与SQL语句处理直接相关的大型内存结构,如在备份和还原操作中复制的数据块。

(5)固定SGA

存储Java代码。

2.2 后台进程

每个Oracle实例都包括以下五个必须的后台进程:

(1)数据库写入程序(DBW0)

数据库写入程序将灰数据缓冲区从数据库缓冲区高速缓存写入数据文件。它确保有足够数量的空闲缓冲区(即当服务器进程需要读取数据文件中的块时可以覆盖的缓冲区) 在数据库缓冲区高速缓存中可用。由于服务器进程只在缓冲区高速缓存中进行更改,因此数据库性能得到改善,而且DBW0 延迟写入数据文件直到发生下列事件之一:

  • 灰数据缓冲区的数量达到阈值
  • 当进行扫描而无法找到任何空闲缓冲区时进程扫描了指定数量的块
  • 出现超时(每三秒)
  • 出现检查点(检查点是使数据库缓冲区高速缓存与数据文件同步的一种方法)

(2)日志写入程序(LGWR)

将重做日志缓冲区中注册的更改写入重做日志文件。
LGWR 在下列情况下执行从重做日志缓冲区到重做日志文件的连续写入:

  • 当提交事务处理时
  • 当重做日志缓冲区的三分之一已满时
  • 当重做日志缓冲区中记录了超过1 MB 的更改时
  • 在 DBW0 将数据库缓冲区高速缓存中修改的块写入数据文件以前因为恢复操作需要重做,所以LGWR 只在重做写入磁盘后确认COMMIT 命令。

(3)系统监控程序(SMON)

检查数据库的一致性.果Oracle 实例失败,那么SGA 中尚未写入磁盘的所有信息都会丢失。实例丢失后,后台进程SMON 在数据库重新打开时自动执行实例恢复。恢复实例需要进行以下步骤:

  • 前滚以恢复尚未记入数据文件但已经记入联机重做日志中的数据。由于实例失败过程中SGA 的丢失,这些数据尚未写入磁盘。在这个进程中,SMON 读取重做日志文件并将重做日志中记录的更改应用到数据块中。由于所有提交的事务处理都已被写入重做日志,因此该进程完全恢复这些事务处理。
  • 打开数据库以允许用户登录。未被未恢复事务处理锁定的任何数据都立即可用。
  • 回退未提交的事务处理。它们由SMON 回退,或在访问锁定的数据时由单个服务器进程回退。

SMON 也执行一些空间维护功能:

  • 联合或合并数据文件中空闲空间的邻近区域。
  • 回收临时段将它们作为数据文件中的空闲空间返回。临时段用于在SQL 语句处理过程中存储数据。

(4)过程监视器(PMON)

负责在一个Oracle 进程失败时清理资源,进程失败后,后台进程PMON 通过下面的方法进行清理:

  • 回退用户的当前事务处理
  • 释放当前保留的所有表锁或行锁
  • 释放用户当前保留的其它资源

(5)检查点进程(CKPT)

负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。

3. 逻辑结构

 

(1)数据文件(Data Files)

数据文件是Oracle数据库中存储数据的基本单位。每个数据文件都对应于操作系统中的一个物理文件,可以位于磁盘、阵列或其他存储介质上。数据文件是以固定大小的块(Block)为单位进行管理的。

(2)表空间(Tablespaces)

表空间是一个逻辑存储结构,用于组织和管理数据文件。一个数据库可以包含多个表空间,每个表空间包含一个或多个数据文件。表空间可以由DBA(数据库管理员)创建和管理,它定义了数据文件的分配和增长方式。

Oracle数据库中有四种类型的表空间:系统表空间、用户表空间、临时表空间和回滚表空间。系统表空间用于存储数据库的元数据,用户表空间用于存储用户数据,临时表空间用于存储临时数据(如排序和临时表),回滚表空间用于存储事务回滚数据。

(3)段(Segments)

段是逻辑结构中更高层次的组织单位,用于存储和管理数据。一个表或索引在磁盘上对应一个或多个段。根据对象的类型不同,可以有表段、索引段、分区段等。

表段包含了表的数据行,索引段包含了索引的键值和指向表的指针。分区段是指将表或索引分割为多个部分,每个部分独立存储在不同的段中,以提高查询效率和管理灵活性。

(4)盘区(Extents)

盘区是段的存储单元,它是由一个或多个连续的数据块组成的。在Oracle数据库中,块是最小的物理读写单位,一般为8KB或16KB大小。盘区的大小取决于段的大小、空间使用情况以及数据库的配置参数。

当段需要存储更多数据时,Oracle会自动分配新的盘区。如果一个盘区不足以容纳一个逻辑块,则会分配多个相邻的盘区。当段中的数据被删除或移动时,相应的盘区会被释放出来供其他对象使用。

(5)块(Blocks)

块是Oracle数据库中最基本的存储单位。它是数据文件中的连续数据单元,用于存储和检索数据。每个块由一组字节组成,包括数据、元数据和用于管理块的控制信息。

在一个块中,可以存储一个或多个表或索引的数据行。块的大小在创建数据库时确定(默认大小为8K)并且在整个数据库中保持一致。较小的块大小可以提高存储效率,但也会增加管理开销。较大的块大小可以提高IO性能,但会浪费存储空间。