PARTIV-Oracle数据库存储结构-物理存储结构

11. 物理存储结构

11.1. 物理存储结构简介

关系数据库管理系统(RDBMS)的一个特点是逻辑数据结构(如表、视图和索引)与物理存储结构的独立性。由于物理和逻辑结构是分开的,可以管理数据的物理存储而不影响对逻辑结构的访问。例如,重命名数据库文件不会重命名其中存储的表。

Oracle数据库是一组文件,它们在持久化磁盘存储中存储Oracle数据。本节讨论在发出CREATE DATABASE语句时生成的数据库文件:

  • 数据文件和临时文件
    数据文件是磁盘上的一个物理文件,由Oracle数据库创建,包含表和索引等数据结构。临时文件是属于临时表空间的数据文件。这些文件中的数据以其他程序无法读取的Oracle专有格式写入。
  • 控制文件
    控制文件是一个根文件,跟踪数据库的物理组件。
  • 在线重做日志文件
    在线重做日志是一组包含对数据所做更改记录的文件。
    数据库实例是一组内存结构,用于管理数据库文件。图11-1显示了实例与其管理的文件之间的关系。

11.1.1. 存储数据库文件的机制

有几种机制可用于分配和管理这些文件的存储。最常见的机制包括:

  • Oracle自动存储管理(Oracle ASM)
    Oracle ASM包括一个专门为Oracle数据库设计的文件系统。

  • 操作系统文件系统
    大多数Oracle数据库将文件存储在文件系统中,文件系统是构建在连续磁盘地址空间内的数据结构。所有操作系统都有文件管理器,它们在文件系统中分配和释放磁盘空间到文件中。
    文件系统允许磁盘空间被分配给多个文件。每个文件都有一个名称,并且对应用程序(如Oracle数据库)来说,它表现为一个连续的地址空间。数据库可以创建、读取、写入、调整大小和删除文件。
    文件系统通常建立在一个由称为逻辑卷管理器(LVM)的软件包构建的逻辑卷之上。LVM可以将多个物理磁盘的部分组合成一个单一的连续地址空间,对上层软件(如操作系统)来说,它看起来像一个磁盘。

  • 原始设备
    原始设备是没有用文件系统格式化的磁盘分区或逻辑卷。原始设备的主要好处是能够执行直接I/O并写入更大的缓冲区。在直接I/O中,应用程序直接写入和从存储设备读取,绕过操作系统缓冲区缓存。

注意:现在许多文件系统支持数据库和其他管理自己的缓存的应用程序的直接I/O。历史上,原始设备是实现直接I/O的唯一手段。

  • 集群文件系统
    集群文件系统是一种软件,它允许多台计算机共享文件存储,同时保持一致的空间分配和文件内容。在Oracle RAC环境中,集群文件系统使共享存储看起来像是在集群环境中由多台计算机共享的文件系统。使用集群文件系统时,集群中的计算机故障不会导致文件系统不可用。然而,在操作系统文件系统中,如果通过NFS或其他方式共享文件的计算机故障,那么文件系统将不可用。

数据库采用上述存储机制的组合。例如,数据库可以将控制文件和在线重做日志文件存储在传统的文件系统中,将一些用户数据文件存储在原始分区上,将剩余的数据文件存储在Oracle ASM中,并将归档的重做日志文件存储在集群文件系统中。

11.1.2. Oracle自动存储管理(Oracle ASM)

Oracle ASM是用于Oracle数据库文件的高性能、易于管理的存储解决方案。Oracle ASM是一个卷管理器,并提供了一个专门为数据库使用的文件系统。Oracle ASM提供了许多优于传统文件系统和存储管理器的优势,包括:

  • 简化了与存储相关的任务,例如创建和布局数据库以及管理磁盘空间。
  • 在物理磁盘上分布数据,以消除热点并提供磁盘上均匀的性能。
  • 在存储配置更改后自动重新平衡数据。

