逻辑存储结构简介
Oracle 数据库为数据库中的所有数据分配逻辑空间。
数据库空间分配的逻辑单元是数据块、 扩展区、 段、 和表空间。 而在物理级,数据被存储在磁盘上的数据文件中 。数据文件中的数据存储在操作系统块中。
下图是一个物理和逻辑存储的实体关系图。 乌鸦脚表示法表示一对多关系。
图 12-1 逻辑和物理存储
Description of "Figure 12-1 Logical and Physical Storage"
另见:
"Physical Storage Structures"
逻辑存储层次结构
段包含一个或多个区,每个区包含多个数据块
下图显示了在表空间中的数据块、 扩展区、 和段之间的关系。在此示例中, 一个段具有分别存储在不同数据文件中的两个扩展区。
图 12-2 表空间中的段、 扩展盘区、 和数据块
Description of "Figure 12-2 Segments, Extents, and Data Blocks Within a Tablespace"
从最低粒度到最高粒度,Oracle数据库存储数据
-
数据块是Oracle数据库中最小的数据存储逻辑单元。
一个逻辑数据块对应于特定字节数的物理磁盘空间,比如 2 KB。数据块是 Oracle 数据库可以使用或分配的最小存储单位。 -
区是为存储特定类型的信息而分配的一组逻辑上相邻的数据块
在上图中,这个 24 KB 的扩展区有 12 个数据块,而这个 72 KB 的扩展区有 36 个数据块。
-
段是为特定数据库对象(如表)分配的一组区段。
例如,employees 表的数据存储在其自己的数据段中,而该表的每个索引存储在其自己的索引段中。 会消耗存储空间的每个数据库对象都由单个段组成。 -
表空间是一个包含一个或多个段的数据库存储单元。
每个段属于且仅属于一个表空间。因此,一个段的所有扩展区存储在相同的表空间中。在一个表空间中, 一个段可以包括多个数据文件中的扩展区,如上图所示。例如, 段的一个扩展区可能存储在 users01.dbf 中,而另一个存储在 users02.dbf 中。 单个扩展区绝不会跨越多个数据文件。
另见:
"Overview of Data Files"
逻辑空间管理
Oracle 数据库必须使用逻辑空间管理来在表空间中跟踪并分配扩展区。
-
本地管理表空间(默认值)
数据库使用表空间本身中的位图来管理扩展区。 因此, 本地管理表空间需要预留表空间的一部分用于位图。 在一个表空间中, 数据库可以使用自动段空间管理 (ASSM) 或手动段空间管理 (MSSM) 来管理段 。 -
字典管理表空间
数据库使用数据字典来管理扩展区
图 12-3 显示了一个表空间中的逻辑空间管理方法的可选方案。
图 12-3 逻辑空间管理
Description of "Figure 12-3 Logical Space Management"
另见:
"Overview of the Data Dictionary"
本地管理表空间
图 12-4 位图管理存储
Description of "Figure 12-4 Bitmap-Managed Storage"
本地管理表空间具有如下优势:
-
避免使用数据字典来管理扩展区
如果消耗或释放一个扩展区会导致在数据字典表或撤消段中消耗或释放空间,则在字典管理的表空间中会发生递归操作。 -
自动跟踪相邻的可用空间
通过这种方式,数据库消除了合并空闲扩展区的需要。
-
自动确定本地管理扩展区的大小
或者, 在本地管理表空间中所有的扩展区可以具有相同的大小,并覆盖对象存储选项。
自动段空间管理
自动段空间管理(ASSM)方法在表空间中使用位图管理空间。
位图提供了以下优点:
-
简化管理
ASSM 可以避免手动确定许多存储参数的正确设置的需要。只有一个很关键的控制空间分配的 SQL 参数: PCTFREE。此参数指定要为块 中保留用于将来的更新的空间百分比(请参阅"Percentage of Free Space in Data Blocks") 。 -
增强并发性
多个事务可以搜索多个相互独立的空闲数据块列表,从而减少争用和等待。 对很多标准工作负载,使用 ASSM 的应用程序性能比使用优化得很好的使用 MSSM 的应用程序性能更好。 - 对 Oracle 真正应用集群 (Oracle RAC) 环境中实例的空间动态亲合性
ASSM 更有效,并且是永久性本地管理表空间的默认值。
手动段空间管理
旧式的手动段空间管理(MSSM)方法使用称为空闲列表的链表来管理段中的可用空间。
例如,假设向一个表中插入行。数据库检查该表的空闲列表,以查找第一个可用的块。如果行无法容纳进该块中,并在块中已使用空间大于或等于 PCTUSED,则数据库将该块从空闲列表中移除,并搜索另一个块。如果从块中删除行,则数据库检查块中的已使用空间现在是否小于 PCTUSED。如果是, 则数据库将该块置于空闲列表的开头。
图 12-5 空闲列表组
Description of "Figure 12-5 Free List Groups"
另见:
-
"Chained and Migrated Rows"
-
《Oracle Database Administrator’s Guide》了解本地管理表空间
-
《Oracle Database Administrator’s Guide》了解自动段空间管理
-
《Oracle Database SQL Language Reference》了解存储参数, 如 PCTFREE 和 PCTUSED
字典管理表空间
字典管理表空间使用数据字典来管理其扩展区。
另见:
《Oracle Database Administrator’s Guide》了解如何从字典管理表空间迁移到本地管理表空间
数据块概述
数据块和操作系统块
在物理级别, 存储在磁盘文件中的数据库数据由操作系统块组成。
下图显示操作系统块与数据块的大小可能有所不同。数据库按数据块(而不是按操作系统块) 的倍数来请求数据。
图 12-6 数据块和操作系统块
Description of "Figure 12-6 Data Blocks and Operating System Blocks"
-
应用程序不需要确定磁盘上的数据的物理地址。
-
数据库数据可以在多个物理磁盘上进行条带化或镜像。
数据库块大小
每个数据库都有一个数据库块大小。
另见:
-
《Oracle Database Reference》了解 DB_BLOCK_SIZE 初始化参数
-
《Oracle Database Administrator’s Guide》和《Oracle Database Performance Tuning Guide》了解如何选择块大小
表空间块大小
你可以创建其块大小不同于 DB_BLOCK_SIZE 设定值的表空间。
另见:
《Oracle Database Administrator’s Guide》了解如何为表空间指定非标准的块大小
数据块格式
下图显示了一个未压缩的数据块的格式
图 12-7 数据块格式
Description of "Figure 12-7 Data Block Format"
另见:
"Data Block Compression"了解压缩块
数据块开销
Oracle 数据库使用块开销来管理块本身。块开销不能用来存储用户数据。
如"Data Block Format"展示,块开销将包括以下部分:
-
块头
此部分包含关于块的一般信息,包括磁盘地址和段类型。对于事务管理块,其块头包含活动的和历史的事务信息。每个更新块的事务都需要一个事务条目。 Oracle 数据库预先在块头中为事务条目保留空间。 在分配给段用于支持事务性更改的数据块中,当块头空间耗尽时, 可用空间也可以容纳事务条目。 事务条目所需的的空间取决于操作系统。但是, 绝大多数操作系统中的事务条目需要大约 23 个字节。 -
表目录
对于堆组织表,此目录包含有关其行存储在该块中的表的元数据。多个表可以将行存储在相同的块中。 -
行目录
对于堆组织表, 此目录描述该块的数据部分中的行的位置。数据库可以在块底部的任何位置放置一行。行地址记录在行目录向量的一个槽中。
rowid指向特定的文件、块和行号。例如,在rowid AAAPecAAFAAAABSAAA中,最后的 AAA 表示行号。行号是行目录中某个条目的索引。行目录条目包含指向数据块上该行位置的指针。如果数据库在一个块中移动一行,那么数据库将更新行目录条目来修改指针。rowid保持不变。
当已在行目录中分配空间后, 即使在行被删除后, 数据库也不会回收此空间。因此, 就算某块现在是空的,但若之前曾经达到 50 行,则在行目录仍会保留已分配的 100 字节。仅在块中插入新行时,数据库才会重用此空间。
行格式
下图显示了行格式。
图 12-8 行片断格式
Description of "Figure 12-8 The Format of a Row Piece"
行头
Oracle 数据库使用行头来管理存储在块中的行片断。
行头包含以下信息:
-
行片断中的各列
-
位于其他数据块中的各个行片断
如果整个行可以插入到一个数据块中, 则 Oracle 数据库将该行存储为一个行片断。但是,如果所有行数据不能插入一个单一的块,或者一个更新导致现有的行不能容纳在原来的块中,则数据库将该行存储为多个行片断。数据块中通常每行只包含一个行片断。 -
表簇的簇键
包含在一个块中的完全行至少有 3 个字节的行头。
另见:
-
"Chained and Migrated Rows"
-
"Overview of Table Clusters"
列数据
如图"Row Format"所示,对行片断中的每一列, Oracle 数据库独立地存储列长度和列数据。所需的空间取决于数据类型。 如果列的数据类型是可变长度的,则用于容纳一个值所需的空间可能在其数据被更新时会增长和收缩。
每一行都在数据块标头的行目录中有一个槽位。 槽位指向行的开始部分。
另见:
"Table Storage"和"Index Storage"
Rowid 格式
例 12-1 ROWID 伪列
如下示例查询 ROWID 伪列来显示 employees 表中雇员 100 的所在行的扩展 rowid。
SQL> SELECT ROWID FROM employees WHERE employee_id = 100;ROWID
------------------
AAAPecAAFAAAABSAAA
下图说明了一个扩展的 rowid 的格式。
Figure 12-9 ROWID Format
Description of "Figure 12-9 ROWID Format"
-
OOOOOO
数据对象号标识段(如示例查询的数据对象 AAAPec)。 数据库中的每个段都被分配了一个数据对象号。同一段中的模式对象(如一个表簇) 具有相同的数据对象号。
-
FFF
表空间相对数据文件号, 标识包含行的数据文件 (如示例查询的文件 AAF)。 -
BBBBBB
数据块号标识包含行的块(如示例查询的块 AAAABS) 。块号是相对于他们的数据文件的,而不是其表空间。因此, 具有相同块号的两行,可以驻留在同一表空间的不同数据文件中。
-
RRR
行号标识块中的行(示例查询的行 AAA)。
另见:
-
"Rowid Data Types"
-
《Oracle Database SQL Language Reference》了解 rowid
数据块压缩
数据库可以使用表压缩来消除在数据块中的重复值。本节介绍使用压缩的数据块格式。
例 12-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
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
表 12-1 从概念上展示了从符号映射到值的符号表。
表 12-1 符号表
Symbol | Value | Column | Rows |
---|---|---|---|
* |
29-NOV-00 |
3 |
958-960 |
% |
9999 |
5 |
956-960 |
另见:
"Table Compression"
数据块的空间管理
当将一个尾部空值更改为非空值时,在更新期间,数据块中的可用空间也会变少。数据库会管理数据块中的可用空间, 以优化性能并避免空间浪费。
数据块中的可用空间百分比
CREATE TABLE test_table (n NUMBER) PCTFREE 20;
图 12-10 PCTFREE
Description of "Figure 12-10 PCTFREE"
另见:
-
"Overview of LOBs"
-
《Oracle Database SQL Language Reference》关于 PCTFREE 参数的语法和语义
优化数据块中的可用空间
虽然可用空间的百分比不能小于 PCTFREE,但其可用空间量可以更大。例如,将PCTFREE设置为20%可以防止空闲空间总量下降到块的 5%,但是允许块的 50% 是空闲的。
通过增加自由空间进行优化
一些DML语句可以增加数据块中的空闲空间。
下列语句可以增加空间:
-
DELETE 语句
- UPDATE 语句,要么将现有值更新为更小的值,或者增大现有值并被强制迁移到另一个行
-
在使用了行压缩的表上的 INSERT 语句
如果插入操作往块中填充了数据, 则数据库会调用块压缩,结果可能会导致在块中有更多的可用空间。
在下列条件下, 释放的空间可供 INSERT 语句使用:
- 如果 INSERT 语句是位于释放空间的语句之后,且处于相同的事务中,则该语句可以使用已释放的空间。
-
如果 INSERT 语句与释放空间的语句位于各自单独的事务中(也许是由另一个用户运行的),且空间允许,则该语句可以在需要此空间时使用它,但是只有在另一个事务提交之后。
另见:
《Oracle Database Administrator’s Guide》了解行压缩的优点
通过合并碎片空间进行优化
被释放的空间与数据块可用空间的主要区域可能是连续的。不连续的可用空间称为碎片空间。
下图显示具有非连续空闲空间的数据块。
图 12-11 具有碎片空间的数据块
Description of "Figure 12-11 Data Block with Fragmented Space"
- INSERT 或 UPDATE 语句试图使用的块, 包含足够的可用空间来容纳新的行片断。
- 可用空间已被碎片化, 以至于该行片断不能插入到块中的某一个连续区域。
图 12-12 数据块合并后的可用空间
Description of "Figure 12-12 Data Block After Coalescing Free Space"
链接和迁移的行
Oracle 数据库必须管理太大而不能放入一个单一块的行。
-
该行太大, 在它第一次插入时,无法放入一个数据块。
在行链接中, Oracle 数据库将数据存储在为段保留的一个或多个被链接的数据块中。 行链接最经常出现在大行中。示例包括包含 LONG 或 LONG RAW 数据类型列的行、 或在 2 KB 块中的 VARCHAR2(4000) 列、 或具有大量列的行。在这些情况下链接行是不可避免的。 - 本来可以放入一个数据块的行,在更新后整体行长增加了,但没有足够的可用空间来容纳更新的行。在行迁移中, 假设行可以容纳在一个新块中, Oracle 数据库将整个行移动到一个新的数据块。 已迁移行的原始行片断,包含一个指针或“转发地址”到包含已迁移行的新块。 已迁移行的 rowid 不会更改。
-
超过 255 个列的行。
Oracle 数据库在一个行片断中只能存储 255 的列。因此,如果你在具有 1000 个列的表中插入行,则数据库将创建 4 个行片断,通常会链接多个块。
图 12-13 行链接
Description of "Figure 12-13 Row Chaining"
图 12-14 行迁移
Description of "Figure 12-14 Row Migration"
另见:
-
"Row Storage"和"Rowids of Row Pieces"
-
《Oracle Database Administrator’s Guide》了解如何回收浪费的空间
-
《Oracle Database Performance Tuning Guide》了解如何减少行链接和行迁移
索引块概述
索引块是一种特殊类型的数据块,它以不同于表块的方式管理空间。Oracle数据库使用索引块管理索引中的逻辑存储空间。
索引块类型
索引包含根块、分支块和叶块。
块类型定义如下:
-
根块
此块标识索引的入口点。
-
分支块
当搜索索引键时,数据库在分支块中导航。
-
叶块
这些块包含指向相关行的索引键值行id。叶块按顺序存储键值,以便数据库能够有效地搜索键值范围内的所有行。
索引项的存储
索引项存储在索引块中的方式与数据块中的表行相同,块部分中的索引项不是按二进制顺序存储的,而是堆中存储的。
数据库管理索引块中的行目录与数据块中的目录是不同的。行目录中的条目(而不是索引块主体中的条目)是按键值排序的。例如,在行目录中,索引键000000的目录条目在索引键111111的目录条目之前,以此类推。
行目录中条目的顺序提高了索引扫描的效率。在范围扫描中,数据库必须读取范围中指定的所有索引键。数据库遍历分支块,以标识包含第一个键的叶块。因为行目录中的条目是排序的,所以数据库可以使用二分查找查找范围内的第一个索引键,然后按顺序遍历行目录中的条目,直到找到最后一个键。这样,数据库就避免读取叶块体中的所有键。
另见:
"Data Block Overhead"
重用索引块中的槽
数据库可以重复使用一个索引块内的空间。
例如,应用往列中插入了一个值, 又将其删除。当一行需要空间时,数据库可以重用被删除值以前占用的索引槽。
索引块通常比堆组织的表块具有更多的行。在一个索引块中存储多行使数据库更容易维护索引,因为它避免了存储新数据时频繁的块分割。
索引本身不能合并,尽管您可以使用一个 ALTER INDEX 语句和 REBUILD 或 COALESCE 选项手动合并索引。例如,如果用值1到500,000填充列,然后删除包含偶数的行,那么索引将包含250,000个空槽。只有当数据库能够插入适合于包含空槽的索引块的数据时,才会重用槽。
合并索引块
索引合并压缩现有的索引数据,如果重新组织释放了块,则在索引结构中保留空闲块。因此,合并不会为其他用途释放索引块,也不会导致索引重新分配块。
图 12-15 索引合并之前
Description of "Figure 12-15 Index Before Coalescing"
图 12-16 索引合并后
Description of "Figure 12-16 Index After Coalescing"
另见:
-
《Oracle Database Administrator’s Guide》了解如何合并和重新生成索引
-
《Oracle Database SQL Language Reference》了解 COALESCE 语句
扩展区概述
分配扩展区
图 12-17 段的初始扩展区
Description of "Figure 12-17 Initial Extent of a Segment"
如果初始扩展区满了,并需要更多空间时,则数据库自动为该段分配一个增量扩展区。一个增量扩展区是为该段创建的后续扩展区。
图 12-18 段的增量扩展区
Description of "Figure 12-18 Incremental Extent of a Segment"
另见:
-
"Segment Space and the High Water Mark"
-
《Oracle Database Administrator’s Guide》了解如何手动分配扩展区
释放扩展区
例如, 如果你删除了表中的所有行,但数据库不会回收数据块以供表空间中的其他对象使用。也可以使用 DBMS_SPACE_ADMIN 软件包删除段。
- 你可以使用在线段收缩来回收在段中的零碎空间。段收缩是一种在线、 就地的操作。 通常, 紧凑的数据会获得更好的缓存利用率, 且在全表扫描中只需读取更少的块。
- 将非分区表或表分区的数据移动到一个新的段,或可选地移入另一个你在其中具有配额的表空间。
-
您可以重建或合并索引。
- 您可以截断表或表簇, 这将删除所有行。默认情况下, 除了留下由 MINEXTENTS 存储参数所指定的扩展区数之外, Oracle 数据库将释放已删除行所使用的所有空间。 在数据库 11g 第 2 版 (11.2.0.2)中, 您还可以用带有 DROP ALL STORAGE 选项的 TRUNCATE 语句来删除整个段。
- 您可以释放未使用的空间, 即释放数据库段的高水位端的未使用空间, 以便供表空间中的其他段使用。
另见:
-
"Coalescing an Index Block"
-
"Undo Tablespaces"
-
"Segment Space and the High Water Mark"
-
《Oracle Database Administrator’s Guide》了解如何回收段空间
扩展区的存储参数
存储设置按如下的优先级顺序确定, 列表中较高的设置会覆盖较低的设置:
-
段存储子句
-
表空间存储子句
-
Oracle 数据库缺省值
- 对统一的扩展区,可以指定扩展区的大小,或使用默认的大小 1 MB。 表空间中的所有扩展区都是一样大小。本地管理的临时表空间只能使用这种分配类型。
- 对于自动分配的扩展区由 Oracle 数据库确定新分配扩展区的最佳大小。
另见:
-
《Oracle Database Administrator’s Guide》了解当创建本地管理表空间时的扩展区管理注意事项
-
《Oracle Database SQL Language Reference》了解存储子句中的选项
段概述
段是一个表空间内包含某个逻辑存储结构的所有数据的扩展区集合。
另见:
"Logical Space Management"了解更多关于 ASSM
用户段
在数据库中的单个数据段用于存储一个用户对象的数据。
段有不同的类型。用户段的示例包括:
-
表、 表分区、 或表簇
-
大对象或大对象分区
-
索引或索引分区
创建用户段
可以使用 DBMS_SPACE_ADMIN 包管理空对象的段。你可以使用该 PL/SQL 包执行下列操作:
-
为没有创建段的空表或分区手动实例化段
-
从空表或当前分配了空段的分区中删除段
CREATE TABLE test_table (my_column NUMBER);
如图 12-19 所示, 数据库为该表创建一个段。
图 12-19 创建用户段
Description of "Figure 12-19 Creation of a User Segment"
CREATE TABLE lob_table (my_column NUMBER PRIMARY KEY, clob_column CLOB);
图 12-20 多个网段
Description of "Figure 12-20 Multiple Segments"
当创建一个段时,数据库将分配一个或多个扩展区。由对象的存储参数确定每个段的扩展区如何分配。这些参数影响数据检索的效率, 和与该对象关联的数据段的存储。
另见:
-
"Internal LOBs"
-
"Storage Parameters for Extents"
-
《Oracle Database Administrator’s Guide》了解如何管理延迟段创建
-
《Oracle Database SQL Language Reference》关于 CREATE TABLE 的语法
临时段
为查询分配临时段
另见:
- "Overview of the Online Redo Log"
-
《Oracle Database Administrator's Guide》了解如何创建临时表空间
-
《Oracle Database SQL Language Reference》关于 CREATE TEMPORARY TABLESPACE 的语法和语义
为临时表及其索引分配临时段
Oracle 数据库也可以为临时表及其索引分配临时段。
另见:
-
"Overview of Temporary Tables"
-
《Oracle Database Administrator’s Guide》了解如何创建临时表
Undo 段
Oracle 数据库维护事务的操作记录, 统称为 undo 数据。
-
回滚一个活动事务
-
恢复一个已终止的事务
-
提供读取一致性
-
执行一些逻辑闪回操作
永久对象的 undo 数据存储在一个 undo 表空间中。Oracle 数据库提供了一个称为自动 undo 管理模式的完全自动化机制,来管理 undo 表空间中的 undo 段和空间。
数据库将 undo 数据分成两个流。临时 undo 流只封装由对临时对象的更改生成的 undo 记录,而永久撤消流只封装永久对象的 undo 记录。数据库独立地管理临时和永久 undo。撤销分离通过以下操作减少存储并提高性能:
-
使您能够配置最适合永久表和临时表的工作负载的永久表空间大小和 undo 表空间大小
-
减少写入在线 redo 日志的redo的大小
-
避免备份临时 undo 数据
在活动数据保护实例中,全局临时表上的DML需要在临时 undo 段中生成 undo。
另见:
-
"Use of the Online Redo Log"
-
"Temporary Undo Segments"
-
《Oracle Database Administrator’s Guide》了解临时 undo 段
-
《Oracle Database Reference》了解TEMP_UNDO_ENABLED初始化参数
Undo 段和事务
当事务启动时,数据库将此事务绑定到(分配给)一个撤消段,并因此也绑定到当前撤消表空间中的一个事务表。在极少数的情况下,如果数据库实例没有一个指定的撤消表空间,则该事务被绑定到系统撤消段。
图 12-21 Undo 段中的扩展区分配环
Description of "Figure 12-21 Ring of Allocated Extents in an Undo Segment "
图 12-22 Undo 段中已分配扩展区的周期性使用
Description of "Figure 12-22 Cyclical Use of Allocated Extents in an Undo Segment"
图 12-23 为 Undo 段分配新的扩展区
Description of "Figure 12-23 Allocation of a New Extent for an Undo Segment"
另见:
《Oracle Database Administrator’s Guide》了解如何管理 undo 段
事务回滚
临时 Undo 段
临时 undo 段是只用于临时 undo 数据的可选空间管理容器。
对临时表的更改的 undo 记录是特定于会话的,并且仅对读取一致性和事务回滚有用。在Oracle Database 12c之前,数据库总是将这些记录存储在联机redo日志中。由于对临时对象的更改没有记录在在线redo日志中,因此将临时对象的 undo 写入临时 undo 段可以节省在线redo日志和存档redo日志文件中的空间。数据库不记录对undo 的更改或对临时表的更改,这会提高性能。
您可以设置 TEMP_UNDO_ENABLED 初始化参数,以便临时表将 undo 数据存储在临时 undo 段中。当该参数为 TRUE 时,数据库从临时表空间分配临时 undo 段。
另见:
-
《Oracle Database Administrator’s Guide》了解临时 undo 段
-
《Oracle Database Reference》要了解 TEMP_UNDO_ENABLED 初始化参数
段空间和高水位标记
在一个 ASSM 段中的每个数据块处于以下状态之一:
-
在 HWM 之上
这些块是未格式化的, 且从未使用过。
-
在 HWM 之下
这些块处于以下状态之一:
-
已分配, 但当前未格式化且未使用
-
已格式化且包含数据
-
已格式化且为空,因为数据已被删除
-
图 12-24 在创建表时的 HWM
Description of "Figure 12-24 HWM at Table Creation"
图 12-25 HWM 和低 HWM
Description of "Figure 12-25 HWM and Low HWM"
图 12-26 HWM 和低 HWM
Description of "Figure 12-26 HWM and Low HWM"
图 12-27 推进 HWM 和低 HWM
Description of "Figure 12-27 Advancing HWM and Low HWM"
另见:
-
《Oracle Database Administrator’s Guide》了解如何在线收缩段
-
《Oracle Database SQL Language Reference》关于 TRUNCATE TABLE 的语法和语义
表空间概述
图 12-28 表空间
Description of "Figure 12-28 Tablespaces"
永久表空间
-
控制数据库数据的磁盘空间分配
-
为数据库用户分配配额 (空间限额或限制)
-
将单个表空间联机或脱机,而不影响整个数据库的可用性
-
执行单个表空间的备份和恢复
-
使用 Oracle 数据泵实用程序导入或导出应用程序数据
- 通过创建一个可传输表空间,可以将其从一个数据库复制或移动到另一个数据库,甚至跨平台通过传输表空间来移动数据,可能比导出/导入或卸载/装载相同的数据要快几个数量级,因为传输表空间只涉及复制数据文件并集成表空间元数据。当您传输表空间时,还可以移动索引数据。
另见:
-
"Oracle Data Pump Export and Import"
-
《Oracle Database Administrator’s Guide》了解如何传输表空间
-
《Oracle Database Utilities》了解 Oracle 数据泵
SYSTEM 表空间
SYSTEM 表空间包括以下信息,全部都由 SYS 用户所拥有:
-
数据字典
-
包含数据库管理信息的表和视图
-
已编译的存储对象,如触发器、 过程、 和包等
另见:
-
"Online and Offline Tablespaces"有关 SYSTEM 表空间永久在线状态的信息
-
"Tools for Database Installation and Configuration"了解 DBCA
-
《Oracle Database Administrator’s Guide》了解如何创建或迁移到本地管理的SYSTEM 表空间
-
《Oracle Database SQL Language Reference》有关 CREATE DATABASE 的语法和语义
SYSAUX 表空间
SYSAUX 表空间是 SYSTEM 表空间的一个辅助表空间。
因为 SYSAUX 是许多 Oracle 数据库特性和产品的默认表空间,这些特性和产品以前都需要自己的表空间,SYSAUX 减少了数据库所需的表空间数量。它还减少了系统表空间的负载。
另见:
《Oracle Database Administrator’s Guide》了解 SYSAUX 表空间
Undo 表空间
undo 表空间是为系统管理的 undo 数据而保留的一个本地管理表空间。
另见:
"Undo Segments"
自动 Undo 管理模式
Undo 表空间要求数据库处于默认的自动 undo 管理模式。
自动模式消除了手动管理 undo 段的复杂性。数据库自动对其进行优化,提供 undo 数据最佳可能的保留期,以满足可能需要此数据的长时间查询。
新安装的 Oracle 数据库会自动创建一个撤消表空间。早期版本的 Oracle 数据库可能不包含撤消表空间, 而是使用在手动撤消管理模式下的传统的回滚段。在升级到 Oracle 数据库 11 g 以上版本时。可以启用自动撤消管理模式,并创建一个撤消表空间。Oracle 数据库包含一个撤消顾问,可提供有助于你自动化您的撤消环境的建议。
另见:
-
《Oracle Database Administrator’s Guide》了解自动 undo 管理
-
《Oracle Database Upgrade Guide》了解如何迁移到自动撤消管理模式
自动 Undo 保留
另见:
《Oracle Database Administrator’s Guide》有关自动调整的撤消保留的更多详细信息
shadow 表空间
shadow 表空间是一个大文件表空间,用于 shadow 丢失的写保护。
shadow 表空间的用途
当I/O子系统确认块写已经完成时(即使没有发生写操作)或当块的前映像覆盖了当前映像时,数据块丢失的写操作就会发生。
未检测到的写丢失可能导致数据损坏,因为不正确的数据可以用于其他DML事务。例如,事务可以从一个表读取旧的和不正确的数据,然后根据这些数据更新数百个其他表。这样,数据损坏就会蔓延到整个数据库。
shadow 丢失写保护提供以下好处:
-
它在标准DML、SQL*Loader常规路径加载、直接路径加载和RMAN备份使用之前检测丢失的写。
-
不需要备用数据库,如Oracle数据库11g中引入的写丢失保护。
-
您可以为特定的表空间和数据文件启用 shadow 丢失写保护。您不需要跟踪所有数据。
-
您可以用另一个 shadow 表空间替换一个 shadow 表空间,以更改其配置或位置。
-
可以挂起并恢复表空间或数据文件的 shadow 丢失写保护。
-
您可以使用 ALTER DATABASE ... LOST WRITE TRACKING 语句为整个非cdb或PDB启用或禁用它。注意,PROP$表指示是否为PDB启用跟踪。
另见:
《Oracle Database SQL Language Reference》要了解更多关于丢失写入跟踪子句的信息
shadow 表空间如何工作
丢失写保护需要两个表空间:一个 shadow 表空间和一个非 shadow 表空间,shadow 表空间的块由 shadow 表空间跟踪。
下图提供了一个示例场景。表空间 TBS1 和 TBS2 中的数据文件由 shadow 表空间跟踪。只有表空间 TBS3 中的数据文件 DBF6 被 shadow 表空间跟踪。
Description of the illustration cncpt390.eps
一个跟踪数据文件映射到 shadow 表空间中的一个 shadow 区。跟踪数据文件中的每个数据块在 shadow 块中都有对应的条目。这个条目包含被跟踪数据块的SCN。当从磁盘读取被跟踪的数据块时,shadow 丢失写保护将 shadow 表空间中该块的SCN与被跟踪数据块中最近一次写入的SCN进行比较。如果 shadow 条目的 SCN 大于正在读取的数据块,则会发生写操作丢失,从而提示错误。
shadow 区的大小具有显著的额外空间,以防止自动调整数据文件的大小导致 shadow 区过大。如果手动或自动调整跟踪数据文件的大小,并且需要增加 shadow 区,那么数据库将尝试调整跟踪数据的大小。如果 shadow 表空间中没有足够的空间,那么数据库将向警报日志写入警告,并跟踪尽可能多的数据块。
另见:
《Oracle Database Administrator’s Guide》学习如何管理影子丢失写保护
shadow 表空间的用户接口
使用 ALTER DATABASE 命令启用和禁用 shadow 丢失写保护。
为了保护特定的表空间或数据文件,必须满足以下条件:
-
您必须使用 ALTER DATABASE ENABLE LOST WRITE PROTECTION 语句为整个非cdb或PDB启用了影子丢失写保护。
-
必须使用 ENABLE LOST WRITE PROTECTION 子句启用表空间或数据文件的 shadow 丢失写保护。
当启用表空间的 shadow 丢失写保护时,表空间的所有数据文件都受到保护,添加到表空间的任何数据文件也受到保护。注意,不能在临时表空间或另一个丢失的写表空间上启用丢失的写保护。
-
必须使用带 LOST WRITE PROTECTION 子句的 CREATE BIGFILE TABLESPACE 语句创建一个或多个 shadow 表空间。
Oracle 数据库自动将跟踪到的数据文件分配给特定的 shadow 表空间。您不能指定哪个 shadow 表空间用于特定的数据文件。
下面的数据字典视图监控 shadow 表空间:
-
DBA_TABLESPACES
通过查询显示哪些表空间是影子表空间。
-
DBA_DATA_FILES.LOST_WRITE_PROTECT
显示是否为数据文件启用了丢失的写保护
-
USER_TABLESPACES.LOST_WRITE_PROTECT
显示是否为特定表空间打开了丢失的写保护。DBA_DATA_FILES 不指示是否打开了表空间的写操作:您必须查看 USER_TABLESPACES。
另见:
-
"Data Corruption"
-
《Oracle Database Administrator’s Guide》学习如何管理 shadow 表空间
-
《Oracle Database SQL Language Reference》要了解CREATE TABLESPACE语句
-
《Oracle Database Reference》了解 DBA_TABLESPACES
例:配置丢失写保护
这个例子支持一组表空间的 shadow 丢失写跟踪。
在本例中,您的目标是在非cdb中保护 salestb 和 hrtbs 表空间。您还需要保护oetbs01.dbf 数据文件,并且只有这个数据文件位于oetbs表空间中。你要做的是:
-
用 SYSTEM 登录数据库。
-
创建一个 shadow 表空间如下:
CREATE BIGFILE TABLESPACE shadow_lwp1 DATAFILE 'shadow_lwp1_df' SIZE 10M LOST WRITE PROTECTION;
-
为整个数据库启用丢失的写保护,如下:
ALTER DATABASE ENABLE LOST WRITE PROTECTION;
-
为 salestb 和 hrtbs 表空间启用影子丢失写保护,如下所示:
ALTER TABLESPACE salestbs ENABLE LOST WRITE PROTECTION; ALTER TABLESPACE hrtbs ENABLE LOST WRITE PROTECTION;
-
为 oetbs01.dbf 数据文件启用 shadow 丢失写保护,如下所示:
ALTER DATABASE DATAFILE 'oetbs01.dbf' ENABLE LOST WRITE PROTECTION;
另见:
-
《Oracle Database Administrator’s Guide》学习如何管理 shadow 表空间
-
《Oracle Database SQL Language Reference》要了解 CREATE TABLESPACE 语句
临时表空间
临时表空间仅包含在会话期间存在的瞬态数据。永久模式对象不能驻留在临时表空间中。临时文件存储临时表空间数据。
共享和本地临时表空间
临时表空间要么是共享的,要么是本地的。
共享临时表空间将临时文件存储在共享磁盘上,以便所有数据库实例都可以访问临时空间。相反,本地临时表空间为每个数据库实例存储单独的、非共享的临时文件。本地临时表空间对于Oracle实际应用程序集群或Oracle Flex集群非常有用。
您可以为只读和读/写数据库实例创建本地临时表空间。当许多只读实例访问单个数据库时,本地临时表空间可以提高涉及排序、散列聚合和连接的查询的性能。优点是:
-
通过使用本地磁盘存储而不是共享磁盘存储来改进I/O性能
-
避免昂贵的跨实例临时空间管理
-
通过消除磁盘空间元数据管理来提高实例启动性能
下表比较了共享表空间和本地临时表空间的特征。
表 12-2 共享和本地临时表空间
共享临时表空间 | 本地临时表空间 |
---|---|
CREATE TEMPORARY TABLESPACE 语句创建 | CREATE LOCAL TEMPORARY TABLESPACE 语句创建 |
为数据库创建单独的临时表空间。 | 为每个数据库实例创建单独的临时表空间。FOR LEAF选项仅为只读实例创建表空间。FOR ALL选项为所有实例创建表空间,包括只读和读/写。 |
支持表空间组。 | 不支持表空间组。 |
在控制文件中存储临时文件元数据。 | 在SGA中存储与控制文件中的所有实例通用的临时文件元数据,以及特定于实例的元数据(例如,用于分配的位图、当前临时文件大小和文件状态)。 |
另见:
"Introduction to the Oracle Database Instance"
默认临时表空间
每个数据库用户帐户都分配一个默认的共享临时表空间。如果数据库包含本地临时表空间,则还为每个用户帐户分配默认的本地临时存储。
可以使用 CREATE USER 或 ALTER USER 语句为用户帐户指定不同的临时表空间。对于没有指定不同临时表空间的用户,Oracle数据库使用系统级默认临时表空间。
另见:
《Oracle Database SQL Language Reference》要了解更多关于CREATE USER语句的信息
创建默认临时表空间
创建数据库时,默认的临时存储取决于 SYSTEM 表空间是否是本地管理。
下表显示了Oracle数据库在创建数据库时如何选择默认的临时表空间。
表 12-3 创建默认临时表空间
SYSTEM 表空间是本地管理的吗? | CREATE DATABASE语句是否指定了默认的临时表空间? | 然后数据库… |
---|---|---|
是 | 是 | 使用指定的表空间作为默认值。 |
是 | 否 | 创建临时表空间。 |
否 | 是 | 使用指定的表空间作为默认值。 |
否 | 否 | 使用 SYSTEM 作为默认临时存储。数据库在告警日志中写入警告,建议使用默认的临时表空间。 |
创建数据库之后,可以使用 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE 语句更改数据库的默认临时表空间。
另见:
-
"Permanent and Temporary Data Files"
-
《Oracle Database Administrator's Guide》了解如何创建默认临时表空间
-
《Oracle Database SQL Language Reference》用于 CREATE DATABASE 和 ALTER DATABASE 的 DEFAULT TEMPORARY TABLESPACE 子句的语法
访问临时存储
如果用户分配了一个临时表空间,那么数据库首先访问它;否则,数据库将访问默认的临时表空间。在数据库为查询访问临时表空间之后,它不会切换到其他表空间。
用户查询可以访问共享存储或本地临时存储。此外,用户可以为只读实例分配一个默认的本地临时表空间,为读/写实例分配另一个默认的本地临时表空间。
对于读/写实例,数据库给予共享临时表空间更高的优先级。对于只读实例,数据库给予本地临时表空间更高的优先级。如果数据库实例是读/写的,则数据库按以下顺序搜索空间:
-
是否为用户分配了共享临时表空间?
-
是否为用户分配了本地临时表空间?
-
数据库默认临时表空间有空间吗?
如果前面任何问题的答案是yes,那么数据库将停止搜索并从指定的表空间分配空间;否则,将从数据库默认的本地临时表空间分配空间。
如果数据库实例是只读的,则数据库按以下顺序搜索空间:
-
是否为用户分配了本地临时表空间?
-
指定的数据库默认本地临时表空间是否有空间?
-
是否为用户分配了共享临时表空间?
如果前面任何问题的答案是yes,那么数据库将停止搜索并从指定的表空间分配空间;否则,将从数据库默认共享临时表空间分配空间。
表空间模式
由表空间模式确定表空间的可访问性。
读/写和只读表空间
每个表空间都处于某种写入模式,以指定是否可以对其进行写入操作。
互斥模式如下:
-
读/写模式
用户可以读取和写入表空间。所有表空间最初都被创建为可读/写的。 SYSTEM、SYSAUX 表空间、和临时表空间总是可读/写的,也就是不能将它们置为只读。
-
只读模式
对表空间中数据文件的写操作被禁止。只读表空间可以驻留在只读介质上,如 DVD 或 WORM 驱动器。只读表空间消除了对数据库中大型的静态部分执行备份和恢复的需要。只读表空间不会变更,因此不需要重复的备份。如果在介质故障后恢复一个数据库, 则不需要恢复只读表空间。
另见:
-
《Oracle Database Administrator’s Guide》了解如何将表空间更改为只读或读/写模式
-
《Oracle Database SQL Language Reference》关于 ALTER TABLESPACE 的语法和语义
-
《Oracle Database Backup and Recovery User’s Guide》关于恢复的详细信息
联机和脱机表空间
当一个表空间进入脱机状态时,数据库执行以下任务:
- 数据库不允许后续 DML 语句引用脱机表空间中的对象。脱机的表空间无法被除 Oracle 数据库之外的任何其它实用程序读取或编辑。
- 活动事务中的某些已完成的语句,曾引用了脱机表空间中的数据,这些事务在事务级别不受影响。
- 数据库将那些已完成语句相应的撤消数据, 保存在 SYSTEM 表空间中的延迟撤消段中。 当表空间被联机时, 数据库在必要时将撤消数据应用到该表空间。
另见:
-
"Online and Offline Data Files"
-
"Database Writer Process (DBW)"
-
《Oracle Database Administrator’s Guide》了解如何更改表空间的可用性
表空间文件大小
区别如下:
- 小文件表空间可以包含多个数据文件或临时文件,但其文件不能像大文件表空间中的文件那么大。这是默认的表空间类型。
- 大文件表空间仅包含一个非常大的数据文件或临时文件。这种类型的表空间可以:
-
提高数据库的存储容量
数据库中的数据文件的最大数量有限,所以增加每个数据文件的大小也就增加了总的存储量。
-
减轻管理过多数据文件和临时文件的负担
大文件表空间使用 Oracle 管理的文件和自动存储管理 (Oracle ASM),通过消除添加新文件和处理多个文件的需要, 简化了文件管理。 -
在表空间上(而不是在单个文件上) 执行操作
大文件表空间将表空间作为磁盘空间管理、 备份和恢复等的主要单位。
大文件表空间只支持使用 ASSM 的本地管理表空间。然而,本地管理的撤消和临时表空间, 即便在手动段管理模式下,仍然可以是大文件表空间。 -
另见:
-
"Backup and Recovery"
-
《Oracle Database Administrator’s Guide》了解如何管理大文件表空间