Oracle 系统的物理存储结构比较具体和直观,它用来描述 Oracle 数据在磁盘上的物理组成状况。Oracle 系统的数据在逻辑上存储在表空间中,而在物理上存储在表空间所包含的物理文件(即数据文件)中。数据库
Oracle 数据库的物理存储结构由多种物理文件组成,主要由数据文件、控制文件、重作日志文件、归档日志文件、参数文件、口令文件和警告日志文件等。安全
数据文件时用于保存用户应用程序数据和 Oracle 系统内部数据的文件,这些文件在操做系统中就是普通的系统文件, Oracle 在建立表空间的同时会建立数据文件。Oracle 数据库在逻辑上由表空间组成,每一个表空间能够包含一个或多个数据文件,一个数据文件只能隶属于一个表空间。服务器
在建立表空的同时,Oracle 会建立该表空间的数据文件。在表空间中建立数据对象(如表、索引、序列等)时,用户是没法指定使用哪个数据文件来进行存储的,只能由 Oracle 系统负责为数据对象选择集体的数据文件,并在其中分配物理存储空间。一个数据对象的数据能够所有存储在一个数据文件中,也能够分布存储在一个表空的多个数据文件中。性能
在读取数据时,Oracle系统首先从数据文件中读取数据,并将数据存储在内存的高数缓冲区中。若是用户要读取数据库的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则须要从相应的数据文件中读取数据并存储在缓冲区中。当修改和插入数据时,Oracle 不会当即将数据写入数据文件,而是把这些数据保存在数据缓冲区中,而后由 Oracle 的后台进程 DBWR 决定如何将其写入相应的数据文件。这样的存取方式减小了磁盘的 I/O 操做,提升了系统的响应性能。spa
数据文件又能够分为3种类型:系统数据文件(system01.dbf 和 sysaux01.dbf )、撤销数据文件(undotbs01.dbf)和用户数据文件(users01.dbf、example01.dbf、tbsp_1.dbf和 tbsp_2.dbf)。操作系统
用于存放“特殊” 的用户数据和 Oracle 系统自己的数据,如用户创建的表名、列名及字段类型等,这些属于用户数据范畴,这些数据将存放在系统表空间所包含的数据文件中;而 Oracle 系统内部的数据字典、系统表中所存储的数据属于 Oracle 系统的内部数据,这些数据也存放在系统表空间所包含的数据文件中。线程
撤销数据文件隶属于撤销表空间。若是修改 Oracle 数据库中的数据,那么就必须使用撤销段,撤销段用来临时存放修改前的旧数据,而撤销段一般存放一个单纯的撤销表空间中,这个撤销表空间所包含的数据文件就是撤销数据文件。
日志
用户数据文件用于存放用户应用系统的数据,这些数据包括与应用系统有关的全部相关信息。对象
控制文件时一个二进制文件,记录了数据库的物理结构,其中主要包含数据库名、数据文件与日志文件的名字和位置、数据库创建日期等信息。控制文件通常在 Oracle 系统安装时或建立数据库时自动建立,控制文件所存放的路径由服务器参数文件 spfileorcl.ora 的 control_files 参数值来指定。索引
因为控制文件存放有数据文件、日志文件等的相关信息,所以, Oracle 实例在启动时必须访问控制文件。只有控制文件正常,实例才能加载并打开数据库;但若控制文件中记录了错误的信息,或者实例没法找到一个可用的控制文件,则实例没法正常启动。
当 Oracle 实例在正常启动时,系统首先要访问的初始化参数文件 spfile,而后 Oracle 为系统全局区(SGA) 分配内存。这时, Oracle 实例处于安装状态,而且控制文件处于打开状态;接下来 Oracle 会自动读出 “控制文件” 中的全部数据文件和日志文件的信息,并打开当前数据库中全部的数据文件和全部的日志文件以供用户访问。
每一个数据库至少拥有以供控制文件,以供数据库能够同时拥有多个控制文件,可是以供控制文件只能属于一个数据库。控制文件内部除了存放数据库名及其建立日期、数据文件、日志文件等的相关的信息以外,在系统运行过程当中,还存放系统更改好、检查点信息及归档的当前状态等信息。
出于安全考虑,在安装 Oracle 数据库或建立数据库时,Oracle 数据库系统会自动建立两个或3个控制文件,每一个控制文件记录相同的信息。这样可确保在数据库运行时,若是某个控制文件损坏, Oracle 会自动使用另一个控制文件,当全部的控制文件都损坏时,系统将没法工做。
日志文件的主要功能是记录对数据所做的修改,对数据库所做的修改几乎都记录在日志文件中。在出现问题时,能够经过日志文件获得原始数据,从而保障不丢失已有操做成果。 Oracle 的日志文件包括重作日志文件(Redo Log File)和归档日志文件(Archive Log File),它们是 Oracle系统的主要文件之一,尤为是重作日志文件,它是 Oracle 数据库系统正常运行所不可或缺的。
重作日志文件用来记录数据库全部发生过的更改信息(修改、添加、删除等信息)及由 Oracle内部行为(建立数据表、索引等)而引发的数据库变化信息。在数据库恢复时,能够从该日志文件中读取原始记录。在数据库运行期间,当用户执行 commit 命令(数据库提交命令)时,数据库首先将每次曹锁的原始记录写入到日志文件中,写入日志文件成功后,才把新的记录传递给应用程序。因此,在日志文件上能够随时读取原始记录以恢复某些数据。
为了保障数据库系统的安全,每一个 Oracle 实例都启用一个日志线程来记录数据库的变化。日志线程由若干“日志组”构成,每一个日志组又由一个或者多个日志文件构成。
经过对表或者整个表空间设定 nologging 属性时,使基于表空间全部的 DML操做(如建立表、删除视图、修改索引等操做)都不会生成日志信息,这样就会减小信息的产生。
Oracle 系统在运行过程当中产生的日志信息,首先被临时存放在系统全局区的“重作日志缓冲区”中,当发出 commit 命令(或日志缓冲区信息满1/3)时,LGWR 进程(日志写入进程)将日志信息从“重作日志缓冲区” 中读取出来,并将“读取的日志信息” 写入到日志文件组中序列号较小的文件里,一个日志组写满后接着写另一个日志组。当 LGWR 进程将全部能用的日志文件都使用过一遍以后,它将再次转向第一个日志组从新覆写。
当全部的日志文件被写入一遍以后,LGWR 进程将再次转向第一个日志组进行从新覆写,这样势必会致使一部分较早的日志信息覆盖掉,但 Oracle 经过归档日志文件解决了这个问题。
Oracle 数据库能够运行在两种模式下,即归档模式和非归档模式。非归档模式是指在系统运行期间,所产生的日志信息不断地记录到日志文件组中,当全部重作日志组被写满后,又从新从第一个日志组开始覆写。归档模式是在各个日志文件都被写满而即将被覆盖以前,先由归档进程(ARCH)将即被覆盖的日志文件中的日志信息读出,并将 “读出的日志信息” 写入到归档日志文件中,而这个过程又被称为归档操做。
在归档操做进行的过程当中,日志写入进程(ARCH)须要等待归档进程(ARCH)的结束才能开始覆写日志文件,这样就延迟了系统的响应时间,并且归档日志文件自己又会占用大量的磁盘空间,这些都会影响系统的总体性能。因此在默认状况下,Oracle 系统不采用归档模式运行。