要使用Oracle ASM,需要为Oracle Database分配分区磁盘,并为条带化和镜像提供偏好设置。Oracle ASM管理磁盘空间,将I/O负载分布到所有可用资源上,以优化性能,同时消除了手动I/O调整的需要。例如,可以在不关闭数据库的情况下增加数据库的磁盘大小或将数据库的部分移动到新设备上。

11.1.2.1. Oracle ASM存储组件

Oracle数据库可以将数据文件存储为Oracle ASM文件,位于Oracle ASM磁盘组中,磁盘组是Oracle ASM作为一个单元管理的磁盘集合。在磁盘组内,Oracle ASM为数据库文件提供了文件系统接口。图11-2显示了使用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 数据库文件暴露了一个文件系统接口。存储在磁盘组中的文件内容会被均匀分布或条带化,以消除热点并提供跨磁盘的均匀性能。其性能可与原始设备的性能相媲美。

■ 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区段。

11.1.2.2. Oracle ASM 实例

Oracle ASM实例是一个特殊的Oracle实例,用于管理 Oracle ASM 磁盘。ASM实例和数据库实例都需要对ASM磁盘组中的磁盘进行共享访问。ASM实例管理磁盘组的元数据,并向数据库实例提供文件布局信息。数据库实例直接将 I/O 定向到ASM磁盘,而不通过ASM实例。

ASM实例基于与数据库实例相同的技术构建。例如,ASM实例具有系统全局区(SGA)和与数据库实例类似的后台进程。然而,ASM实例无法挂载数据库,并且执行的任务少于数据库实例。

图 11-3显示了一个单节点配置,其中有一个 Oracle ASM实例和两个数据库实例,每个实例与不同的单实例数据库相关联。ASM实例管理元数据,并为存储两个数据库数据的ASM文件提供空间分配。一个ASM磁盘组有四个 ASM 磁盘,另一个有两个磁盘。两个数据库实例都可以访问这些磁盘组。

11.1.3. Oracle管理文件和用户管理文件

Oracle管理文件是一种文件命名策略,它允许根据数据库对象而不是文件名来指定操作。例如,您可以在不指定其数据文件名称的情况下创建表空间。通过这种方式,Oracle管理文件消除了管理员直接管理数据库中的操作系统文件的需要。Oracle ASM需要Oracle管理文件。

注意:此功能不影响管理文件的创建或命名,例如跟踪文件、审计文件和警报日志(请参见第 13-18 页的“诊断文件概述”)。

使用用户管理文件时,直接管理数据库中的操作系统文件。对文件结构和命名做出决策。例如,当创建一个表空间时,设置表空间数据文件的名称和路径。

通过初始化参数,为特定类型的文件指定文件系统目录。Oracle管理文件功能确保数据库创建一个唯一的文件,并在不再需要时删除它。数据库内部使用标准文件系统接口来创建和删除数据文件和临时文件、控制文件以及存储在快速恢复区的恢复相关文件。

Oracle管理文件不会消除现有功能。可以在手动管理旧文件的同时创建新文件。因此,数据库可以同时使用Oracle 管理文件和用户管理文件。

11.2. 数据文件简介

在操作系统级别,Oracle数据库将数据库数据存储在数据文件中。每个数据库必须至少有一个数据文件。

11.2.1. 数据文件用途

第一部分,“Oracle关系数据结构”解释了用户存储数据的逻辑结构,其中最重要的是表。每个非分区模式对象和对象的每个分区都存储在自己的段中。

为了便于管理,Oracle数据库在表空间中为用户数据分配空间,表空间像段一样是逻辑存储结构。每个段只属于一个表空间。例如,非分区表的数据存储在单个段中,该段又存储在一个表空间中。

Oracle数据库在数据文件中物理存储表空间数据。表空间和数据文件密切相关,但也有重要的区别:
■ 每个表空间由一个或多个数据文件组成,这些文件符合运行 Oracle数据库的操作系统。
■ 数据库的数据集体存储在数据库每个表空间中的数据文件中。
■ 一个段可以跨越一个或多个数据文件,但它不能跨越多个表空间。
■ 数据库必须有SYSTEM和SYSAUX表空间。在数据库创建过程中,Oracle数据库会自动为SYSTEM表空间分配数据库的第一个数据文件。SYSTEM表空间包含数据字典,这是一组包含数据库元数据的表。通常,数据库还有一个撤销表空间和一个临时表空间(通常命名为 TEMP)。

