逻辑存储结构

本章介绍逻辑存储结构的性质和关系。这些结构由 Oracle AI Database 创建和识别,并且操作系统无法识别。

逻辑存储结构简介

Oracle AI Database 为数据库中的所有数据分配逻辑空间。

数据库空间分配的逻辑单元是数据块、区、段和表空间。在物理级别,数据存储在磁盘上的数据文件中。数据文件中的数据存储在操作系统块中。

下图是用于物理和逻辑存储的实体关系图。鸦脚的表示法表示一对多关系。

图 1:逻辑和物理存储

插图 cncpt227.gif 的说明

逻辑存储层次结构

段包含一个或多个区,每个区包含多个数据块。

下图显示了表空间内数据块、区和段之间的关系。在此示例中,一个段具有存储在不同数据文件中的两个区。

图 2:表空间中的段、区和数据块

插图 cncpt027.gif 的说明

从最低粒度级别到最高级别,Oracle AI Database 按如下方式存储数据:

另请参见:“物理存储结构简介”

逻辑空间管理

Oracle AI Database 必须使用逻辑空间管理来跟踪和分配表空间中的区。

当数据库对象需要某个区时,数据库必须具有查找和提供该区的方法。同样,当对象不再需要区时,数据库必须具有使可用区可用的方法。

Oracle AI Database 根据您创建的类型管理表空间中的空间。可以创建以下任一类型的表空间:

图 15-3 显示了表空间中逻辑空间管理的替代方案。

图 3:逻辑空间管理

插图 cncpt268.gif 的说明

本地管理的表空间

本地管理的表空间在数据文件头中维护位图,以跟踪数据文件正文中的空闲空间和已用空间。

每个位对应一组块。分配或释放空间时,Oracle AI Database 会更改位图值以反映块的新状态。

下图是位图管理的存储的概念表示形式。头中的 1 表示已用空间,而 0 表示空闲空间。

图 4:位图管理的存储

插图 cncpt332.gif 的说明

本地管理的表空间具有以下优点:

段空间管理是从包含该段的表空间继承的属性。在本地管理的表空间中,数据库可以自动或手动管理段。例如,可以手动管理表空间 tools 中的段时,自动管理表空间 users 中的段。

自动段空间管理

automatic segment space management (ASSM) 方法使用位图管理表空间中的空间。

位图具有以下优点:

ASSM 更高效,是本地管理的永久表空间的默认值。

注:本章假定 ASSM 在逻辑存储空间的所有讨论中使用。

手动段空间管理系统

传统 manual segment space management (MSSM) 方法使用称为空闲列表的链接列表来管理段中的空闲空间。

对于具有空闲空间的数据库对象,空闲列表将跟踪高水位标记 (High Water Mark,HWM) (High Water Mark,HWM) 下的块,这是所使用和尚未使用的段空间之间的分隔线。在使用块时,数据库会根据需要将块置于空闲列表中或从空闲列表中删除块。

除了 PCTFREE,MSSM 还要求您使用 SQL 参数(例如 PCTUSED、FREELISTS 和 FREELIST GROUPS)控制空间分配。PCTUSED 设置当前使用的块中必须存在的空闲空间百分比,以便数据库将其放入空闲列表中。例如,如果在 CREATE TABLE 语句中将 PCTUSED 设置为 40,则在使用不到 40% 的块空间之前,无法将行插入段中的块。

例如,假设在表中插入一行。数据库检查表的空闲列表以查找第一个可用块。如果该行不适合该块,并且该块中的已用空间大于或等于 PCTUSED,则数据库将从列表中删除该块并搜索其他块。如果从块中删除行,则数据库将检查块中的已用空间现在是否小于 PCTUSED。如果是这样,则数据库会将块放置在空闲列表的开头。

一个对象可以有多个空闲列表。通过这种方式,对表执行 DML 的多个会话可以使用不同的列表,从而减少争用。每个数据库会话在其会话期间仅使用一个空闲列表。

如图 15-5 中所示,您还可以创建包含一个或多个空闲列表组的对象,这些组是空闲列表的集合。每个组都有一个主空闲列表,用于管理组中的各个进程空闲列表。空闲列表(尤其是空闲列表组)的空间开销可能很大。

图 5:自由列表组

插图 cncpt320.gif 的说明

手动管理段空间可能很复杂。您必须调整 PCTFREE 和 PCTUSED 以减少行迁移并避免浪费空间。例如,如果段中的每个已用块都已满一半,并且 PCTUSED 为 40,则数据库不允许插入到这些块中的任何块。由于微调空间分配参数的难度,Oracle 强烈建议使用 ASSM。在 ASSM 中,PCTFREE 确定是否可以将新行插入块,但不会使用空闲列表并忽略 PCTUSED。

另请参见:

字典管理的表空间

字典管理的表空间使用数据字典来管理其区。

只要某个区已被分配或释放,可以重复使用,Oracle AI Database 就会更新数据字典中的表。例如,当表需要区时,数据库将查询数据字典表,并搜索空闲区。如果数据库找到空间,则会修改一个数据字典表,然后向另一个数据字典表中插入一行。通过这种方式,数据库通过修改和移动数据来管理空间。

数据库在后台执行以获取数据库对象空间的 SQL 是递归 SQL 。频繁使用递归 SQL 可能会对性能产生负面影响,因为必须对数据字典的更新进行序列化。本地管理的表空间(默认表空间)可避免此性能问题。

另请参阅:Oracle AI Database Administrator’s Guide,了解如何将表空间从字典管理迁移到本地管理

数据块概览

Oracle AI Database 在称为数据块的单元(也称为 Oracle 块或页)中管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单元。

数据块和操作系统块

在物理级别,数据库的数据存储在由操作系统块组成的磁盘文件中。

操作系统块是操作系统可以读取或写入的最小数据单元。而 Oracle 块是操作系统无法识别其具体大小和结构的逻辑存储结构。

