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;

Oracle 存储结构三的更多相关文章

  1. Oracle 存储结构

    数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...

  2. oracle存储结构

    数据库的物理存储结构 select * from v$datafile; 数据库的逻辑存储结构,从表空间开始查起一个数据库对象的逻辑存储结构如下表空间-段-区-块 select * from dba_ ...

  3. Oracle存储结构-表空间

    表空间 oracle文件注意的问题 控制文件,redolog文件,数据文件----一定要放在存储上 问题:银行用户,集群切换失败,原因是数据库中部分的文件未放到存储上 存储三种组织形式:文件系统.AS ...

  4. Oracle 存储结构一

    了解块中表行数据的存储 Oracle数据存储模型 逻辑结构在左,物理结构在右 有一个关系使用虚线绘制,表示段与数据文件的多对多关系.之所以使用虚线表示关系,是因为这种多对多关系不应存在. 表空间实体消 ...

  5. Oracle 存储结构二

    创建和管理表空间 创建表空间 典型语句: CREATE SMALLFILE TABLESPACE "JWTS" DATAFILE '/u01/app/oracle/oradata/ ...

  6. Oracle存储结构-段区块

    段 一个段建立以后首先会分配一个区,区中包括含8个块,这时执行insert插入数据,当这个区写满后,会在分配一个区 1.一个段建立以后,Oracle如何给段分配区? 2.段分配到区以后,有了空闲空间, ...

  7. Oracle 逻辑存储结构

    一.总述 逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构.逻辑存储结构是从逻辑的角度分析数据库的组成,是对数据存储结构在逻辑概念上的划分 ...

  8. 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构

    目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...

  9. Oracle存储——逻辑结构

    Oracle 数存储——物理结构 Oracle存储结构:物理结构+逻辑结构 Oracle 数据库存储逻辑结构 Oracle Schema Objects(Schema Object Storage A ...

随机推荐

  1. 利用PHP QR Code生成二维码(带logo)

    转自:http://www.cnblogs.com/txw1958/p/phpqrcode.html HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示 ...

  2. Android架构设计之插件化、组件化

    如今移动app市场已经是百花齐放,其中有不乏有很多大型公司.巨型公司都是通过app创业发展起来的:app类型更加丰富,有电子商务.有视频.有社交.有工具等等,基本上涵盖了各行各业每个角落,为了更加具有 ...

  3. 系统测试用例评审checklist

    规则要素内容 使用范围 审查结果 “否”的理由 “免”的理由 规则 建议 是 否 免 规范性规则               用例是否按照公司规定的模板进行编写?  √             用例的 ...

  4. No enum constant org.apache.ibatis.type.JdbcType.Integer

    同事今天在用mybatis查询时候,报了上面这个问题.上网查了下,原来是mybatis封装类型的问题.原因是在resultMap中jdbcType写为了Integer,但是在MyBatis中没有这个数 ...

  5. Android浮动按钮

    https://www.jianshu.com/p/18cbc862ba7b https://github.com/yhaolpz/FloatWindow 这样就解决了切换 Activity 时悬浮控 ...

  6. git操作合集

    目录 安装 下载 本地配置 创建用户凭证ssh 忽略文件 基础操作 新建仓库 克隆仓库 获取更新 推送更新 查看历史 版本回退 分支 别名 linux服务器 疑难问题 清除历史大文件 安装 下载 下载 ...

  7. Avalon探索之旅

    avalon2是一款基于虚拟DOM与属性劫持的 迷你. 易用. 高性能 的 前端MVVM框架, 拥有超优秀的兼容性, 支持移动开发, 后端渲染, WEB Component式组件开发, 无需编译, 开 ...

  8. Excel VBA Range对象基本操作应用示例

    [示例01] 赋值给某单元格[示例01-01] Sub test1()Worksheets("Sheet1").Range("A5").Value = 22Ms ...

  9. 为什么java中只允许继承一个类?

      一个类只能继承一个其他的类 在Java语言中禁止多重继承:一个类可以具有多个直接父类.多重继承不合法的原因是容易引发意义不明确.例如,有一个类C,如果允许它同时继承A类与B类(class C ex ...

  10. wind10优化

    windows10启动优化 启动时: 1)关闭windows自动更新 2)关闭windows防火墙 3)关闭Windows Defender (1)使用快捷键(WIN+R)调出运行工具,然后再输入组策 ...