图 11-4 显示了表空间、数据文件和段之间的关系。

11.2.2. 永久数据文件和临时数据文件

永久表空间包含持久的模式对象。永久表空间中的对象存储在数据文件中。临时表空间仅在会话期间包含模式对象。本地管理的临时表空间具有临时文件(temp文件),这些是专门设计用于存储散列、排序和其他操作中的数据的特殊文件。当内存中的空间不足时,temp文件还存储结果集数据。Temp文件与永久数据文件类似,但有以下例外:
■ 永久数据库对象(如表)永远不会存储在temp文件中。
■ Temp文件始终设置为NOLOGGING模式,这意味着它们永远不会为它们生成重做。
■ 不能将temp文件设置为只读。
■ 不能使用ALTER DATABASE语句创建temp文件。
■ 当创建或调整temp文件大小时,并不总是保证为指定的文件大小分配磁盘空间。在Linux和UNIX等文件系统上,temp文件被创建为稀疏文件。在这种情况下,磁盘块不是在文件创建或调整大小时分配,而是在首次访问块时分配。
注意:稀疏文件可以快速创建和调整temp文件的大小;然而,当temp文件被访问时,磁盘可能会在稍后空间不足。
■ Temp文件的信息显示在数据字典视图DBA_TEMP_FILES和动态性能视图V$TEMPFILE中,但不在DBA_DATA_FILES或V$DATAFILE视图中显示。

11.2.3. 联机和离线数据文件

每个数据文件要么在线(可用),要么离线(不可用)。可以通过将它们离线或在线来改变单个数据文件或临时文件的可用性。离线数据文件在重新在线之前无法访问。

管理员可能会出于多种原因将数据文件离线,包括执行离线备份、重命名数据文件或块损坏。如果数据库无法写入数据文件,数据库会自动将其离线。

像数据文件一样,表空间本身也是在线或离线。当在在线表空间中将数据文件离线时,表空间本身仍然在线。可以通过将表空间本身离线,使表空间的所有数据文件暂时不可用。

11.2.4. 数据文件结构

Oracle数据库通过分配指定的磁盘空间加上数据文件头的开销来为表空间创建数据文件。在 Oracle 数据库运行的操作系统负责在将文件分配给数据库之前清除旧的信息和授权。

数据文件头包含有关数据文件的元数据,例如其大小和检查点SCN。每个头都包含一个绝对文件号和一个相对文件号。绝对文件号在数据库中唯一标识数据文件。相对文件号在表空间内唯一标识数据文件。

当Oracle数据库首次创建数据文件时,分配的磁盘空间被格式化但不包含用户数据。然而,数据库保留该空间以容纳关联表空间的未来段的数据。随着表空间中数据的增长,Oracle数据库使用数据文件中的空闲空间为段分配区段。

图 11-5说明了数据文件中不同类型的空间。区段要么是已使用的,这意味着它们包含段数据,要么是空闲的,这意味着它们可供重用。随着时间的推移,表空间内对象的更新和删除可以创建出一些空空间,这些空空间单独看不足以被重用于新数据。这种类型的空空间被称为碎片化空闲空间。

11.3. 控制文件简介

数据库控制文件是一个与数据库相关联的小二进制文件。每个数据库有一个唯一的控制文件,尽管它可能维护它的相同副本。

11.3.1. 控制文件用途

控制文件是Oracle数据库用来查找数据库文件和管理数据库状态的根本文件。控制文件包含以下信息:

■ 数据库名称和数据库唯一标识符(DBID)
■ 数据库创建的时间戳
■ 关于数据文件、在线重做日志文件和归档重做日志文件的信息
■ 表空间信息
■ RMAN备份

控制文件具有以下用途:

■ 它包含打开数据库所需的数据文件、在线重做日志文件等信息。
控制文件跟踪数据库的结构变化。例如,当管理员添加、重命名或删除数据文件或在线重做日志文件时,数据库会更新控制文件以反映这一变化。
■ 它包含数据库未打开时必须可访问的元数据。
例如,控制文件包含恢复数据库所需的信息,包括检查点。检查点指示重做流中需要开始实例恢复的SCN(参见第 13-12 页的“实例恢复概述”)。在检查点SCN之前的所有已提交更改都保证已保存在数据文件的磁盘上。至少每三秒钟,检查点进程会在控制文件中记录有关在线重做日志中检查点位置的信息。

Oracle 数据库在数据库使用期间不断地读取和写入控制文件,并且只要数据库打开,就必须能够对其进行写入。例如,恢复数据库涉及从控制文件中读取数据库中包含的所有数据文件的名称。其他操作,如添加数据文件,会更新存储在控制文件中的信息。

11.3.2. 多个控制文件

Oracle 数据库允许同时打开多个相同的控制文件,并为同一个数据库进行写入。通过在不同磁盘上多重控制文件,数据库可以实现冗余,从而避免单点故障。

注意:Oracle 建议维护多个控制文件副本,每个副本在不同的磁盘上。

如果控制文件变得无法使用,那么当数据库实例尝试访问损坏的控制文件时将会失败。当存在其他当前控制文件副本时,可以在不进行介质恢复的情况下重新挂载并打开数据库。然而,如果数据库的所有控制文件都丢失了,那么实例将会失败,并且需要进行介质恢复。如果当前副本不可用而必须使用较旧的控制文件备份,介质恢复并不简单。

11.3.3. 控制文件结构

数据库的信息存储在控制文件的不同部分。每个部分是关于数据库一个方面的记录集。例如,控制文件中的一个部分跟踪数据文件,并包含一组记录,每个数据文件一个。每个部分存储在多个逻辑控制文件块中。记录可以跨越部分内的块。

控制文件包含以下类型的记录:

■ 循环重用记录
这些记录包含非关键信息,如果需要,这些信息有资格被覆盖。当所有可用的记录插槽都已满时,数据库要么扩展控制文件以为新记录腾出空间,要么覆盖最旧的记录。例如,关于归档重做日志文件RMAN备份的记录。

■ 非循环重用记录
这些记录包含不经常变化且不能被覆盖的关键信息。信息的例子包括表空间、数据文件、在线重做日志文件和重做线程。除非从表空间中删除了相应的对象,否则Oracle数据库永远不会重用这些记录。

正如在第6-5页的“动态性能视图概述”中解释的,您可以查询动态性能视图(也称为 V$ 视图),以查看存储在控制文件中的信息。例如,您可以查询 V$DATABASE 来获取数据库名称和DBID。然而,只有数据库才能修改控制文件中的信息。

控制文件块的读写与数据块的读写不同。对于控制文件,Oracle数据库直接从磁盘读取和写入到程序全局(PGA)。每个进程为其PGA内存分配一定数量的控制文件块。

11.4. 在线重做日志简介

在线重做日志是恢复过程中最关键的结构,它由两个或更多的预先分配的文件组成,用于存储数据库发生的变化。在线重做日志记录了数据文件的更改。

11.4.1. 在线重做日志用途

数据库维护在线重做日志文件以防止数据丢失。具体来说,在实例故障后,在线重做日志文件使Oracle数据库能够恢复尚未写入数据文件的已提交数据。

Oracle数据库将每个事务同步写入重做日志缓冲区,然后再写入在线重做日志。日志的内容包括未提交的事务、撤销数据以及模式和对象管理语句。

Oracle数据库仅将在线重做日志用于恢复。然而,管理员可以通过 Oracle LogMiner工具的 SQL 接口查询在线重做日志文件(参见第 18-8 页的“Oracle LogMiner”)。重做日志文件是有关数据库活动的历史信息的有用来源。

11.4.2. Oracle数据库如何写入在线重做日志