下图显示了操作系统块的大小可能与数据块不同。数据库以多个数据块(而不是操作系统块)请求数据。

图 6:数据块和操作系统块

插图 cncpt293.gif 的说明

当数据库请求数据块时,操作系统会将此操作转换为永久存储中的数据请求。数据块与操作系统块的逻辑分离具有以下含义:

数据库块大小

每个数据库都有一个数据库块大小。

DB_BLOCK_SIZE 初始化参数在创建数据库时设置数据库的数据块大小。大小是为 SYSTEM 和 SYSAUX 表空间设置的,是所有其他表空间的默认值。除了通过重新创建数据库外,无法更改数据库块大小。

如果未设置 DB_BLOCK_SIZE,则缺省数据块大小特定于操作系统。数据库的标准数据块大小为 4 KB 或 8 KB。如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的倍数。

另请参见:

表空间块大小

可以创建块大小不同于 DB_BLOCK_SIZE 设置的单个表空间。

将可传输表空间移动到其他平台时,非标准块大小非常有用。

另请参阅:Oracle AI Database Administrator’s Guide,了解如何为表空间指定非标准块大小

数据块格式

每个数据块都有一个格式或内部结构,使数据库能够跟踪数据并释放块中的空间。无论数据块包含表、索引还是表集群数据,此格式都是相似的。

下图显示了未压缩数据块的格式。

图 7:数据块格式

插图 cncpt028.gif 的说明

数据块开销

Oracle AI Database 使用块开销来管理块本身。块开销不可用于存储用户数据。

如“数据块格式”中所示,块开销包括以下部分:

块开销的某些部分的大小是固定的,但总大小是可变的。平均而言,块开销总计为 84 到 107 字节。

行格式

块的行数据部分包含实际数据,例如表行或索引键条目。正如每个数据块都有一个内部格式一样,每一行都有一个行格式,使数据库能够跟踪该行中的数据。

Oracle AI Database 将行存储为可变长度记录。一行包含在一个或多个区段中。每个部分都称为行段。每个行片段都有一个行标题和列数据。

下图显示了行的格式。

图 8:行件的格式

插图 cncpt043.gif 的说明

行标题

Oracle AI Database 使用行标题管理存储在块中的行片段。

行标题包含如下信息:

一个块中完全包含的行至少有 3 个字节的行标题。

另请参见:

列数据

在行标题之后,列数据部分将实际数据存储在行中。行片段通常按 CREATE TABLE 语句中列出的顺序存储列,但不能保证此顺序。例如,最后创建类型为 LONG 的列。

如“行格式”中的图中所示,对于行片段中的每一列,Oracle AI Database 分别存储列长度和数据。所需的空间取决于数据类型。如果列的数据类型为可变长度,则存储值所需的空间会随着数据的更新而增大和缩小。

每一行在数据块标题的行目录中都有一个插槽。插槽指向行的开头。

另请参见:“表存储”和“索引存储”

行 ID 格式

Oracle AI Database 使用行 ID 唯一标识行。在内部,rowid 是存储数据库访问行所需的信息的结构。行 ID 不是以物理方式存储在数据库中,而是从存储数据的文件和块中推断出来。

扩展行 ID 包括数据对象编号。此行 ID 类型对每行使用基本 64 编码的物理地址。编码字符为 A-Z、a-z、0-9、+ 和 /。

示例 15-1 ROWID 伪列

以下示例查询 ROWID pseudocolumn ,以显示员工 100 的 employees 表中行的扩展行 ID:

SQL> SELECT ROWID FROM employees WHERE employee_id = 100;

ROWID
------------------
AAAPecAAFAAAABSAAA

下图说明了扩展 rowid 的格式。

图 9:ROWID 格式

插图 cncpt249.gif 的说明

扩展 rowid 以四件式格式 OOOOOOFFFBBBBBBRRR 显示,格式分为以下部分:

将 rowid 分配给行片段后,rowid 会在特殊情况下发生更改。例如,如果启用了行移动,则由于分区键更新、闪回表操作、收缩表操作等原因,行 ID 可以更改。如果禁用行移动,则使用 Oracle AI Database 实用程序导出和导入行时,行 ID 可以更改。注:在内部,数据库执行行移动,就像实际删除并重新插入行一样。但是,行移动被视为更新,这会影响触发器。

另请参见:

数据块压缩

数据库可以使用表压缩来消除数据块中的重复值。本节介绍使用压缩的数据块的格式。

使用基本表和高级行压缩的数据块的格式与未压缩块的格式基本相同。不同之处在于,位于块开头的符号表存储了行和列的重复值。数据库使用对符号表的简短引用替换这些值的匹配项。

示例 15-2 压缩数据块的格式

假设以下行存储在七列 sales 表的数据块中:

2190,13770,25-NOV-00,S,9999,23,161
2225,15720,28-NOV-00,S,9999,25,1450
34005,120760,29-NOV-00,P,9999,44,2376
9425,4750,29-NOV-00,I,9999,11,979
1675,46750,29-NOV-00,S,9999,19,1121

对此表应用基本表或高级行压缩时,数据库会用符号引用替换重复值。The following conceptual representation of the compression shows the symbol * replacing 29-NOV-00 and % replacing 9999:

2190,13770,25-NOV-00,S,%,23,161
2225,15720,28-NOV-00,S,%,25,1450
34005,120760,*,P,%,44,2376
9425,4750,*,I,%,11,979
1675,46750,*,S,%,19,1121

表 15-1 概念上表示将符号映射到值的符号表。

表 1 符号表

符号 值 列 行
* 29-NOV-00 3 958-960
% 9999 5 956-960

另请参见:“表压缩”

数据块中的空间管理

当数据库自下而上填充数据块时,行数据与块标头之间的空闲空间量会减少。

在更新期间,数据块中的空闲空间也会缩小,就像将尾随空值更改为非空值时一样。数据库管理数据块中的空闲空间,以优化性能并避免浪费空间。

