物理存储结构
Oracle的物理存储大致分为三种:数据文件(.DBF)、日志文件(.LOG)和控制文件(.CTL)
数据文件
每一个ORACLE数据库有一个或多个物理的数据文件。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征:
- 一个数据文件仅与一个数据库联系
- 一旦建立,数据文件不能改变大小
- 一个表空间(tablespace,数据库存储的逻辑单位)由一个或多个数据文件组成。
数据文件中的数据在需要时可以读取并存储在ORACLE内存存储区中。例如:用户要存取数据库某张表的某些数据,如果请求信息不在数据库的内存存储区内,则从相应的数据文件中读取并存储在内存。当修改和插入新数据时,也不必立刻写入数据文件。为了减少磁盘输出的总数,提高性能,数据存储在内存,然后由ORACLE后台进程DBWR决定如何将其写入到相应的数据文件。
控制文件
每一ORACLE数据库有一个控制文件,它记录数据库的物理结构,包含下列信息类型:
- 数据库名
- 数据库数据文件和日志文件的名字和位置
- 数据库建立日期
为了安全起见,允许控制文件被镜象。
每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
日志文件
每一个数据库有两个或多个日志文件的组,每一个日志文件组用于收集数据库日志。日志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在日志中。在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。
日志文件主要是保护数据库以防止故障。为了防止日志文件本身的故障,ORACLE允许镜象日志,即可在不同磁盘上维护两个或多个日志副本。
日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。然而任何丢失的数据在下一次数据库打开时,ORACLE自动地应用日志文件中的信息来恢复数据库数据文件。
日志文件包括两种:
- 联机日志文件:用来循环记录数据库改变的操作系统文件
- 归档日志文件:联机日志文件的备份。为避免联机日志文件重写时丢失重复数据。Oracle有两种归档日志模式,Oracle数据库可以采用其中任何一种模式:
- NOARCHIVELOG:不对日志文件进行归档。这种模式可以大大减少数据库备份的开销,但可能会导致数据的不可恢复。
- ARCHIVELOG:在这种模式下,当Oracle转向一个新的日志文件时,将以前的日志文件进行归档。为了防止出现历史“缺口”的情况,一个给定的日志文件在它成功归档之前是不能重新使用的。归档的日志文件,加上联机日志文件,为数据库的所有改变提供了完整的历史信息。
逻辑存储结构
Oracle的逻辑结构类型按照尺寸从小到大分可分为 :块(block) 、 区(extent) 、 段(segment) 、 表空间(tablespace) 、 数据库(database)
块
- 块是Oracle用来管理存储的最小单元,也是最小的逻辑存储结构
- Oracle数据库在进行输入输出时,都是以块为单位进行读写操作的
- 新建表空间时可以指定块的大小
- 块一般设置为操作系统数据块容量的整数倍
- 块的默认大小为8kb(8192=1024×8)
SQL> show parameter db_block_size; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_size integer 8192
块的结构:
- 头部信息区:负责管理开销,但是不存放数据,存放的是整个块的引导信息,引导系统读取数据。
- 数据块头:记录块的地址和该数据块所属的段的的类型
- 表目录区:记录插入数据所属表的信息
- 行目录区:存放插入行的地址、ROWID等
- 空闲空间: 主要包含空闲空间和已经使用的空间 。 Oracle主要是通过下面的两个参数对这部分空间进行管理,这两个参数既可以在表空间级别进行设置,也可以在段级别进行设置。段级别的设置优先级更高。
- PCTFREE:指定块中必须保留的最小空闲空间比例。当块中的空闲存储空间减少到PCTFREE所设置的比例时,Oracle将块标记为不可用状态,新的数据行将不能被加入到这个块。
- PCTUSED:指定的一个百分比参数,当块中已经使用的存储空间降低到这个百分比之下时,这个块才被重新标记为可用状态。
- 数据空间:存储具体行的信息或索引的信息,占据了块的绝大多数空间。
常见的块的类型:
SQL> select distinct segment_type from dba_segments;//当前所有使用的块的类型
SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE SUBPARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO
12 rows selected
区
- 区是Oracle数据库分配空间的最小单位
- 区是由一组连续的块构成的,由一个或多个块组成
- 一个或多个区构成一个段,当段中所有空间被使用完后,Oracle会自动为该段分配一个新的区
段
- 由多个区组成,这些区可以是连续的,也可以是不连续的
- 当用户在数据库中创建各种具有实际存储结构的对象时(保存有数据的对象),比如表、索引等,Oracle将为这些对象创建“段”
- 一般一个对象只拥有一个段
段的类型:
- 数据段:保存表中的记录
- 索引段:索引中的索引条目
- 临时段:在执行查询等操作时,Oracle可能会需要使用到一些临时存储空间,用于临时保存解析过的查询语句以及在排序过程中产生的临时数据
- 回滚段:保存回滚数据
- …
表空间
- 表空间是Oracle数据库的最大逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象
- 一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间
- 表空间的大小等于所有从属于它的数据文件大小的总和
- 一个数据库是由多个表空间组成的
- 在创建数据库时会自动创建一些默认的表空间,例如 SYSTEM表空间,SYSAUX表空间等
表空间的类型:
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
- 系统表空间(SYSTEM<主>、SYSAUX<辅>):默认的表空间,用于保存数据字典(一组保存数据库自身信息的内部系统表和视图,及用于Oracle内部使用的其他一些对象),保存所有的PL/SQL程序的源代码和解析代码,包括存储过程和函数、包、数据库触发器等,保存数据库对象(表、视图、序列)的定义
- 回滚表空间(UNDOTBS1):用于存放回滚段,每个实例最多只能使用一个回滚表空间
- 临时表空间(TEMP):存储SQL执行过程中产生的临时数据
- 用户表空间(USERS):用于存储用户数据的普通表空间等,保存数据库对象(表、视图、序列)的定义