ORACLE数据库存储结构

时间:2022-03-31 06:45:25

ORACLE数据库存储结构

一、数据块

Oracle对数据库数据文件中的存储空间进行管理的单位是数据块。数据块是数据库中最小的(逻辑)数据单位,是最小的I/O单位。与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节。每种操作系统都有一个被称为块容量的参数。Oracle每次获取数据时,总是访问整个数据块,而不是按照操作系统块的容量访问数据。数据块容量应该设为操作系统块容量的整数倍,以便减少不必要的I/O操作,一般数据块大小为8k。

结构:

ORACLE数据库存储结构

头部:(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:数据库中行的全局唯一地址。

ORACLE数据库存储结构

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文件介绍

数据库至少包含:控制文件、数据文件、联机重做日志文件。这三类文件,最好能放在存储上。

控制文件:

参数:control_files。建议三个文件放置在不同的目录下。

控制文件在Oracle数据库中扮演着很重要的角色,没有控制文件(或者控制文件损坏了),运行着的实例立即崩溃。可以说,控制文件一旦损坏,数据库必然down了。Oracle数据库实例启动过程中,当启动到unmount时,此时只是在内存中为Oracle实例分配了实例空间,然后如果继续要启动到mount状态,这个时候控制文件就闪亮登场了,因为Oracle要依据控制文件找到数据文件跟重做日志文件的路径,确定找到了再进去mount状态。

控制文件的内容包括重做日志文件、数据库的名称、数据库创建信息、表空间信息、数据文件的状态、日志文件信息、备份信息、检查点信息等

控制文件是一个2进制文件,不可以直接通过文本编辑器进行编写,这个文件由Oracle自己进行维护,Oracle建议控制文件至少有两份冗余,并且放在不同的磁盘中。

从数据库可以查询到控制文件的位置,一般3个控制文件,都是一样,属于复用的关系。最好放到不同的目录下。

参数文件:spfile。启动的时候,会读取。但是运行过程中不会关闭。文件损坏了,oracle也不会奔溃。spfile动态参数文件,是二进制文件,不可以直接用记事本等等程序做修改,可以用ALTER命令做修改,不用重起数据库也能生效。

备份文件:离线文件,主要是备份数据文件、控制文件、参数文件和日志文件。不能放在存储上。一般放在带库(用于海量数据离线存储和备份的设备)上。

归档日志文件:占用空间很大,但是不能放在存储上。存储很容易出问题,由于数据文件再存储上,所以,容易丢数据。

预警和跟踪日志文件:bdump/alert_数据库名.log 重大事件汇总。

udump 里面是记录server_process出问题的日志文件。

查看oracle是否出现问题。oracle问题诊断的入口。