注:本节假定使用自动段空间管理。

数据块中的空闲空间百分比

PCTFREE SQL 参数将保留的数据块的最小百分比设置为用于更新现有行的可用空间。PCTFREE 对于防止行迁移和避免浪费空间非常重要。

例如,假定您创建的表仅需要偶尔更新,其中大多数不会增加现有数据的大小。可以在 CREATE TABLE 语句中指定 PCTFREE 参数,如下所示:

CREATE TABLE test_table (n NUMBER) PCTFREE 20;

图 15-10 显示了 20 的 PCTFREE 设置如何影响空间管理。数据库会随着时间的推移向块中添加行,从而导致行数据向上增长到块标题,该标题本身也向下扩展到行数据。PCTFREE 设置可确保至少 20% 的数据块是免费的。例如,数据库会阻止 INSERT 语句填充块,以便行数据和标头占用总块空间的 90%,仅保留 10% 的空闲空间。

图 10:PCTFREE

插图 cncpt029.gif 的说明

注:此讨论不适用于不使用 PCTFREE 存储参数或空闲列表的 LOB 数据类型。

另请参见:

优化数据块中的空闲空间

虽然空闲空间百分比不能小于 PCTFREE,但空闲空间量可以大于。例如,将 PCTFREE 设置为 20% 会阻止空闲空间的总量下降到块的 5%,但允许 50% 的块是空闲的。

通过增加空闲空间进行优化

某些 DML 语句可以增加数据块中的空闲空间。

以下语句可以增加空间:

释放的空间可用于 INSERT 语句,条件如下:

另请参阅:Oracle AI Database Administrator’s Guide 以了解高级行压缩

通过合并碎片化空间进行优化

释放的空间可能与数据块中空闲空间的主区域相邻,也可能不相邻。非连续空闲空间称为分段空间。

下图显示了具有非连续空闲空间的数据块。

图 11:具有碎片空间的数据块

插图 cncpt210.gif 的说明

只有满足以下条件时,Oracle AI Database 才会自动透明地合并数据块的空闲空间:

合并后,空闲空间的量与操作之前的量相同,但空间现在是连续的。图 15-12 显示了空间合并后的数据块。

图 12:合并空闲空间后的数据块

插图 cncpt211.gif 的说明

Oracle AI Database 仅在前面的情况下执行合并,因为否则,由于数据块中空闲空间的持续合并,性能会降低。

链接的行和移植的行

Oracle AI Database 使用链接和迁移来管理过大而无法放入单个块的行。注:标准表中的链接行与区块链表中的行链不同。Oracle AI Database 使用不同的技术来管理区块链表中的行。

可能会出现以下情况:

图 15-13 描述在数据块中插入大行的情况。行对于左侧块来说太大,因此数据库通过将第一行片段放置在左侧块中,将第二行片段放置在右侧块中来连锁行。

图 13:行链接

插图 cncpt316.gif 的说明

图 15-14 :左侧块包含已更新的行,因此该行现在对块太大。数据库将整个行移至右侧块,并在左侧块中留下指向已迁移行的指针。

图 14:行迁移

插图 cncpt306.gif 的说明

链接或迁移行时,检索数据所需的 I/O 会增加。出现这种情况是因为 Oracle AI Database 必须扫描多个块才能检索行的信息。例如,如果数据库执行一个 I/O 读取索引,执行一个 I/O 读取非迁移表行,则需要额外的 I/O 才能获取迁移行的数据。

Segment Advisor 可以手动和自动运行,它是一个 Oracle AI Database 组件,用于标识具有回收空间的段。指导可以提供有关具有大量空闲空间或链接行过多的对象的建议。

另请参见:

索引块概览

index block 是一种特殊类型的数据块,用于以不同于表块的方式管理空间。Oracle AI Database 使用索引块管理索引中的逻辑存储空间。

索引块的类型

索引包含根块、分支块和叶块。

块类型定义如下:

索引条目的存储

索引条目以与数据块中的表行相同的方式存储在索引块中块部分中的索引条目不是以二进制顺序存储的,而是以堆形式存储的。

数据库以不同于数据块中的目录的方式管理索引块中的行目录。行目录中的条目(而不是索引块正文中的条目)按键值排序。例如,在行目录中,索引键 000000 的目录条目位于索引键 111111 的目录条目之前,依此类推。

行目录中条目的排序可提高索引扫描的效率。在范围扫描中,数据库必须读取该范围内指定的所有索引键。数据库将遍历分支块以标识包含第一个密钥的叶块。由于对行目录中的条目进行了排序,因此数据库可以使用二进制搜索来查找范围中的第一个索引键,然后按顺序遍历行目录中的条目,直到找到最后一个键。通过这种方式,数据库可以避免读取叶块主体中的所有密钥。

另请参阅:“数据块开销”

重用索引块中的插槽

数据库可以重用索引块中的空间。

例如,应用程序可能会在列中插入一个值,然后删除该值。当行需要空间时,数据库可以重用以前被删除值占用的索引插槽。

索引块通常具有比按堆组织的表块更多的行。通过将多个行存储在单个索引块中,数据库可以更轻松地维护索引,因为它可以避免频繁拆分块来存储新数据。

虽然可以使用带有 REBUILD 或 COALESCE 选项的 ALTER INDEX 语句手动合并索引,但索引本身无法合并。例如,如果将值 1 填充到 500000 的列,然后删除包含偶数的行,则索引将包含 250,000 个空插槽。仅当数据库可以将适合于包含空插槽的索引块的数据插入时,才重用插槽。

合并指数块

索引合并将现有索引数据压缩到位,如果重组释放块,则将空闲块保留在索引结构中。因此,合并不会释放用于其他用途的索引块,也不会导致索引重新分配块。

