Oracle 存储结构三

Oracle数据库服务器自动管理空间的方法

段空间的分配

空间以区间的形式分配给段,区间是一组连续的Oracle块。每个数据文件都有一个位图,来描述文件中块的状态,块可能是空闲的,也可能是区间中已分配给段的一部分。段被填满,需要扩展时,Oracle会搜索表空间文件的位图中的空闲空间,选择一个文件,修改位图,创建合适大小的一个新区间。接着,该区间就可以分配给段了。

段是对象的容器,但两者并不相同。没有段,对象也可以存在。如果先创建段,它至少有一个区间——但一些对象可以在没有段的情况下存在。

实例参数DEFERRED_SEGMENT_CREATION,它默认为TRUE,这个参数告诉Oracle不要创建段,除非对象实际包含一些数据。在创建表时,只创建描述表的数据字典机构。使用CREATE TABLE语句的SEGMENT CREATION子句可以控制这种行为,覆盖参数设置。

内部用户如SYS或SYSTEM创建对象时,会立即创建段。无论该参数设置是什么,尝试以SYS的身份使用SEGMENT CREATION DEFERRED子句,会返回一个错误。

自动管理段空间

表段在一个或多个区间中包含多个块。尝试把行插入表中时,Oracle必须做出决定:行应该放在哪个块中?这是由位图决定的,位图反映了段中的每个块有多满。

一些Oracle数据类型(主要是VARCHAR2)是变长度的。因此,执行UPDATE语句,以扩展VARCHAR2或填充以前是NULL的列时,行就会变大。于是需要块中更多的空间。

默认情况下,Oracle会保留一个块的10%空间,以扩展行。这是段的PCTFREE(percent free)设置,它在创建段时设置(但以后可以修改)。如果一个块的使用超出了段的PCTFREE设置,就由Automatic Segment Space Management(ASSM)位图归类为FULL,因此,即使该块实际上仍有一些空闲空间,也不能用于插入。所以,如果块中的行在其生命周期中平均增长不超过10%,就没有问题:行的新版本会有足够的空间可用。如果行的扩展比较显著,块中没有足够的空间容纳它,它就必须移到有足够空间的块中。这称为行迁移。行迁移有UPDATE语句导致。INSERT和DELETE从来不会导致行迁移。

迁移行时,会把行从它所在的块中删除,再把它插入有足够空间的另一个块。行的ROWID没有改变。ROWID仍指向原来的块,而该块现在仅存储了行的“转发地址”。转发地址是行移入的块的地址。

使用压缩节省空间

压缩有各种形式,其中一些需要独立的许可:Advanced Compression选项。

压缩类型在创建表时确定。压缩可以在创建后添加或删除,但这种变更不会影响已有的行。

积极监控和管理表空间的使用

数据库通过服务器报警系统自动监控表空间的使用。除了报警系统之外,Oracle维护着表空的使用历史。这存储在Automatic Workload Repository(AWR)中,所收集的信息作为AWR快照(有可管理的监控(MMON)进程创建)的一部分。可以在DBA_HIST_TBSPC_SPACE_USAGE视图中看到这些信息。

使用Segment Advisor

Segment Advisor(段顾问)尝试生成建议,以重新组织段,来回收空间。它会考虑AWR中的数据和对象的当前状态,,提供的建议基于对象的取样分析和历史信息,以预测未来的增长趋势。Segment Advisor默认为每晚运行为自动调度的任务。自动任务不会尝试分析每个段,而是选择满足如下标准的段:

  • 表空间中超过空间使用阈值的段
  • 最优活力的段
  • 增长率最高的段

要查看自动任务的结果,可以使用DBMS_SPACE_ASA_RECOMMENDATIONS函数。这个函数返回一个包含最后一次运行结果的表。

使用段收缩功能从表和索引中回收浪费了的空间

