标签:
一、数据块
Oracle对数据库数据文件中的存储空间进行管理的单位是数据块。数据块是数据库中最小的(逻辑)数据单位,是最小的I/O单位。与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节。每种操作系统都有一个被称为块容量的参数。Oracle每次获取数据时,总是访问整个数据块,而不是按照操作系统块的容量访问数据。数据块容量应该设为操作系统块容量的整数倍,以便减少不必要的I/O操作,一般数据块大小为8k。
结构:
头部:(1)块的物理地址 (2)块的段信息、表空间信息 (3) 事物槽 (4)行目录:记录每一行的起始位置
数据:从块最后的位置开始存储,成S行连接。行信息:锁信息 列宽 列值 列宽 列值。下一行的锁信息 列宽 列值 列宽 列值。
事物槽ITL:用来记录该块所有发生的事务,一个itl可以看作是一条事务记录。当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位。如果一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回滚段的入口,事务类型等等。如果这个事务已经提交,那么,itl槽位中还保存的有这个事务提交时候的SCN号。
PCT-FREE : PCTFREE 参数用来设置一个数据块(data block)中至少需要保留(reserve)多少可用空间(百分比值),为数据块中已有数据更新时可能发生的数据量增长做准备。
PCTUSED:PCTUSED 参数用于决定一个数据块(data block)是否可被用于插入新数据,她的依据是数据区(row data)与数据块头(overhead)的容量之和占数据块全部容量的最大百分比。当一个数据块中的可用空间比例小于 PCTFREE 参数的规定时,Oracle就认为此数据块无法被用于插入新数据,直到数据块中的占用容量比例小于 PCTUSED 参数的限定。
为什么会有PCT-FREE呢,因为更新块中的数据的时候,可能会使行信息变大,占用更多的空间。如果不预留一定的空间,就会导致大量的行记录分布在不同的块中,从而导致访问一行记录,需要访问多个块,降低oracle的效率。从效率上考虑,oracle一般不允许一条记录分布在不同的块。
行迁移:当update操作时,行占用的空间增大,导致行跨块时,将整行移出,放置在一个新块,将新块的地址放入当前位置。
行迁移大部分是由于PCT_FREE空间过小导致。也可以通过重建表来优化数据。
行链接:当一行数据被插入时一个数据块就无法容纳。在这种情况下Oracle将这行数据存储在段内的一个数据块链中,这种是无法避免的。所以,平常建表时,不能将一个表的字段设置过多,容易导致行连接多,从而降低数据库的效率。
ROWID:数据库中行的全局唯一地址。
rowid值主要包含以下信息:
(1)对象的数据对象编号 对象段编号
数据段编号和对象编号的区别:当一个表的物理位置发生改变时,数据段编号会发生改变。对象编号不会发生改变。
当段中的数据被truncate时,Truncate过程是在system表空间中重建一个数据段,原来的数据段弃用。所以会非常快且数据段编号也会发生改变。
凡是ddl发生时,不涉及到修改数据,只涉及到原数据(SYSTEM表空间中的数据)。Drop表之后为什么可以很快闪回,因为就是更改了元数据,所以很快就能找回。
(2)该行所在的数据文件中的数据块
(3)该行中数据块的位置(第一行是0)
(4)数据行所在的数据文件(第一个文件是1)。该文件编号是相对于表空间。
通常来说,一个rowid值唯一标识数据中的一行。而且,rowid能记录数据行的物理位置信息,所以,无论是用来查询还是更新,都能非常快。
二、数据区
数据扩展是由一组连续的数据块构成的数据库逻辑存储分配单位。是数据库给段分配空间的最小单位。当用户创建数据表时,Oracle为此表的数据段分配一个包含若干数据块的初始数据扩展。虽然此时数据表中还没有数据,但是在此初始数据扩展中的数据块已经为插入新数据做好了准备。
如果一个段的 初始区中的数据块都已装满,且有新数据插入需要空间时,Oracle自动为这个段分配一个增量数据扩展。增量数据扩展 是一个段中继已有数据扩展之后分配的后续数据扩展,她的容量大于或等于之前的数据扩展 。
为了管理的需要,每个段的段头中包含一个记录此段所有数据扩展的目录。
用户可以在 CREATE TABLE 语句中使用 STORAGE 子句设定存储参数,决定创建表时为其数据段(data segment)分配多少初始空间,或限定一个表最多可以包含多少数据扩展。
本地管理的表空间通过数据块头的位图查找数据文件中的可用空间
数据区何时被回收:
1、表,簇表的所有者(owner)或拥有 DELETE ANY 权限的用户, 可以使用 TRUNCATE...DROP STORAGE 语句将表,簇表的数据清除
2、DBA 可以使用以下语法收回一个段中未使用的数据扩展:
ALTER TABLE table_name DEALLOCATE UNUSED;
3、如果用户为回滚段(rollback segment)设定了 OPTIMAL 参数,Oracle将周期性地从其中回收数据扩展。
当数据扩展(extent)被释放后,Oracle修改数据文件中的位图(对于本地管理的表空间)或更新数据字典(对于数据字典管理的表空间),将回收的数据扩展视为可用空间。被释放的数据扩展中的数据无法继续访问。
只要用户没有移除(drop)或清空(truncate)非簇表,那么对应数据段内的任何数据块都不会被回收。Oracle会在插入数据时使用这些数据块(只要数据块有足够的空间)。即使用户删除(delete)了表的所有行,Oracle也不会回收此表的数据块供表空间内的其他方案对象使用。这就是形成高水位线的原因。
三、数据段
数据段是与数据库对象相对应,一般一个数据库对象对应一个数据段。多个extent是对应一个数据段,每个数据段实际上就是数据库一个对象的代表。数据表、索引、回滚、聚集这些都是数据段的一种表现形式。同时,数据段是在数据对象创建的时候就已经创建出来,随着对象体积的增大,而不断分配多个extents进行管理。
通俗的讲,一般情况下,一个表为一个段。如果表分区了,一个表分区是一个段。其他还有索引段,索引分区段。二进制大对象段BLOB。
高水位线:
所有的oracle段都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。
高水位线的危害:
1:全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
2:即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。
降低高水位线操作:
1:执行表重建指令
2:执行alter table table_name shrink space;
3:复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
4:truncate
四、表空间
由一个或者多个物理数据文件组成。建表时,将表建在表空间上。
系统默认表空间:
SYSTEM表空间:存放ORACLE数据字典等。数据库创建的PL/SQL程序单元同样也储在system表空间.Oracle建义在system表空间中除了创建数据字典之外不要再创建任何其它对象。
SYSTEMAUX表空间:为system表空间的辅助表空间。10g版本中增加了另一个强制的表空间SYSAUX,它包含一些以前位于system表空间中的对象,并且集中存储支持oracle特性(例如LogMiner、UltraSearch和DataMining)的对象,这些对象提供了新的视图v$sysaux_occupants,其中显示了每个组件使用的空间数量以及oracle提供的存储过程的名称,可以使用这些存储过程将对象移入和移出SYSAUX表空间。
UNDO表空间:undo表空间中会自动分配undo段,这些undo段用来保存事务中的DML语句的undo信息,也就是来保存数据在被修改之前的值。在rollback,实例恢复(前滚),一致性读CR块的构造时会使用到undo信息。由于undo的引入,从而Oracle的select语句实现一致性读时,不需要任何锁。
undo表空间和其它表空间有很多类似的地方:undo数据块也会被读到buffer cache缓存起来,修改时也会产生redo log,数据也会写回到undo表空间的磁盘上。所以崩溃后,undo块的buffer cache也会恢复过来。
TEMP表空间:临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。
临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志。
创建临时表空间或临时表空间添加临时数据文件时,即使临时数据文件很大,添加过程也相当快。这是因为ORACLE的临时数据文件是一类特殊的数据文件:稀疏文件(Sparse File),当临时表空间文件创建时,它只会写入文件头部和最后块信息。它的空间是延后分配的.这就是创建临时表空间或给临时表空间添加数据文件飞快的原因。
会话级临时表: 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断(truncate table,即数据清空)了。
事务级临时表:是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。
会话级临时表采用on commit preserve rows;而事务级则采用on commit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commit、rollback或者是会话结束,临时表中的数据都将被截断。
五、SCHEME(owner)
通俗来讲,对应用户。在数据库的结构中,一个数据库有多个用户。一个用户由多个段组成。一个数据库有多个表空间,一个表空间也由多个段组成。
六、ORCALE文件介绍
数据库至少包含:控制文件、数据文件、联机重做日志文件。这三类文件,最好能放在存储上。
控制文件:控制文件在Oracle数据库中扮演着很重要的角色,没有控制文件(或者控制文件损坏了),运行着的实例立即崩溃。可以说,控制文件一旦损坏,数据库必然down了。Oracle数据库实例启动过程中,当启动到unmount时,此时只是在内存中为Oracle实例分配了实例空间,然后如果继续要启动到mount状态,这个时候控制文件就闪亮登场了,因为Oracle要依据控制文件找到数据文件跟重做日志文件的路径,确定找到了再进去mount状态。
控制文件的内容包括重做日志文件、数据库的名称、数据库创建信息、表空间信息、数据文件的状态、日志文件信息、备份信息、检查点信息等
控制文件是一个2进制文件,不可以直接通过文本编辑器进行编写,这个文件由Oracle自己进行维护,Oracle建议控制文件至少有两份冗余,并且放在不同的磁盘中。
从数据库可以查询到控制文件的位置,一般3个控制文件,都是一样,属于复用的关系。最好放到不同的目录下。
参数文件:spfile。启动的时候,会读取。但是运行过程中不会关闭。文件损坏了,oracle也不会奔溃。spfile动态参数文件,是二进制文件,不可以直接用记事本等等程序做修改,可以用ALTER命令做修改,不用重起数据库也能生效。
备份文件:离线文件,主要是备份数据文件、控制文件、参数文件和日志文件。不能放在存储上。一般放在带库(用于海量数据离线存储和备份的设备)上。
归档日志文件:占用空间很大,但是不能放在存储上。存储很容易出问题,由于数据文件再存储上,所以,容易丢数据。
预警和跟踪日志文件:bdump/alert_数据库名.log 查看oracle是否出现问题。oracle问题诊断的入口。
标签:
原文地址:http://www.cnblogs.com/ironyoda/p/5533772.html