Oracle AI Database 不会自动压缩索引:您必须运行带有 REBUILD 或 COALESCE 选项的 ALTER INDEX 语句。图 15-15 显示了合并索引之前 employees.department_id 列的索引。前三个叶块仅部分满,如灰色填充线所示。

图 15:合并前的索引

插图 cncpt294.gif 的说明

图 15-16 显示了合并索引后的图 15-15 中的索引。前两个叶块现在已满,如灰色的填充线所示,第三个叶块已释放。

图 16:合并后的指数

插图 cncpt295.gif 的说明

另请参见:

区概览

区是由逻辑上连续的数据块组成的数据库存储单元。由于实施 RAID 条带和文件系统,区中的数据块可以物理分散在磁盘中。

区分配

默认情况下,创建数据段时,数据库将为该段分配初始区。区始终包含在一个数据文件中。

虽然尚未向段添加数据,但初始区中的数据块仅保留给此段。每个段的第一个数据块均包含该段中各区的目录。图 15-17 显示了以前未包含数据的数据文件中的段中的初始区。

图 17:段的初始区

插图 cncpt274.gif 的说明

如果初始区已满,并且需要更多空间,则数据库会自动为此段分配增量区。增量区是为段创建的后续区。

分配算法取决于表空间是本地管理还是字典管理。在本地管理的案例中,数据库会搜索数据文件的位图以查找相邻的空闲块。如果数据文件空间不足,则数据库会查找另一个数据文件。段的区始终位于同一表空间中,但可能位于不同的数据文件中。图 15-18 显示,数据库可以为表空间中任何数据文件中的段分配区。例如,段可以在 users01.dbf 中分配初始区,在 users02.dbf 中分配第一个增量区,然后在 users01.dbf 中分配下一个区。

图 18:段的增量区

插图 cncpt278.gif 的说明

新分配的区块(虽然是空闲的)可能不为空的旧数据。在 ASSM 中,当新分配的区开始使用区时,Oracle AI Database 会对区块进行格式化,但仅根据需要进行格式化。注:本节适用于串行操作,在该操作中,一个服务器进程解析并运行语句。数据库在并行 SQL 语句中以不同的方式分配区,这需要多个服务器进程。

另请参见:

区取消分配

通常,除非使用 DROP 语句删除对象,否则用户段的各个区不会返回到表空间。

例如,如果删除表中的所有行,则数据库不会回收数据块以供表空间中的其他对象使用。还可以使用 DBMS_SPACE_ADMIN 程序包删除段。

注:在还原段中,如果指定了 OPTIMAL 大小或者数据库处于自动还原管理模式,则 Oracle AI Database 会定期取消分配一个或多个区。

在某些情况下,您可以手动取消分配空间。Oracle 段指导可帮助根据对象中的碎片级别确定对象是否具有可供回收的空间。以下技术可以释放区:

释放区时,Oracle AI Database 会修改本地管理的表空间的数据文件中的位图,以将重新获取的区反映为可用空间。释放区块中的任何数据将无法访问。

另请参见:

区的存储参数

每个段都由以区表示的存储参数定义。这些参数控制 Oracle AI Database 如何为段分配空闲空间。

存储设置按以下优先级顺序确定,列表覆盖设置中的设置越高,列表中的设置越低:

  1. 段存储子

  2. 表空间存储子句

  3. Oracle AI Database 默认值

本地管理的表空间可以具有统一的区大小或由系统自动确定的可变区大小:

对于本地管理的表空间,无法在表空间级别指定某些存储参数。但是,您可以在段级别指定这些参数。在这种情况下,数据库会同时使用所有参数来计算段的初始大小。内部算法确定每个区的后续大小。

另请参见:

段概览

段是包含表空间内某个逻辑存储结构的所有数据的一组区。

例如,Oracle AI Database 会分配一个或多个区来构成表的数据段。数据库还会分配一个或多个区来构成表上索引的索引段。

Oracle AI Database 可自动或手动管理段空间。本节假定使用 ASSM。

用户段

数据库中的单个数据段存储一个用户对象的数据。

有不同类型的段。用户段的示例包括:

每个未分区的对象和对象分区都存储在自己的段中。例如,如果索引有五个分区,则五个段包含索引数据。

用户段创建

默认情况下,数据库使用延迟段创建在创建表、索引和分区时仅更新数据库元数据。

当用户将第一行插入到表或分区中时,数据库会为表或分区创建段、其 LOB 列及其索引。延迟段创建可避免不必要地使用数据库资源。例如,一个应用程序的安装可以创建数千个对象,消耗大量的磁盘空间。这些对象中的许多可能永远不会被使用。

DBMS_SPACE_ADMIN 软件包管理空对象的段。可以使用此 PL/SQL 程序包执行以下操作:

为了更好地说明对象创建和段创建之间的关系,假设已禁用延迟段创建。创建表的方式如下:

CREATE TABLE test_table (my_column NUMBER);

如图 15-19 中所示,数据库为该表创建一个段。

图 19:创建用户段

插图 cncpt246.gif 的说明

使用主键或唯一键创建表时,Oracle AI Database 会自动为此键创建索引。再次假定已禁用延迟段创建。创建表时,如下所示:

CREATE TABLE lob_table (my_column NUMBER PRIMARY KEY, clob_column CLOB);

图 15-20 显示 lob_table 的数据存储在一个段中,而隐式创建的索引存储在另一个段中。此外,CLOB 数据存储在自己的段中,其关联的 CLOB 索引也是如此。因此,CREATE TABLE 语句将创建 four 个不同的段。

图 20:多个段

插图 cncpt245.gif 的说明

注:表的段和此表的索引不必占用相同的表空间。

创建段时,数据库将分配一个或多个区。对象的存储参数确定如何分配每个段的区。这些参数会影响与对象关联的数据段的数据检索和存储效率。

另请参见:

临时段

在处理查询时,Oracle AI Database 通常需要临时工作区来执行 SQL 语句的中间阶段。