如果删除了一行,其在块中占用的空间可在插入另一行时重用。不过,对表进行操作的性质可能造成表中大量空间的浪费。可用MOVE操作进行回收:在MOVE之后,所有块将连续地填满新近重插入的行。但在MOVE操作时,锁定表,并且必须重新生成所有索引。对于许多环境来说,不可能使用MOVE命令来重组表。SHRINK命令避免了这些问题。它可以在不影响最终用户的情况下运行。限制就是表的表空间必须创建为使用自动段空间管理。表空间中使用旧空闲列表结束管理端控件使用的表不能收缩,因为(与新的位图方法不同)空闲列表并不包括Oracle用于计算块实际有多满所需的信息。、

表收缩的底层实现是通过匹配的INSERT和DELETE操作,将块中的行从表的末尾重新定位表的开始。然后当所有可能的移动完成后,将表的高水位线降至最后使用的块,释放该点上的所有空间。有两个不同的阶段:压缩阶段通过生成撤销和重做数据的DML将行移入一系列小事务中,并使用行锁定。第二阶段是DDL命令。和任何DDL命令一样,这是个针对数据字典的事务:它几乎瞬时执行,但要求短暂的表锁定。最后一步常常称为“重新定位段的高水位线(HWM)”。

表收缩操作生成撤销和重做数据。索引得到维护,因为收缩实现为一组DML事务。在压缩期间没有表锁定,但在移动单独行时将锁定它们。

SHRINK SPACE命令的语法如下:

ALTER TABLE <TABLE NAME> SHRINK SPACE [COMPACT] [CASCADE];

使用关键字COMPACT执行第一阶段,但不是第二阶段:重新定位行,但并不从段中释放空间。使用它的原因是,尽管可以在正常运行时间进行压缩(在大型表上要花很长时间完成),但很可能DDL最终会因为与其他事务并发而挂起,还使库缓存中解析了的SQL无效。因此,有必要首先用COMPACT关键字收缩表,然后在维护时不使用COMPACT:其速度将是很快的,因为已经压缩过。CASCADE关键字指示Oracle也收缩依赖对象,如索引。

SHRINK SPACE COMPACT命令充足段的内容,但不返回空间给表空间。

在收缩表前,必须对表启用行移动:

ALTER TABLE <table name> ENABLE ROW MOVEMENT;

启用行移动时必要的,因为操作的性质以为着将改变ROWID。相同的行(主键不变)将在不同的物理位置,因此有一个不同的ROWID。这是Oracle所不允许的,除非启用了行移动。

表必须位于采用自动段空间管理功能和启用了行移动的表空间中,否则不能收缩。如果不满足这些条件,MOVE就是重组表的唯一方式。

管理可恢复空间的分配

 许多操作会因为空间不够而失败。这通常显示为不能在段中添加另一个区间,有几个原因:数据文件已满;自动扩展的数据文件或临时文件在已满的磁盘上;撤销段在已满的撤销表空间中;需要临时空间的操作在使用已满的临时表空间;或者用户到达了表空间上的配额限制。

如果启用可恢复空间分配,当操作遇到(任何)空间问题而不是因为错误而失败(在许多情况下,回滚已做的工作)时,操作将暂停。对于用户来说,这将显示为会话挂起。当错误得到解决时,它将继续。所有挂起的会话(当前挂起和之前挂起的但现在再次运行的)列在视图DBA_RESUMABLE中。

要在会话级别启用可恢复空间分配:

ALTER SESSION ENABLE RESUMABLE [ TIMEOUT <seconds> ];

TIMEOUT选项用于指定语句将挂起多长时间。如果到达这个时间,但问题没有解决,那么将返回错误并且语句失败。

也可以通过设置一个实例参数,为所有会话启用可恢复空间。这是一个动态的参数。

alter system set resumable_timeout=60;

 

posted @ 2019-04-10 09:28  赵春义  阅读(261)  评论(0编辑  收藏  举报