物理存储结构的介绍

RDBMS(关系型数据库)通常具有物理存储结构和逻辑存储结构。采用物理和逻辑结构分离的方式,可以做到管理物理结构而不影响逻辑结构的访问。
物理结构可分为数据库和实例。
Oracle数据库是Oracle数据存储在永久性磁盘存储中的一组文件。文件根据不同的作用,可具体细分为

  • 数据文件和临时文件
  • 控制文件
  • redo log文件

实例是用来管理数据库文件的内存结构,下图显示数据库文件和实例的关系。
image.png
有多种方式可以用来管理数据库文件,常见的方式有:

  • Oracle ASM
  • 操作系统文件系统
  • 原始设备
  • 集群文件系统

    数据文件的介绍

    在操作系统级别,Oracle将数据存储在数据文件中,每个数据库至少有一个数据文件。
    数据文件有两种,一种是永久数据文件,它们主要是存储持久化的数据。另一种为临时数据文件,它们主要是存储用来进行hash、排序和其他操作的数据。当物理内存不够时,它们也会存储数据集数据。

    数据文件结构

    Oracle数据库通过分配指定的磁盘空间大小加上数据文件头的开销来为表空间创建数据文件。运行Oracle数据库的服务器负责在将文件分配给数据库之前清除文件中的旧信息和授权。
    数据文件头主要是存储数据文件的元数据,例如文件大小和检查点SCN。每个数据文件头包含一个决对文件号和一个相对文件号。决对文件号用来唯一标识数据库中的数据文件。相对文件号用来唯一标识表空间中的数据文件。
    Oracle首次创建数据文件时,分配的磁盘空间已初始化但不包含用户数据。但是,会预留空间来保存相应表空间的未来数据。随着表空间中数据的增长,Oracle数据库使用数据文件中的可用空间为段分配区。
    下图说明了数据文件中不同类型的空间,区要么是被使用,要么是空闲的。随着时间的增长,表空间中对象的删除或更新可能会创建一些空闲空间,这些空间无法用于新数据。这种类型的空闲空间被称为空闲空间碎片。
    image.png

    控制文件的介绍

    数据库控制文件是一个二进制文件,只和数据库相关联。每个数据库有且仅有一个控制文件。
    控制文件是Oracle数据库用来查找数据库文件和管理数据库状态的文件。控制文件包含以下信息:

  • 数据库名称和数据库唯一标识符(DBID)

  • 数据库创建的时间戳
  • 有关数据文件、redo log文件和归档日志文件的信息
  • 表空间信息
  • RMAN备份

控制文件主要有以下用途:

  • 跟踪数据库的结构变化。
  • 包含数据库未打开时必须可以访问的元数据。

Oracle数据库在数据库使用期间不断读取和写入控制文件,并且在数据库打开时必须可用于写入。
Oracle数据库支持在不同的磁盘中复用同一个控制文件,以实现控制文件的冗余,避免单点故障。

控制文件结构

有关数据库的信息存储在控制文件的不同section。每个section都是关于数据库某个方面的一组记录。每个section存储在多个逻辑控制文件块中。记录可以跨越section。
控制文件包含以下类型的记录:

  • 循环复用记录(例如归档日志文件和rman备份文件)
  • 非循环复用记录(例如表空间、数据文件、redo log文件和redo进程)

对于控制文件,Oracle直接从磁盘读写到PGA。每个进程为控制文件块分配一定大小的PGA内存。

Redo Log的介绍

redo log是由两个或多个预先分配的文件组成,这些文件主要是记录对数据文件的更改。
Oracle数据库会将每个事务写入redo log buffer中,然后将其写入到redo log文件中。日志的内容包括未提交的事务、回滚数据和schema以及对象管理语句。
数据库实例的online redo log称为redo thread。单实例环境中,只有一个实例访问数据库,因此只会有一个redo thread。但是,在RAC集群环境中,两个或多个实例访问数据库,每个实例都有一个redo thread。这样的好处是可以避免对一组在线redo log的争用。
一个online redo log由两个或多个redo log文件组成。Oracle至少需要两个redo log,以保证一个文件正在写入,而另一个正在归档或写回到磁盘中。
在数据库运行的过程中,当redo log写满后,数据库会停止当前redo log的写入,切换到下一个redo log,继续写入redo记录。通常,在online redo log已满并且需要继续写入时,会发生日志切换。当日志写满最后一个可用的redo log时,进程会切换至第一个redo log,重新循环。

Online Redo Log的结构

在线redo log包含redo记录。redo记录由一组更改向量组成,每个更改向量记录对数据块的更改。例如对test表的更新会生成一个redo记录,该记录描述对表的数据段的块、undo段的数据块和undo段的事务表的更改。
redo记录包含更改的所有相关元数据。包含以下内容:

  • SCN和更改的时间戳
  • 更改的事务ID
  • 提交事务时的SCN和时间戳
  • 更改的操作类型
  • 更改的数据段的名称和类型