可能需要临时段的典型操作包括排序、散列和合并位图。在创建索引时,Oracle AI Database 还会将索引段放置到临时段中,然后在索引完成时将索引段转换为永久段。

如果可以在内存中执行操作,则 Oracle AI Database 不会创建临时段。但是,如果无法使用内存,则数据库会自动在磁盘上分配一个临时段。

为查询分配临时段

Oracle AI Database 在用户会话期间根据需要为查询分配临时段,并在查询完成时将其删除。联机重做日志中不会记录对临时段所做的更改,但临时段上的空间管理操作除外。

数据库会在分配给用户的临时表空间中创建临时段。表空间的默认存储特征决定了临时段中各区的特征。由于临时段的分配和取消分配频繁,因此最佳做法是为临时段创建至少一个特殊表空间。数据库在磁盘之间分配 I/O,并避免将 SYSTEM 和具有临时段的其他表空间碎片化。

注:在本地管理 SYSTEM 时,必须在创建数据库时定义默认临时表空间。本地管理的 SYSTEM 表空间不能用于默认临时存储。

另请参见:

临时表和索引的段分配

Oracle AI Database 可以为临时表及其索引分配临时段。

临时表存储仅在事务处理或对话期间存在的数据。每个会话仅访问为自身分配的区,并且无法访问为其他会话分配的区。

发生表中的第一个 INSERT 时,Oracle AI Database 会为全局临时表分配段,并且仅在需要时为专用临时表分配段。可以显式执行插入,也可以因为 CREATE TABLE AS SELECT。数据库为表及其索引分配段,为索引创建根页,并分配任何 LOB 段。

当前用户的临时表空间为临时表分配段。例如,分配给 user1 的临时表空间为 temp1,分配给 user2 的临时表空间为 temp2。在这种情况下,user1 将临时数据存储在 temp1 段中,而 user2 将临时数据存储在 temp2 段中。

另请参见:

撤消段

Oracle AI Database 会维护事务处理操作的记录,统称为撤消数据。

Oracle AI Database 使用还原数据执行以下操作:

Oracle AI Database 将还原数据存储在数据库中,而不是存储在外部日志中。还原数据存储在像数据块一样更新的块中,对这些块的更改将生成重做记录。通过这种方式,Oracle AI Database 可以高效访问还原数据,而无需读取外部日志。

永久对象的还原数据存储在还原表空间中。Oracle AI Database 提供了一种全自动机制(称为自动还原管理模式),用于管理还原表空间中的还原段和空间。

数据库将还原数据分成两个流。临时还原流仅封装由对临时对象所做的更改生成的还原记录,而永久还原流仅封装永久对象的还原记录。数据库独立管理临时和永久还原。撤消分离通过执行以下操作来减少存储并提高性能:

在 Active Data Guard 实例上,全局临时表上的 DML 要求在临时还原段中生成还原。

另请参见:

撤消段和事务处理

事务处理启动时,数据库将事务处理绑定(分配)到当前还原表空间中的还原段,因此绑定到事务处理表。在极少数情况下,如果数据库实例没有指定的还原表空间,则事务处理将绑定到系统还原段。

多个活动事务处理可以同时写入到同一还原段或不同的段。例如,事务 T1 和 T2 都可以写入还原段 U1,或者 T1 可以写入 U1,而 T2 则写入还原段 U 2。

从概念上讲,还原段中的区形成环。事务处理将写入一个还原区,然后以循环方式写入环中的下一个区,以此类推。图 15-21 显示了两个事务:T1 和 T2,它们开始在还原段的第三区 (E3) 中写入,并继续在第四区 (E4) 中写入。

图 21:撤消段中已分配区的环形

插图 cncpt328.gif 的说明

在任何给定时间,事务都会在还原段(称为事务的当前区)中按顺序只写入一个区。多个活动事务处理可以同时写入到同一当前区或不同的当前区。图 15-21 显示了在 E3 范围内同时写入的事务 T1 和 T2。在还原范围内,数据块仅包含一个事务处理的数据。

当当前还原区填充时,第一个需要空间的事务处理将检查环中下一个分配的区的可用性。如果下一个区不包含来自活动事务处理的数据,则该区将成为当前区。现在,所有需要空间的事务都可以写入新的当前区。在图 15-22 中,当 E4 已满时,T1 和 T2 继续写入 E1,以覆盖 E1 中的非活动还原数据。

图 22:在还原段中循环使用已分配区

插图 cncpt327.gif 的说明

如果下一个区确实包含来自活动事务处理的数据,则数据库必须分配一个新区。图 15-23 显示了 T1 和 T2 正在写入 E4 的方案。当 E4 填充时,事务处理无法继续写入 E1,因为 E1 包含活动的还原条目。因此,数据库会为此还原段分配一个新区 (E5)。交易继续写信给 E5。

图 23:为还原段分配新区

插图 cncpt326.gif 的说明

另请参阅:Oracle AI Database Administrator’s Guide,了解如何管理还原段

事务处理回退

发出 ROLLBACK 语句时,数据库使用还原记录回退未提交的事务处理对数据库所做的更改。

在恢复期间,数据库会将从联机重做日志应用的任何未提交的更改回退到数据文件。还原记录提供读取一致性,方法是在另一个用户更改数据的同时,为访问数据的用户维护数据之前的映像。

临时还原段

临时还原段是仅用于临时还原数据的可选空间管理容器。

临时表更改的还原记录既特定于会话,也仅对读一致性和事务处理回退有用。在 Oracle Database 12c 之前,数据库始终将这些记录存储在联机重做日志中。由于对临时对象的更改不会记录在联机重做日志中,因此将临时对象的还原写入临时还原段可节省联机重做日志和归档重做日志文件中的空间。数据库不会记录对还原所做的更改或对临时表的更改,从而提高性能。

可以设置 TEMP_UNDO_ENABLED 初始化参数,以便临时表将还原数据存储在临时还原段中。当此参数为 TRUE 时,数据库将从临时表空间分配临时还原段。

