Wetts's blog

Stay Hungry, Stay Foolish.

0%

Oracle从入门到精通-Oracle的物理存储结构

Oracle数据块的物理存储结构由多种物理文件组成,主要有数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件和警告日志文件等。

数据文件:

用于保存用户应用程序数据和Oracle系统内部数据的文件,这些文件在操作系统中就是普通的操作系统文件。只能由Oracle系统负责为数据对象选择具体的数据文件,并在其中分配物理存储空间,用户是无法指定使用哪一个数据文件来进程存储的。

在读取数据时,Oracle系统首先从数据文件中读取数据,并将数据存储在内存的高速数据缓冲区中,如果用户要读取数据库中的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则需要从相应的数据文件中能够读取数据斌光存储在缓冲区中。当修改和插入数据时,Oracle不会立即将数据写入数据文件,而是把这些数据保存在数据缓冲区中,然后由Oracle的后台进程DBWR决定如何将其写入相应的数据文件。这样的存取方式减少了磁盘的I/O操作,提高了系统的响应性能。

  • 系统数据文件:用于存放“特殊”的用户数据和Oracle系统本身的数据,如用户建立的表名、列名及字段类型等,这些属于用户数据范畴,这些数据存放在系统表空间所包含的数据文件中;而Oracle系统内部的数据字典、系统表(如dba_data_files、dba_temp_files等)中所存储的数据属于Oracle系统的内部数据,这些数据也存放在系统表空间所包含的数据文件中。
  • 撤销数据文件:隶属于撤销表空间。如果修改Oracle数据库中的数据,那么就必须使用撤销段,撤销段用来临时存放修改前的旧数据,而撤销段通常存放在一个单独的撤销表空间中,这个撤销表空间所包含的数据文件就是撤销数据文件。
  • 用户数据文件:用于存放用户应用系统的数据,这些数据包括与应用系统有关的所有相关信息。
    dba_data_files或者v$datafile可以查数据文件。
  • 临时数据文件:从Oracle9i以后,Oracle将临时表空间对应的临时数据文件与一般数据文件分开,可以从dba_temp_files或v$tempfile数据字段中查询。

控制文件:

是一个二进制文件,它记录了数据库的物理结构,其中主要包含数据库名、数据文件与日志文件的名字和位置、数据库建立日期等信息。控制文件一般在Oracle系统安装时或创建数据库时自动创建,控制文件所存放的路径有服务器参数文件spfileorcl.ora和control_files参数值来指定。

由于控制文件存放有数据文件、日志文件等的相关信息,因此,Oracle实例在启动时必需访问控制文件。

当Oracle实例在正常启动时,系统首先要访问的是初始化参数文件spfile,然后Oracle为系统全局区(SGA)分配内存。这是,Oracle实例处于安装状态,并且控制文件处于打开状态;接下来Oracle会自动读出“控制文件”中的所有数据文件和日志文件的信息,并打开当前数据库中所有的数据文件和所有的日志文件以供用户访问。
每个数据库至少拥有一个控制文件,一个数据库可以同时拥有多个控制文件,但是一个控制文件只能属于一个数据库。控制文件内部除了存放数据库名以及其创建日期、控制文件、日志文件等的相关信息之外,在系统运行过程中,还存放有系统更改号、检查点信息及归档的当前状态灯信息。
处于安全考虑,在安装Oracle数据库或创建数据库时,Oracle数据库系统会自动创建2个或3个控制文件,每个控制文件记录相同的信息。
v$controlfile可以查询控制文件信息。

日志文件:

主要功能是记录对数据所做的修改,对数据库所做的修改记录都记录在日志文件中。

重做日志文件:

用来记录数据库所有发生过的更改信息(修改、添加、删除等信息)及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息。在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行COMMIT命令时,数据库首先将每笔操作的原始记录写入到日志文件中,写入日志文件成功后,才把新的记录传递给应用程序。

通过对表或则整个表空间设定NOLOGGING属性时,使基于表或表空间中所有的DML操作(如创建表、删除试图、修改索引等操作)都不会产生日志信息。

为了保障数据库系统的安全,每个Oracle实例都启用一个日志线程来记录数据库的变化。日志线程有若干“日志组”构成,而每个日志组又由一个或者多个日志文件构成。

Oracle系统在运行过程中产生的日志信息,首先被临时存放在系统全局区的“重做日志缓冲区”中,当发出COMMIT命令(或日志缓冲区信息满1/3)时,LGWR进程(日志写入进程)将日志信息从“重做日志缓冲区”中读取出来,并将“读取的日志信息”写入到日志文件组中序列号较小的文件里,一个日志组写满后接着写另外一个日志组。当LGWR进程将所有能用的日志文件都使用过一遍后,它将再辞转向第一个日志组重新覆写。

v$logfile查询日志文件。

归档日志文件:

在所有的日志文件被写入一遍之后,LGWR进程将再次转向第一个日志组进行重新覆写,这样务必会导致一部分较早的日志信息被覆盖掉,但Oracle通过归档日志文件解决了这个问题。

Oracle数据库可以运行在两种模式下,即归档模式和非归档模式。非归档模式是指在系统运行期间,所产生的日志信息不断地记录到日志文件组中,当所有重做日志被写满后,又重新从第一个日志组开始覆写。归档模式是在各个日志文件都被写满而即将被覆盖之前,先由归档进程(ARCH)将即将被覆盖的日志文件中的日志信息读出,并将“读出的日志信息”写入到归档日志文件中,而这个过程又被称为归档操作。

在归档操作进程的过程中。日志写入进程(LGWR)需要等待归档进程(ARCH)的结束才能开始覆写日志文件,这样就延迟了系统的响应时间,而且归档日志本身又会占用大量的磁盘空间,这些都会影响系统的整体性能。所以在默认情况下,Oracle系统不采用归档模式运行。

如果将Oracle数据库系统设置成在归档模式下运行,则可以通过服务器参数文件spfile的log_archive_dest参数来规定归档日志文件的所在路径。

服务器参数文件:

SPFILE(Server parameter File)是二进制文件,用来记录Oracle数据库的基本参数信息(如数据库名、控制文件所在路径、日志缓冲大小等)。数据库实例在启动之前,Oracle系统首先会读取SPFILE参数文件中设置的这些参数,并根据这些初始化参数来配置和启动实例。比如,设置标准数据块的大小(即参数db_block_size的值)、设置日志缓冲区的大小(即参数log_buffer的值)等,所以SPFILE参数文件非常重要。服务器参数文件在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora,sid问所创建的数据库实例名。

密码文件:

是Oracle系统用于验证sysdba权限的二进制文件。

警告文件:

是一个存储在Oracle系统目录下的文本文件(名称通常为alert_orcl.log),它用来记录Oracle系统的运行信息和错误信息。

跟踪文件:

跟踪文件包括后台进程跟踪文件和用户跟踪文件。后台进程跟踪文件用于记录后台进程的警告或错误信息,每个后台进程都有对应的后台进程跟踪文件。用户跟踪文件主要用于跟踪SQL语句。