介绍

RDBMS(关系型数据库)通常具有物理存储结构和逻辑存储结构。采用物理和逻辑结构分离的方式,可以做到管理物理结构而不影响逻辑结构的访问。

Oracle将物理结构又分为数据库和实例。数据库是Oracle数据存储在磁盘存储中的一组文件。这些文件又根据不同的作用划分成了三类,分别是:

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

实例就是用来管理数据库文件的内存结构,下图显示数据库和实例的关系:

Oracle 物理存储结构_物理结构

数据文件

Oracle将数据存在到数据文件中,并且对于每个数据库,必须至少有一个数据文件。

上面提到数据文件有两种,一种是数据文件,一种为临时文件。这两种文件的作用都是存储数据,不同点就在于,数据文件是存储Oracle产生的数据,这些数据会永久性的保存;而临时文件是用存储那些因为物理内存不足,无法将数据全部在内存中完成操作(HASH、排序、数据集和其它操作),而临时写入到临时文件中。

控制文件

控制文件是一个二进制文件,只和数据库有关联,并且每个数据库中有且仅有一个控制文件。

控制文件中主要包含以下信息:

  • 数据库名和数据库标识符(DBID)
  • 创建数据库的时间戳
  • 数据文件、redo log和归档日志文件的信息
  • 表空间信息
  • RMAN备份信息

说完了控制文件中的内容,再来说说它的用途。它主要用途有两点:

  • 跟踪数据库的物理结构变化情况。
  • 记录数据库未打开时必须可以访问的元数据。

Oracle在打开后,会不断的进行读取和写入控制文件的信息,并且是在数据库打开时必须可以用于写入。

online redo log

Online redo log主要是记录对数据的更改,它是两个或两个以上的预先分配的文件组成。

Oracle数据库会将每个事务写入到redo log buffer中,然后根据某些规则,将其写入到redo log文件中。redo log的内容包括有为提交的事务、undo数据、架构(schema)和对象管理语句。

Oracle将数据库实例的online redo log叫做重做线程(redo thread),除集群RAC环境外,单个实例的重做线程只有一个,而集群环境是每个数据库实例都会有各自的重做线程。如果集群环境仅配置一个重做进程,每个数据库实例都要去访问,可能就会有争用的情况。注意,这里说的是单实例重做线程只有1个,不是redo log的数量。

redo log的结构

redo log文件包含重做记录。重做记录由一组更改向量组成,每个向量描述对数据块的更改。

更改向量这个词可能有点难以理解,举个例子:你执行了一个SQL语句,该语句是对A表的字段B执行一个更新操作,执行后就会在重做记录中记录对表A的数据段中的块、UNDO段中的块和UNDO段中的事务表的更改。

重做记录包括更改的所有相关元数据,包括以下内容:

  • 更改的SCN和时间戳
  • 生成更改的事务的事务ID号
  • 事务提交时的SCN和时间戳(如果已提交的话)
  • 进行更改的操作类型
  • 修改数据段的名称和类型