另请参见:

段空间和高水位标记

要管理空间,Oracle AI Database 将跟踪段中块的状态。高水位标记 (high water mark,HWM) 是段中未设置数据块格式且从未使用的点。

MSSM 使用空闲列表来管理段空间。在创建表时,不会设置段中任何块的格式。会话首次向表中插入行时,数据库将在空闲列表中搜索可用的块。如果数据库找不到可用的块,则它将预设一组块的格式,将其放置在空闲列表中,然后开始将数据插入块。在 MSSM 中,全表扫描读取 HWM 下的所有块。

ASSM 不使用空闲列表,因此必须以不同的方式管理空间。会话首次将数据插入表中时,数据库会格式化单个位图块,而不是像在 MSSM 中一样预格式化一组块。位图跟踪段中块的状态,取代空闲列表。数据库使用位图查找空闲块,然后在向每个块填充数据之前对其进行格式化。ASSM 在块之间展开插入以避免并发问题。

ASSM 段中的每个数据块都处于以下状态之一:

图 15-24 将 ASSM 段描述为水平的一系列块。在创建表时,HWM 位于左侧段的开头。由于尚未插入任何数据,因此段中的所有块都未设置格式且从不使用。

图 24:创建表的 HWM

插图 cncpt275.gif 的说明

假设事务处理将行插入到段中。数据库必须分配一组块来存放行。分配的块低于 HWM。数据库格式化此组中的位图块以保存元数据,但不预设组中剩余块的格式。

在图 15-25 中,将分配 HWM 下面的块,而 HWM 上面的块既不分配也不格式化。发生插入时,数据库可以写入任何具有可用空间的块。低高水位标记(低 HWM)标志着以下点,所有块都已知被格式化,因为它们要么包含数据,要么以前包含数据。

图 25:HWM 和低 HWM

插图 cncpt276.gif 的说明

在图 15-26 中,数据库选择 HWM 和低 HWM 之间的块并将其写入。数据库可以轻松地在 HWM 和低 HWM 之间选择任何其他块,或者在低 HWM 以下具有可用空间的任何块。在 Figure 15-26 中,新填充的块的任一侧的块都未设置格式。

图 26:HWM 和低 HWM

插图 cncpt333.gif 的说明

低 HWM 在全表扫描中非常重要。由于 HWM 下面的块仅在使用时才进行格式化,因此某些块可以取消格式化,如 Figure 15-26 中所示。因此,数据库会读取位图块来获取低 HWM 的位置。数据库会读取到低 HWM 的所有块,因为已知这些块会进行格式化,然后仅仔细读取低 HWM 和 HWM 之间的格式化块。

假设新事务将行插入表中,但位图指示 HWM 下的空闲空间不足。在图 15-27 中,数据库将 HWM 推进到右侧,并分配一组新的未格式化块。

图 27:推进 HWM 和低 HWM

插图 cncpt277.gif 的说明

当 HWM 与低 HWM 之间的块已满时,HWM 将向右移动,低 HWM 将向旧 HWM 的位置移动。随着时间的推移,数据库插入数据时,HWM 继续向右移动,低 HWM 始终紧随其后。除非您手动重新生成、截断或收缩对象,否则 HWM 永远不会撤回。

另请参见:

表空间概览

表空间是段的逻辑存储容器。

段是消耗存储空间的数据库对象,例如表和索引。在物理级别,表空间将数据存储在一个或多个数据文件或临时文件中。

多租户环境中的表空间

在 CDB 中,每个 PDB 和应用程序根都有自己的表空间集。

每个 CDB 根、PDB 和应用程序根必须具有 SYSTEM 和 SYSAUX 表空间。下图显示了典型容器中的表空间。

图 28:表空间

插图 cncpt319.gif 的说明

CDB 包含以下内容:

示例 15-3 CDB 处于本地还原模式

此示例显示了具有两个 PDB 的 CDB 的物理存储体系结构的各个方面:hrpdb 和 salespdb。在此示例中,数据库使用本地还原模式,CDB 根、hrpdb 和 salespdb 中也有还原数据文件。

图 29:本地还原模式下 CDB 的物理体系结构

插图 cncpt386.png 的说明

另请参阅:“ CDB 中的数据字典分隔”

永久表空间

永久表空间将持久方案对象分组。表空间中对象的段以物理方式存储在数据文件中。

会为每个数据库用户分配一个默认的永久表空间。非常小的数据库可能仅需要默认的 SYSTEM 和 SYSAUX 表空间。但是,Oracle 建议您至少创建一个表空间来存储用户和应用程序数据。可以使用表空间实现以下目标:

另请参见:

SYSTEM 表空间

SYSTEM 表空间是创建数据库时随数据库提供的必要管理表空间。Oracle AI Database 使用 SYSTEM 管理数据库。

SYSTEM 表空间包含以下信息,这些信息均归 SYS 用户所有:

SYSTEM 表空间作为任何其他表空间进行管理,但需要更高级别的权限,并且在某些方面受到限制。例如,无法重命名或删除 SYSTEM 表空间。

默认情况下,Oracle AI Database 会将所有新创建的用户表空间设置为本地管理。在具有本地管理的 SYSTEM 表空间的数据库中,无法创建字典管理的表空间(这些表空间已过时)。但是,如果手动执行 CREATE DATABASE 语句并接受默认值,则 SYSTEM 表空间将由字典管理。可以将现有字典管理的 SYSTEM 表空间迁移到本地管理的格式。注:Oracle 强烈建议您使用 Database Configuration Assistant (DBCA) 创建新数据库,以便默认情况下所有表空间(包括 SYSTEM)都由本地管理。

另请参见:

SYSAUX 表空间

SYSAUX 表格空间是 SYSTEM 表格的辅助表空间。

