物理存储结构简介
RDBMS 的特点之一是逻辑数据结构(如表、视图和索引)与物理存储结构的独立性。
由于物理结构和逻辑结构是分开的,您可以管理数据的物理数据存储,而不会影响对逻辑结构的访问。例如,重命名数据库文件并不会重命名存储在其中的表。
Oracle 数据库是在持久性的磁盘存储中存储的一组 Oracle 数据文件。此部分讨论您发出 CREATE DATABASE 语句时生成的数据库文件:
- 数据文件和临时文件
数据文件是磁盘上的一个物理文件,由 Oracle 数据库创建,并包含如表和索引之类的数据结构。临时文件是一个属于临时表空间的数据文件。数据按 Oracle 专有格式写入这些文件,且不能由其他程序读取。 - 控制文件
控制文件是一个跟踪数据库的物理组件的根文件。 - 联机重做日志文件
在线重做日志是一组包含对数据所做的更改记录的文件。
数据库实例是一组管理数据库文件的内存结构。下图显示实例和它所管理的文件之间的关系。
用于存储数据库文件的机制
有几种机制可用于分配和管理这些文件的存储。
最常见的机制包括:
- Oracle 自动存储管理(Oracle ASM)
Oracle ASM 包括被专门设计用来供 Oracle 数据库使用的文件系统。 - 操作系统文件系统
大多数 Oracle 数据库在文件系统中存储文件,这是建立在一个连续的磁盘地址空间内的数据结构。所有操作系统都有文件管理器,用于在文件系统中为文件分配和释放磁盘空间。
文件系统可以将磁盘空间分配给多个文件。每个文件都有一个名称,并对应用程序(如 Oracle 数据库) 显示为一个连续地址空间。数据库可以创建、读取、写入、调整大小、和删除文件。
文件系统通常是由称为逻辑卷管理器 (LVM)的软件包创建,并建立在逻辑卷的基础上。LVM 使多个物理磁盘被合并到一个单一的连续地址空间,对上层软件显示为一块磁盘。 - 集群文件系统
集群文件系统是使多台计算机共享文件存储,同时保持一致的空间分配和文件内容的软件。在 Oracle RAC 环境中,集群文件系统使共享存储显示为在集群环境中由多台计算机共享的文件系统。在集群文件系统中,单个集群中的计算机失败不会使文件系统不可用。而在操作系统文件系统中,倘若某个通过 NFS 或其他手段共享文件的计算机失败,则文件系统会变得不可用。
数据库可以采用前面的某些存储机制的组合。例如,数据库可以将控制文件和联机重做日志文件存储在传统的文件系统中,将某些用户数据文件存储在原始分区上,剩余的数据文件存储在 Oracle ASM 中,而归档重做日志文件存储到集群文件系统。
Oracle 自动存储管理 (Oracle ASM)
Oracle ASM 是一个针对 Oracle 数据库文件的高性能、易管理的存储解决方案。Oracle ASM 是一个卷管理器,并提供一个专为数据库使用而设计的文件系统。
Oracle ASM 提供几个超越传统文件系统和存储管理器的优势,包括以下这些:
- 简化了与存储相关的任务,如创建数据库、规划数据库文件布局、和管理磁盘空间。
- 跨物理磁盘分布数据,以消除热点,并提供均匀的磁盘性能。
- 在存储配置更改后自动平衡数据。
若要使用 Oracle ASM,你需要为 Oracle 数据库分配磁盘分区,最好是经过条带化和镜像的。Oracle ASM 会管理磁盘空间,跨所有可用资源分配 I/O负载,以优化性能,同时消除了手动优化 I/O 的需要。例如,你可以为数据库增加磁盘大小,或将数据库的某些部分移动到新设备,而不必关闭数据库。
Oracle ASM 存储组件
Oracle 数据库可以将数据文件存储为一个 Oracle ASM 磁盘组中的 OracleASM 文件。在一个磁盘组内,Oracle ASM 为数据库文件提供了一个文件系统接口。
下图显示了一个使用 Oracle ASM 的数据库中的存储组件之间的关系。虽然 Oracle ASM 可以存储其他类型的文件,该图只描述了一个 Oracle ASM 文件和数据文件之间的关系。乌鸦脚表示法表示一对多关系。
图 11-2 说明了以下 Oracle ASM 概念:
-
Oracle ASM 磁盘
Oracle ASM 磁盘是提供给一个 Oracle ASM 磁盘组的存储设备。Oracle ASM 磁盘可以是某个存储阵列的物理磁盘、分区、逻辑单元号 (LUN) ,或是一个逻辑卷或网络附加文件。
Oracle ASM 磁盘,可以当数据库正在运行时,被添加到磁盘组,或从磁盘组中删除。当你向磁盘组中添加一个磁盘时,您可以为磁盘指定一个名称,否则会自动被赋予一个 Oracle ASM 磁盘名称。 -
Oracle ASM 磁盘组
Oracle ASM 磁盘组是一组 Oracle ASM 磁盘的集合,被作为一个逻辑单元来管理。在磁盘组中的数据结构是自包含的,并会在磁盘组中消耗一些磁盘空间。
在一个磁盘组内,Oracle ASM 为数据库文件提供了一个文件系统接口。存储在磁盘组中的文件的内容被均匀分布或条带化,以消除热点,并为所有磁盘提供均匀的性能。 -
Oracle ASM 文件
Oracle ASM 文件是一个存储在 Oracle ASM 磁盘组中的文件。Oracle 数据库按文件与 Oracle ASM 进行通信。数据库可以将数据文件、控制文件、联机重做日志文件、和其他类型的文件存储为Oracle ASM 文件。当数据库要创建一个文件时,Oracle ASM 创建一个 Oracle ASM 文件,并分配一个以加号 (+)和磁盘组名称开头(如+DISK1)的完全限定名称。 -
Oracle ASM 扩展区
Oracle ASM 扩展区是用于容纳 Oracle ASM 文件内容的原始存储。一个 Oracle ASM 文件包含一个或多个文件扩展区。每个 Oracle ASM扩展区是由特定的磁盘上的一个或多个分配单元组成的。 -
Oracle ASM 分配单元
分配单元是磁盘组中空间分配的基本单位。分配单元是由 Oracle ASM 分配的最小连续磁盘空间。由一个或多个分配单元形成一个 Oracle ASM 扩展区。
Oracle ASM 实例
Oracle ASM 实例是一个专门用于管理 Oracle ASM 磁盘的 Oracle 实例。
ASM 实例和数据库实例都需要对 ASM 磁盘组中的磁盘的共享访问。ASM 实例管理磁盘组的元数据,并提供对数据库实例的文件布局信息。数据库实例直接与 ASM 磁盘进行 I/O ,而不需要通过 ASM 实例。
ASM 实例与数据库实例建立在相同的技术架构之上。例如,与数据库实例类似,ASM 实例也有一个系统全局区域 (SGA) 和多个后台进程。但是,ASM 实例无法装载数据库,并且比数据库实例执行的任务更少。
图 11-3 显示了具有一个 Oracle ASM 实例和两个数据库实例的单节点配置,每个数据库实例与一个不同的单实例数据库相关联。ASM 实例管理元数据,并为用于这两个数据库存储数据的 ASM 文件提供空间分配。其中一个ASM 磁盘组有四个 ASM 磁盘,而另一个磁盘组有两个磁盘。这两个数据库实例可以访问所有磁盘组。
Oracle 管理的文件和用户管理的文件
Oracle 管理的文件是一种命名策略,使您能够按数据库对象而不是按文件名称来指定操作。例如,您可以创建一个表空间,而无需指定其数据文件的名称。
Oracle 管理的文件不需要管理员直接管理数据库中的操作系统文件。Oracle ASM 需要使用 Oracle 管理的文件。
你可以使用用户管理的文件来直接管理数据库中的操作系统文件。由你来决定关于文件的结构和命名。例如,当创建表空间时,由您设置表空间数据文件的名称和路径。
通过初始化参数,您可以指定一个特定类型文件的文件系统目录。Oracle 管理的文件特性可确保数据库能创建具有唯一名称的文件,并在不再需要时删除它。数据库在内部使用标准文件系统接口来创建和删除文件,如数据文件、临时文件、控制文件、和存储在快速恢复区中的与恢复相关的文件等。
Oracle 管理的文件并不消除现有的功能。您可以创建新的文件,并手动管理旧文件。因此,数据库可以混合使用 Oracle 管理的文件和用户管理的文件。
数据文件的概述
在操作系统层面,Oracle 数据库将数据库数据存储在数据文件中。每个数据库必须至少有一个数据文件。
使用数据文件
Oracle 数据库将表空间中的数据在物理上存储为数据文件。
每个非分区模式对象和对象的每个分区都存储在它自己的段中,它只属于一个表空间。例如,非分区表的数据存储在单个段中,最终也存储在一个表空间中。表空间和数据文件密切相关,但又有重要区别:
- 每个表空间包含一个或多个数据文件,这需要遵从运行 Oracle 数据库的操作系统。
- 数据库数据被集中地存储在位于每个数据库表空间的数据文件中。
- 段可以跨越一个或多个数据文件,但它不能跨多个表空间。
- 数据库必须有 SYSTEM 表空间和 SYSAUX 表空间。Oracle 数据库自动在数据库创建过程中为 SYSTEM 表空间分配数据库的第一个数据文件。
SYSTEM 表空间包含数据字典,它是包含数据库元数据的一组表。通常,数据库也有一个撤销表空间和临时表空间 (通常称为 TEMP)。
下图显示了表空间、数据文件、和段之间的关系。
永久和临时数据文件
永久表空间中包含持久性的模式对象。永久表空间中的对象存储在数据文件中。
临时表空间中仅包含用于会话期间的模式对象。本地管理的临时表空间具有临时文件,它是被设计用于存储在哈希、排序、和其他操作使用的数据的特殊文件。临时文件还用于存储在内存中的空间不足时的结果集数据。
临时文件类似于永久数据文件,但有以下例外情况:
- 永久性数据库对象(如表) 绝不会存储在临时文件中。
- 临时文件始终被设置为 NOLOGGING 模式,这意味着永远不会为其生成重做。介质恢复不识别临时文件。
- 你不能将临时文件置为只读模式。
- 你无法使用 ALTER DATABASE 语句来创建一个临时文件。
- 当你创建临时文件或调整其大小时,并不能始终保证会为他们分配指定文件大小的磁盘空间。在 Linux 和 UNIX 等的文件系统上,临时文件被创建为稀疏文件。在这种情况下,磁盘块并不是在文件的创建或调整大小时分配的,而是在块第一次被访问时分配的。
- 临时文件信息显示在数据字典视图 DBA_TEMP_FILES 和动态性能视图 V$TEMPFILE 中,但不在 DBA_DATA_FILES 或 V$DATAFILE 视图中。
联机和脱机数据文件
每个数据文件可能是联机的(可用) 或脱机的(不可用)。
可以通过让单个数据文件或临时文件脱机或联机,来改变其可用性。脱机的数据文件不能被访问,直至他们恢复联机状态。
可以因为很多原因将数据文件脱机,包括执行脱机备份、重命名数据文件、或数据块破坏。如果数据库无法写入数据文件,则数据库自动将其脱机。
与数据文件类似,表空间本身也可以是脱机的或联机的。当你将一个联机表空间中的数据文件脱机时,表空间本身将仍保持联机状态。您可以将整个表空间脱机,来使该表空间中的所有数据文件暂时不可用。
从 Oracle Database 12c 开始,可以使用 ALTER Database MOVE DATAFILE 语句在数据库打开并访问文件时将在线数据文件从一个物理文件移动到另一个物理文件。您可以使用此技术来实现以下目标:
- 将表空间从一种存储移动到另一种存储
- 移动不常访问的数据文件,以降低存储成本
- 将表空间设置为只读,并将其数据文件移动到写一次存储,比如一次写读多(WORM)驱动器
- 将数据库移动到 Oracle ASM 中
数据文件结构
Oracle 数据库通过分配指定数量的磁盘空间,加上数据文件头开销,来为表空间创建数据文件。在 Oracle 数据库之下运行的操作系统,负责在将文件分配给数据库之前,从文件中清除旧信息和授权。
数据文件头包含数据文件的元数据,例如数据文件大小和检查点 SCN。每个文件头包含一个绝对文件号和一个相对文件号。绝对文件号唯一地标识数据库内的数据文件。相对文件号唯一地标识表空间内的数据文件。
当 Oracle 数据库刚创建一个数据文件时,分配的磁盘空间已格式化,但不包含任何用户数据。但是,数据库会保留此空间,将来用于容纳其相关联的表空间中的数据段。随着表空间中的数据增长,Oracle 数据库将用数据文件中的可用空间来为段分配扩展区。
下图说明了数据文件中不同类型的空间。扩展区要么是已使用的,意味着他们包含段数据,或是空闲的,意味着它们是可重用的。随时间的流逝,表空间中的对象不断更新和删除,会产生很多小的空白空间,但太小不足以被重用以容纳新数据。这种类型的空白空间称为碎片化的可用空间。
控制文件的概述
数据库控制文件是一个小的二进制文件,仅与一个数据库相关联。每个数据库有一个唯一的控制文件,尽管允许多个相同的副本。
使用控制文件
Oracle 数据库通常使用控制文件定位数据库文件并管理数据库的状态。
控制文件包含以下信息:
- 数据库名称和数据库唯一标识符(DBID)
- 创建数据库的时间戳
- 有关数据文件、联机重做日志文件、和归档重做日志文件的信息
- 表空间信息
- RMAN 备份
控制文件用于以下目的:
- 它包含有关数据文件、联机重做日志文件等为打开数据库所需的信息。
控制文件跟踪数据库的结构变化。例如,当管理员添加、重命名、或删除数据文件或联机重做日志文件时,数据库将更新控制文件以反映此更改。 - 它包含未打开数据库时必须可访问的元数据。
例如,控制文件中包含,包括检查点在内的用于恢复数据库所需的信息。检查点指示在重做流中进行实例恢复所需的起始 SCN。每一个检查点 SCN 之前提交的更改被确保已保存到磁盘上的数据文件中。至少每隔三秒,检查点进程会在控制文件中,记录有关联机重做日志中的检查点位置。
在数据库使用期间,Oracle 数据库不断读取和写入控制文件,并且只要数据库处于打开状态,控制文件就必须是可用的,以便可以写入。例如,恢复数据库涉及从控制文件中读取数据库中包含的所有数据文件名称。其他的操作,如添加数据文件,会更新存储在控制文件中的信息。
多个控制文件
Oracle 数据库对同一数据库启用多个完全相同的控制文件,并同时打开和写入。通过在不同的磁盘上多路复用控制文件,数据库可以实现冗余,从而避免单点故障。
如果控制文件变得不可用,则当数据库实例尝试访问已损坏的控制文件时,会遭遇失败。当其他的当前控制文件副本存在时,可以重新装入数据库并打开,而不需进行介质恢复。如果数据库的所有控制文件都丢失了,那么,实例会失败,且需要进行介质恢复。如果控制文件的当前副本不可用,而必须使用一个旧备份控制文件,则介质恢复就没那么直截了当了。
控制文件结构
有关数据库的信息存储在控制文件的各个不同部分中。每个部分是有关数据库的某个方面的一组记录。
例如,控制文件中有一个部分跟踪数据文件,并包含一个记录集合,每一个数据文件有一条记录。每个部分存储在多个逻辑控制文件块中。同一部分的记录可以跨越块。
控制文件中包含以下类型的记录:
- 循环重用记录
这些记录包含必要时可以被覆盖的非关键信息。当所有可用的记录槽用完时,数据库要么会扩展控制文件,以便为新记录腾出空间,要么会覆盖最旧的记录。其示例包括有关归档重做日志文件和 RMAN 备份的记录。 - 非循环重用记录
这些记录包含不经常更改且不能被覆盖的关键信息。其示例包括表空间、数据文件、联机重做日志文件、和重做线程。Oracle 数据库绝不会重用这些记录,除非从表空间中删除相应的对象。
您可以查询动态性能视图(也称为 V$ 视图)来查看存储在控制文件中的信息。例如,您可以查询 V$DATABASE 获取数据库名称和 DBID。但是,只有数据库可以修改控制文件中的信息。
控制文件块的读取和写入不同于数据块的读取和写入。对控制文件,Oracle数据库直接从磁盘读取并写入到程序全局区(PGA)。每个进程为控制文件块分配一定的 PGA 内存。
联机重做日志概述
用于恢复的最关键结构是联机重做日志,它由两个或多个预分配文件组成,用于存储数据库发生的更改。联机重做日志用于记录对数据文件的更改。
使用联机重做日志
数据库维护联机重做日志文件,以防止数据丢失。具体来说,在一个实例失败后,联机重做日志文件使 Oracle 数据库可以恢复已提交但尚未写入数据文件的数据。
Oracle 数据库将每个事务同步地写入重做日志缓冲区,然后将其写入到联机重做日志。日志的内容包括未提交的事务、撤消数据、和模式和对象管理语句。
当数据库更改撤消段时,数据库还将这些更改写入在线重做日志。因此,联机重做日志总是包含永久对象的撤消数据。您可以将数据库配置为将临时对象的所有撤消数据存储在临时撤消段中,这可以节省空间并提高性能,或者允许数据库在在线重做日志中同时存储永久和临时撤消数据。
Oracle 数据库使用联机重做日志的唯一目的是为了恢复。然而,管理员可以通过 Oracle LogMiner 实用程序中的 SQL 接口,来查询联机重做日志文件(请参阅“Oracle LogMiner”)。重做日志文件是一种有关数据库活动的有用的历史信息来源。
Oracle 数据库如何写入到联机重做日志
数据库实例的联机重做日志称为重做线程。
在单实例配置中,只有一个实例访问数据库,所以只存在一个重做线程。不过在一个 Oracle 真正应用集群(Oracle RAC) 配置中,有两个或更多实例同时访问数据库,且每个实例都有它自己的重做线程。每个实例具有其单独的重做线程可以避免对单一联机重做日志文件组的争用。
一个联机重做日志包含两个或更多联机重做日志文件。Oracle 数据库要求最少两个文件,以保证当另一个正在被归档时,总有一个始终可供写入。
联机重做日志切换
Oracle 数据库一次只使用一个联机重做日志文件来存储从重做日志缓冲区写入的记录。
写入的记录。正在由日志写入器(LGWR) 进程写入的联机重做日志文件称为当前联机重做日志文件。
当数据库停止向一个联机重做日志文件写入,并开始向另一个写入时,发生日志切换。通常,切换发生在当前联机重做日志文件已满,且必须继续写入时。但是,您可以配置定期日志切换,而不论当前联机重做日志文件是否已满,或者也可以手动强制日志切换。
日志写入器以循环方式写入联机重做日志文件。当日志写入器填满最后一个可用的联机重做日志文件时,该进程又向第一个日志文件写入,如此等等,周而复始。图 11-6 说明了重做日志的循环写入。
图 11-6 中的数字显示了 LGWR 写入到每个联机重做日志文件的顺序。当发生日志切换时,数据库为每个文件分配一个新的日志序列号,然后日志写入器便开始向新的日志写入。当数据库重复使用一个联机重做日志文件时,此文件接收下一个可用的日志序列号。
已填充的联机重做日志文件的可重用性取决于归档模式:
- 如果禁用了归档,这意味着数据库处于 NOARCHIVELOG 模式下,则填充的联机重做日志文件,在数据库写入器 (DBWn) 已对该日志中的更改记录执行过检查点操作并写入到磁盘后,该日志即是可重新使用的。
- 如果启用了归档,这意味着数据库是在 ARCHIVELOG 模式下,则填充的联机重做日志文件,只有在该日志中所包含的更改记录被写入数据文件,且该日志已被归档后,该日志才是可重新使用的。
在某些情况下,日志写入器可能无法重新使用某个现有的联机重做日志文件。例如,联机重做日志文件可能处于活动状态(实例恢复需要它) ,而不是非活动状态 (实例恢复不需要它)。另外,一个联机重做日志文件可能正处于被清除过程中。
联机重做日志文件的多个副本
Oracle 数据库可以在不同的位置自动维护两个或更多联机重做日志的相同副本。
一个联机重做日志组包括一个联机重做日志文件及其冗余副本。每个完全相同的副本是联机重做日志组的一个成员。每个组由一个数字来定义,如组 1、组 2 等等。
维护联机重做日志组的多个成员,可以防止重做日志的丢失。理想情况下,各个重做日志成员的位置应该在单独的磁盘上,这样单个磁盘故障不会导致整个联机重做日志的丢失。
在图 11-7 中,A_LOG1 和 B_LOG1 是组 1 的两个相同的成员,A_LOG2 和 B_LOG2 是组 2 的两个相同的成员。每个组中的所有成员必须具有相同的大小。LGWR 同时写入组 1 (成员 A_LOG1 和 B_LOG1),然后同时写入组 2 (成员 A_LOG2 和 B_LOG2),然后又重新写入到组 1,如此等等。LGWR 永远不会同时写入不同组的成员。
归档重做日志文件
归档重做日志文件是联机重做日志组的已填充成员的副本。此文件不是该数据库的一部分,而是由该数据库生成、并被写到用户指定位置的联机重做日志文件脱机副本。
归档重做日志文件是备份和恢复策略的关键部分。您可以使用归档重做日志文件:
- 恢复数据库备份
- 更新备用数据库
- 使用 LogMiner 实用程序获取有关数据库的历史信息
归档即是生成一个归档重做日志文件操作。归档可以是自动的或手动的,只有在数据库处于归档模式下时才会归档。
一个归档重做日志文件包括重做条目和联机重做日志组的相同成员的日志序列号。在“Multiple Copies of Online Redo Log Files”中,文件 A_LOG1 和 B_LOG1 是组 1 的相同成员。如果数据库处于 ARCHIVELOG 模式下,并启用了自动归档,则归档器进程(ARCn) 将存档这些文件之一。如果 A_LOG1 损坏了,则该进程可以归档 B_LOG1。归档重做日志包含自您启用存档以来创建的每个日志组的副本。
联机重做日志的结构
联机重做日志文件包含重做记录。
重做记录由一组更改向量组成,每个向量描述对某数据块的一个更改。例如,对 employees 表中的薪水的更新,将生成一个重做记录,描述对该表的数据段块、回滚段数据块、和回滚段的事务表的更改。
重做记录记录了与更改相关的所有元数据,包括如下:
- 更改的 SCN 和时间戳
- 变更事务的事务 ID
- 事务提交时的 SCN 和时间戳(如果它已提交)
- 所做更改的操作类型
- 被修改的数据段的名称和类型