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;
Oracle 存储结构三的更多相关文章
- Oracle 存储结构
数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...
- oracle存储结构
数据库的物理存储结构 select * from v$datafile; 数据库的逻辑存储结构,从表空间开始查起一个数据库对象的逻辑存储结构如下表空间-段-区-块 select * from dba_ ...
- Oracle存储结构-表空间
表空间 oracle文件注意的问题 控制文件,redolog文件,数据文件----一定要放在存储上 问题:银行用户,集群切换失败,原因是数据库中部分的文件未放到存储上 存储三种组织形式:文件系统.AS ...
- Oracle 存储结构一
了解块中表行数据的存储 Oracle数据存储模型 逻辑结构在左,物理结构在右 有一个关系使用虚线绘制,表示段与数据文件的多对多关系.之所以使用虚线表示关系,是因为这种多对多关系不应存在. 表空间实体消 ...
- Oracle 存储结构二
创建和管理表空间 创建表空间 典型语句: CREATE SMALLFILE TABLESPACE "JWTS" DATAFILE '/u01/app/oracle/oradata/ ...
- Oracle存储结构-段区块
段 一个段建立以后首先会分配一个区,区中包括含8个块,这时执行insert插入数据,当这个区写满后,会在分配一个区 1.一个段建立以后,Oracle如何给段分配区? 2.段分配到区以后,有了空闲空间, ...
- Oracle 逻辑存储结构
一.总述 逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构.逻辑存储结构是从逻辑的角度分析数据库的组成,是对数据存储结构在逻辑概念上的划分 ...
- 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构
目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...
- Oracle存储——逻辑结构
Oracle 数存储——物理结构 Oracle存储结构:物理结构+逻辑结构 Oracle 数据库存储逻辑结构 Oracle Schema Objects(Schema Object Storage A ...
随机推荐
- 用java访问Oracle数据库、取得记录并输出到界面
Class.forName(“oracle.jdbc.driver.OracleDriver”);Connection conn=DriverManager.getConnection( url , ...
- MongoDB 投影
mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.例如一个文档有5个字段,只需要显示其中3个 find() 方法 在MongoDB中,当执行find()方法,那么它会显示一个文 ...
- Oql实体转自定义对象
返回单体: GroupEnvironmentDTO 是自定义的一个DTO, GroupEnvironmentEntity.MapToPOCO(dto); 把上述查出来的对象转换为DTO 返回实体集合 ...
- arcgis for js/flex/sl 该选哪一个?
arcgis server开发webgis 在客户端有3种选择:js.flex.sl 他们除了开发arcgis外,本身还有一些常用的领域 js:在传统网站中很常用 flex:游戏.视频播放.动画特效 ...
- 【转】c++ http下载文件
#include <afx.h> #include <afxinet.h> #define RECVPACK_SIZE 2048 bool DownloadSaveFiles( ...
- C# 平台问题
最近在C#项目中嵌入一个视频软件Ffplayer,出现报错现象,提示平台开发视频.dll文件的兼容性和加载格式不正确的问题.最终查看是由于项目平台选择的是Any CPU和X86的引起的.目标平台有什么 ...
- C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
C# 在调用C++dll时,可能会出现 :试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B)这个错误. 一般情况下是C#目标平台跟C++dll不兼容,64位跟32位兼容性问 ...
- 打通版微社区(1):PHP环境部署 for DZX3.2
写在前面:本文参考了http://blog.sina.com.cn/s/blog_513be2630101linz.html非常感谢博主此文对我此次操作帮助很大.PHP的windows部署方案主要分为 ...
- Druid学习---配置_DruidDataSource参考配置
[更多参考]https://www.cnblogs.com/niejunlei/p/5977895.html 配置_DruidDataSource参考配置 以下是一个参考的连接池配置: <bea ...
- zbrush书法文字硬边雕刻
方法的重点在与边缘环的操作以及模型网格的数量. 1.通过ZAppLink功能可以把制作的文字书法映射到模型上去. 2.遮罩,按照颜色强度遮罩. 3.分组,按照颜色分组.单独显示文字部分的分组.按Ctr ...