因为这是许多以前需要具有自己的表空间的 Oracle AI Database 功能和产品的默认表空间,因此 SYSAUX 所要求的表空间数,也减少了数据库所需的表空间数。还可减少 SYSTEM 表空间的负载。

数据库创建或升级会自动创建 SYSAUX 表空间。在正常数据库操作期间,数据库不允许删除或重命名 SYSAUX 表空间。如果 SYSAUX 表空间不可用,则核心数据库功能仍可运行。使用 SYSAUX 表空间的数据库功能可能会失败,或者功能有限。

另请参阅:Oracle AI Database Administrator’s Guide 以了解 SYSAUX 表空间

还原表空间

还原表空间是为系统管理的还原数据保留的本地托管表空间。

与其他永久表空间一样,还原表空间包含数据文件。这些文件中的还原块按区分组。

自动还原管理模式

还原表空间要求数据库处于默认自动还原模式。

自动模式可消除手动管理还原段的复杂性。数据库会自动进行优化,以尽可能保留还原数据,从而满足可能需要此数据的长时间运行的查询。

Oracle AI Database 的新安装将自动创建还原表空间。早期版本的 Oracle AI Database 可能不包含还原表空间,而是使用传统回退段(称为手动还原管理模式)。Oracle AI Database 包含一个还原指导,该指导提供有关还原建议并有助于自动执行还原环境。

一个数据库可以包含多个还原表空间,但一次只能使用一个还原表空间。当实例尝试打开数据库时,Oracle AI Database 会自动选择第一个可用的还原表空间。如果没有还原表空间可用,则实例将在不使用还原表空间的情况下启动,并将还原数据存储在 SYSTEM 表空间中。建议不要在 SYSTEM 中存储还原数据。

另请参见:

自动还原保留期

还原保留期是 Oracle AI Database 尝试在覆盖旧还原数据之前保留该数据的最短时间。

还原保留很重要,因为长时间运行的查询可能需要较早的块映像来提供读一致性。此外,某些 Oracle Flashback 功能可能依赖于还原可用性。

一般来说,最好尽可能长时间保留旧的还原数据。提交事务处理后,回退或事务处理恢复不再需要还原数据。如果还原表空间有用于新事务处理的空间,则数据库可以保留旧还原数据。当可用空间不足时,数据库将开始覆盖已提交事务处理的旧还原数据。

Oracle AI Database 可自动为当前还原表空间提供最佳的还原保留期。数据库将收集使用情况统计信息,并根据这些统计信息以及还原表空间大小优化保留期。如果使用 AUTOEXTEND 选项配置了还原表空间,并且未指定最大大小,则还原保留期优化会有所不同。在这种情况下,如果空间允许,数据库会将还原保留期调整为略长于运行时间最长的查询。

另请参阅:Oracle AI Database Administrator’s Guide,了解有关自动优化还原保留期的更多详细信息

影子表空间

影子表空间是用于影子丢失写入保护的大文件表空间。

注:影子丢失写入保护与使用 DB_LOST_WRITE_PROTECT 初始化参数和备用数据库配置的丢失写入保护无关。

影子表空间的用途

影子丢失的写入保护可快速检测丢失的写入并立即响应。

当 I/O 子系统确认块写入已完成时,即使未发生写入,或者当块的前映像覆盖当前映像时,也会发生数据块丢失写入。

未检测到的丢失写入可能会导致数据损坏,因为不正确的数据可用于其他 DML 事务处理。例如,一个事务处理可以读取一个表中的旧数据和不正确数据,然后根据这些数据更新数百个其他表。这样,数据损坏就会扩散到整个数据库中。

影子丢失写入保护具有以下优点:

另请参阅:Oracle AI Database SQL Language Reference 以了解有关 LOST WRITE PROTECTION 子句的更多信息

影子表空间的工作方式

丢失的写入保护需要两个表空间:一个影子表空间和一个非影子表空间,其块由影子表空间跟踪。

下图提供了示例方案。表空间 TBS1 和 TBS2 中的数据文件由影子表空间跟踪。影子表空间仅跟踪表空间 TBS3 中的数据文件 DBF6。

插图 cncpt390.png 的说明

一个跟踪的数据文件映射到影子表空间中的一个影子区。跟踪数据文件中的每个数据块在影子块中都有一个对应的条目。此条目包含跟踪数据块的 SCN。从磁盘读取跟踪的数据块时,影子丢失的写入保护会将影子表空间中块的 SCN 与跟踪数据块中最近写入的 SCN 进行比较。如果影子条目的 SCN 大于要读取的数据块,则会发生丢失的写入,并提示出现错误。

影子区的大小具有显著的额外空间,以防止数据文件的自动调整大小导致影子区增大过大。如果跟踪的数据文件是手动或自动调整大小的,并且影子区需要增长,则数据库将尝试调整跟踪数据的大小。如果影子表空间中不存在足够的空间,则数据库会将警告写入预警日志,并跟踪尽可能多的数据块。

另请参阅:Oracle AI Database Administrator’s Guide,了解如何管理影子丢失写入保护

影子表空间的用户界面

可以使用 ALTER PLUGGABLE DATABASE 命令启用和禁用影子丢失写入保护。

要保护特定表空间或数据文件的影子丢失写入保护,必须满足以下条件:

Oracle AI Database 会自动将跟踪的数据文件分配给特定的影子表空间。无法指定哪个影子表空间用于特定数据文件。

以下数据字典视图监视影子表空间:

另请参见:

示例:配置丢失的写入保护

此示例为一组表空间启用影子丢失写入跟踪。