数据库实例的在线重做日志被称为重做线程。在单实例配置中,只有一个实例访问数据库,因此只存在一个重做线程。然而,在Oracle Real Application Clusters (Oracle RAC) 配置中,两个或更多实例会并发访问数据库,每个实例都有自己的重做线程。为每个实例提供单独的重做线程可以避免对单一在线重做日志文件集合的争用。在线重做日志由两个或更多的在线重做日志文件组成。Oracle 数据库需要至少两个文件,以确保在另一个文件被归档时(如果数据库处于 ARCHIVELOG 模式),总有一个文件可用于写入。

11.4.2.1. 在线重做日志切换

Oracle数据库一次只使用一个在线重做日志文件来存储从重做日志缓冲区写入的记录。日志写入进程(LGWR)当前正在写入的在线重做日志文件被称为当前在线重做日志文件。当数据库停止向一个在线重做日志文件写入并开始向另一个文件写入时,就会发生日志切换。通常,当当前在线重做日志文件满时,必须继续写入,就会发生切换。然而,可以配置日志切换在固定间隔发生,而不管当前在线重做日志文件是否已满,并且可以手动强制日志切换。日志写入进程以循环方式写入在线重做日志文件。当日志写入进程填满最后一个可用的在线重做日志文件时,该进程将写入第一个日志文件,重新开始循环。图 11-6 说明了重做日志的循环写入。

图 11-6 中的数字显示了 LGWR 向每个在线重做日志文件写入的顺序。当日志切换发生并且日志写入进程开始向某个文件写入时,数据库会为每个文件分配一个新的日志序列号。当数据库重用一个在线重做日志文件时,该文件会接收下一个可用的日志序列号。

已填满的在线重做日志文件的重用取决于归档模式:
■ 如果归档被禁用,意味着数据库处于NOARCHIVELOG模式,则在数据库写入进程(DBW)将记录在其中的更改检查点(写入)到磁盘后,已填满的在线重做日志文件可供重用。
■ 如果归档被启用,意味着数据库处于ARCHIVELOG模式,则在更改已写入数据文件并且文件已被归档后,已填满的在线重做日志文件可供日志写入进程使用。

在某些情况下,日志写入进程可能无法重用现有的在线重做日志文件。例如,在线重做日志文件可能是活动的(实例恢复所需),而不是非活动的(不需要实例恢复)。此外,在线重做日志文件可能正在被清除。

11.4.2.2. 在线重做日志文件的多个副本

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从不同时向不同组的成员写入。

注意:Oracle建议对在线重做日志进行多重复制。如果需要恢复,日志文件的丢失可能是灾难性的。当对在线重做日志进行多重复制时,数据库必须增加其执行的I/O量。根据的系统情况,这额外的 I/O 可能会影响数据库的整体性能。

11.4.2.2. 归档重做日志文件

归档重做日志文件是在线重做日志组中已填充成员的副本。这个文件不被视为数据库的一部分,而是由数据库创建并写入用户指定位置的在线重做日志文件的离线副本。归档重做日志文件是备份和恢复策略的关键部分。可以使用归档重做日志文件来:

■ 恢复数据库备份
■ 更新备用数据库(见第 17-8 页的“计算机故障”)
■ 使用LogMiner工具获取数据库历史的相关信息(见第 18-8 页的“Oracle LogMiner”)

归档是生成归档重做日志文件的操作。归档可以是自动的或手动的,并且只在数据库处于ARCHIVELOG模式时才可能。归档重做日志文件包括在线重做日志组中相同成员的重做条目和日志序列号。在图 11-7中,文件 A_LOG1 和 B_LOG1是组1的相同成员。如果数据库处于ARCHIVELOG模式,并且启用了自动归档,那么归档进程(ARCn)将会归档这些文件中的一个。如果 A_LOG1损坏了,那么该进程可以归档 B_LOG1。归档的重做日志包含自启用归档以来创建的每个组的副本。

11.4.3. 在线重做日志的结构

在线重做日志文件包含重做记录。重做记录由一组更改向量组成,每个更改向量描述对数据块的更改。例如,对员工表中工资的更新会产生一个重做记录,该记录描述了对表的数据段块、撤销段数据块和撤销段的事务表的更改。重做记录包含所有相关的更改元数据,包括以下内容:

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

posted @   脆皮老弟  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示