在此示例中,您的目标是保护 PDB 中的 salestbs 和 hrtbs 表空间。您还希望保护 oetbs01.dbf 数据文件,并且只保护 oetbs 表空间中的此数据文件。您可以执行以下操作:

  1. 以管理员身份登录到 PDB。

  2. 按如下方式创建单个影子表空间:

    CREATE BIGFILE TABLESPACE shadow_lwp1
      DATAFILE 'shadow_lwp1_df' SIZE 10M LOST WRITE PROTECTION;
  3. 为 PDB 启用丢失的写入保护,如下所示:

    ALTER DATABASE ENABLE LOST WRITE PROTECTION;
  4. 为 salestbs 和 hrtbs 表空间启用影子丢失写入保护,如下所示:

    ALTER TABLESPACE salestbs ENABLE LOST WRITE PROTECTION;
    ALTER TABLESPACE hrtbs ENABLE LOST WRITE PROTECTION;
  5. 为 oetbs01.dbf 数据文件启用影子丢失写入保护,如下所示:

    ALTER DATABASE DATAFILE 'oetbs01.dbf' ENABLE LOST WRITE PROTECTION;

另请参见:

临时表空间

临时表空间包含仅在会话期间持续的临时数据。永久方案对象不能位于临时表空间中。temp file 存储临时表空间数据。

临时表空间可以提高内存中不适合的多个排序操作的并发性。这些表空间还可提高排序期间空间管理操作的效率。

共享和本地临时表空间

临时表空间是共享表空间或本地表空间。

共享临时表空间将临时文件存储在共享磁盘上,以便所有数据库实例都可访问该临时空间。相反,本地临时表空间会为每个数据库实例存储单独的非共享临时文件。本地临时表空间可用于 Oracle Real Application Clusters 或 Oracle Flex Clusters。

可以为只读和读/写数据库实例创建本地临时表空间。当许多只读实例访问单个数据库时,本地临时表空间可以提高涉及排序、散列聚合和联接的查询的性能。优点是:

下表比较了共享和本地临时表空间的特征。

表 2:共享和本地临时表空间

共享临时表空间 本地临时表空间
使用 CREATE TEMPORARY TABLESPACE 语句创建。

使用 CREATE LOCAL TEMPORARY TABLESPACE 语句创建。

注:本地临时表空间始终是大文件表空间,但创建语句中不需要 BIGFILE 关键字。

为数据库创建单个临时表空间。 为每个数据库实例创建单独的临时表空间。FOR LEAF 选项仅为只读实例创建表空间。FOR ALL 选项为所有实例(只读和读/写)创建表空间。
支持表空间组。 不支持表空间组。
将临时文件元数据存储在控制文件中。 存储控制文件中所有实例通用的临时文件元数据,以及 SGA 中特定于实例的元数据(例如,分配的位图、当前临时文件大小和文件状态)。

另请参阅:“Oracle AI Database 实例简介”

默认临时工作区

为每个数据库用户帐户分配一个默认的共享临时表空间。如果数据库包含本地临时表空间,则还会为每个用户帐户分配默认的本地临时存储。

可以使用 CREATE USER 或 ALTER USER 语句为用户帐户指定其他临时表空间。对于未为其指定其他临时表空间的用户,Oracle AI Database 使用系统级默认临时表空间。

创建默认临时表空间

创建数据库时,默认临时存储取决于 SYSTEM 表空间是否在本地管理。

下表显示了 Oracle AI Database 在创建数据库时如何选择默认临时表空间。

表 3:创建默认临时表空间

SYSTEM 表空间是否在本地管理? CREATE DATABASE 语句是否指定了默认临时表空间? 然后,数据库…
是 是 使用指定的表空间作为默认值。
是 否 创建临时表空间。
否 是 使用指定的表空间作为默认值。
否 否 使用 SYSTEM 作为默认临时存储。数据库在预警日志中写入一条警告,指示建议使用默认临时表空间。

创建数据库后,可以使用 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE 语句更改数据库的默认临时表空间。注:不能将默认临时表空间设为永久表空间。

另请参见:

访问临时存储

如果为用户分配了临时表空间,则数据库将首先访问该表空间;否则,数据库将访问默认临时表空间。数据库访问查询的临时表空间后,不会切换到其他表空间。

用户查询可以访问共享或本地临时存储。此外,可以为只读实例分配一个默认本地临时表空间,并为读/写实例分配不同的默认本地临时表空间。

对于读/写实例,数据库对共享临时表空间给予更高的优先级。对于只读实例,数据库对本地临时表空间给予更高的优先级。如果数据库实例是读/写实例,则数据库按以下顺序搜索空间:

  1. 是否为用户分配了共享临时表空间?

  2. 是否为用户分配了本地临时表空间?

  3. 数据库默认临时表空间是否具有空间?

如果前面任何问题的答案是肯定的,则数据库将停止搜索并从指定的表空间分配空间;否则,将从数据库默认的本地临时表空间分配空间。

如果数据库实例是只读的,则数据库按以下顺序搜索空间:

  1. 是否为用户分配了本地临时表空间?

  2. 分配的数据库默认本地临时表空间是否具有空间?

  3. 是否为用户分配了共享临时表空间?

如果前面任何问题的答案都是“是”,则数据库将停止搜索并从指定的表空间分配空间;否则,将从数据库默认的共享临时表空间分配空间。

表空间模式

表空间模式确定表空间的可访问性。

读取/写入和只读表空间

每个表空间都处于指定是否可以写入的写入模式。

互斥模式如下:

另请参见:

联机和离线表空间

表空间可以联机(可访问),也可以脱机(不可访问)。

表空间通常处于联机状态,以便用户可以使用其数据。SYSTEM 表空间和临时表空间无法脱机。

表空间可以自动或手动脱机。例如,您可以使表空间脱机以进行维护或备份和恢复。当遇到某些错误时,数据库会自动使表空间脱机,例如当数据库写进程 (DBW) 进程多次尝试写入数据文件时失败时。尝试访问脱机表空间中的表的用户将收到错误。

当表空间脱机时,数据库执行以下操作:

另请参见:

表空间文件大小

表空间是大文件表空间或小文件表空间。这些表空间在执行不显式引用数据文件或临时文件的 SQL 语句方面无法区分。

不同之处如下:

另请参见: