Oracle物理结构

来源:互联网 发布:网络语言cp是什么意思 编辑:程序博客网 时间:2024/04/29 10:43

oracle物理结构

在一个服务器中,每一个运行的数据库都有一个数据库实例(instancename) 相联系。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),即构成了oracle的内存结构。然后启动若干个常驻内存的操作系统进程,即组成了oracle的进程结构。除此之外,还有数据库的物理与逻辑结构。数据库体系统结构图可以参考第一篇。在接下来的篇幅中将分五篇来详细说明oracle数据库的体系结构。
  • oracle物理结构
  • oracle逻辑结构
  • oracle内存结构
  • oracle进程结构
  • oracle连接配置结构

本篇说明物理结构。

  物理结构,即oracle数据库使用的操作系统文件结构。对于数据库物理结构文件,不同的oracle版本,不同的操作系统平台上有不同的存储目录结构。

  • winnt  | d:/oracle/product/10.1.0/oradata/DB_NAME/*.*(oracle 10g);d:/orant/database/*.*(oracle7,oracle8)
  • Unix | /home/app/oracle/product/10.1.0/oradata/DB_NAME/*.*(10g);/home/app/oradata/db_name/*.*(8i,9i)

  数据库的物理结构文件按其作用可以分为三类:

  • 数据文件
  • 日志文件
  • 控制文件

      物理存储结构是指从物理角度分析数据库的构成,即Oracle数据库创建后所使用的操作系统文件。从物理存储结构上分析:每一个Oracle数据库是主要由三种类型的文件组成:数据文件、日志文件和控制文件,另外还包括一些参数文件。其中:数据文件的扩展名为.DBF;日志文件的扩展名为.LOG;控制文件的扩展名为.CTL。

 

一、数据文件

      数据文件(Data File)用于存储数据库数据的文件,如表中的记录,索引,数据字典信息等都存储于数据文件中。在存取数据时,Oracle数据库系统首先从数据文件中读取数据,并存储在内存中的数据缓冲区中。当用户查询数据时,如果所要查询的数据不在数据缓冲区中,则这时Oracle数据库进行启动相应的进程从数据文件中读取数据,并保存到数据缓冲区中。当用用户修改数据时,用户对数据的修改保存在数据缓冲区中,再由oracle后台进程DBWR决定如何将其写入到数据文件中。这样的存取方式减少了磁盘的I/O操作,提高了系统的响应性能。


      一个Oracle数据库往往有多个数据文件。这里需要注意的是:当向Oracle数据库中某个表添加数据时,输入到表中的数据可能包含在一个数据文件中,也可能包含在多个数据文件中。换句说话,当在Oracle数据库为中创建一个表时,Oracle数据库系统不会为此在磁盘在上创建一个数据文件。

 

1.查询数据文件的信息

sql>select * from dba_data_files或

sql>select * from v$datafile(此数据字典包含文件的动态信息)
数据字典DBA_DATA_FILES描述了数据文件的名称、标识、大小以及对应的表空间信息等,而数据字典V$DATAFILE则描述了数据文件的同步信息。

一个数据文件只与一个数据库相联系。数据文件的大小是可以改变的。可以通过以下语句查询表空间的空间空闲量

sql>select * from dba_free_space

 

2.修改数据文件的大小

sql>alter database datafile "d:/.../df1.dbf" resize 800m

 

3.数据库文件的自动扩展特性。请看下面的例子:

sql>alter tablespace tbs1 add datafile "d:/.../df2.dbf" size 500m autoextend on next 50m maxsize 1000m

sql>alter database mydb1 datafile "d:/.../df2.dbf","d:/.../df3.dbf" autoexetend off

sql>alter database mydb1 datafile "d:/.../df2.dbf","d:/.../df3.dbf" autoexetend on next 30m maxsize unlimited


二、重做日志文件

1.日志工作原理

      在Oracle中,日志文件也叫做重做日志文件或重演日志文件(Redo Log Files)。日志文件用于记录对数据库的修改信息,对数据库所作的修改信息都被记录在日志中。这包括用户对数据库中数据的修改和数据库管理员对数据库结构的修改。如果,只是对数据库中的信息进行查询操作,则不会产生日志信息。由于日志文件记录的对数据库的修改信息,如果用户对数据的操作由于出现的故障,而使修改的数据没有保存到数据文件中,那么就可以利用日志文件找到数据的修改,这样以前所做的工作就不会因为故障而丢失。
注 意: 日志文件也是Oracle物理结构文件中最复杂的一类文件,同时也是保证数据库系统安全,以及备份与恢复的重要手段。日志文件的损坏造成的后果比损坏数据文件更严重,日志文件的损坏可能会导致整个数据库系统不能正常使用。 

      如果用户对一个表中的数据进行了修改,则修改信息首先被记录在日志缓冲区中,当用户提交候改后(或日志缓冲区信息满1/3时或超时3生秒),由LGWR进程将日志信息从日志缓冲区中读出并写到日志文件中。这时数据文件中保存的数据时用户修改后的数据,但是在日志文件中且记录了两组数据,一组是用户修改后的数据;另一组是用记户修改前的数据。根据这些信息,当用户进行了误操作后就可进行恢复。

2.日志文件组与日志成员
      在Oracle数据库中,日志文件是成组使用的。日志文件的组织单位叫日志文件组,日志文件组中的日志文件叫日志成员。每一个Oracle数据库系统都有多个日志文件组,每一组有一个或多个日志成员(即多个日志文件组成)。为了防止日志文件被物理损坏,在同一个日志文件组中,允许对日志成员进行镜像,镜像的日志成员文件被存储在不同的物理磁盘中。数据库包含3个日志文件组,每组对应一个日志成员文件,且日志成员文件没有进行镱像。

      日志文件的镜像是保证数据库安全的一种方法,被镜像的日志文件应存储在不同的物理磁盘上.
      在日志工作过程中,多个日志文件组之间是循环使用的。当一日志文件组被填满后,将会发生日起切换,系统自动转换到另一个日志文件组。如果日志有镜像,则多个镜像文件中存储的信息是完全相同的。


      经过上面的分述可知:每个数据库包含多个日志文件组,每组日志文件包含一个或多个日志文件;同一组中的日志文件具有相同的信息,因为同一个日志文件组中的日志成员是镜像关系。同一组中的日志文件被保存最好保存在不同的物理磁盘中。
      为了确认系统当前正在使用的日志文件组,可以查询数据字典V$LOG,该数据字典记录了当前日志的使用信息。

相关字段说明如下:

GROUP#:日志文件组号

THREAD#:日志文件线程号,一般为1,双机容时为2

SEQUENCE#:日志序列号

BYTES:日志文件大小

MEMBERS:该组的日志成员个数

ARC:该组日志信息是否已经完成归档

STATUS:该组状态(CURRENT:表示当前正在使用的组;NACTIVE:表示非活动组;ACTIVE:表示归档未完成)

FIRST_CHANGE#:系统改变号SCN,也叫检查点号

FIRST_TIME:系统改变时间

 

      同时,数据库管理员也可以使用ALTER SYSTEM命令进行强制的日志切换。使用ALTER SYSTEM命令进行日志切换的形式如下:

ALTER SYSTEM SWITCH LOGFILE;


3.NOARCHIVELOG/ARCHIVELOG 
      如果所有的日志文件组都被填满后,则系统将日志信息写入到第一个日志文件组中,这时第一个日志文件组中的日志信息可能被覆盖掉。第一个日志文件组中的日志信息是否被覆盖取决于数据库的工作模式。在Oracle数据库中,数据库的运行模式有两种,一种是归档模式(ARCHIVELOG),另一种是非归档模式(NOARCHIVELOG)。

      数据库运行在非归档模式时,如果发生日志切换,则日志信息直接被覆盖。而当数据库以归档模式运行时,如果发生日志切换,且需要覆盖已经存的日志信息,则系统将启用ARCH进程将被要覆盖的日志信息保存到磁盘或磁带上形成归档日志。因此,在非归档模式下运行的数据库,只包含历史日志,而没有归档日志。

      提 示: 在默认情况下,Oracle不采用归档模式。用户可以通过使用SELECT LOG_MODE FROM V$DATABASE命令查询当前数据库是否工作在归档模式。要了解归档日志的信息,可以查询数据字典v$archived_log。

 

要将数据库改为归档模式:

a.alter database archivelog

b.设置初始化参数LOG_ARCHIVE_START=TRUE

c.设置归档文件目标存储路径 LOG_ARCHIVE_DEST=C:/ORA/ARCHIVE

d.设置归档文件命名格式参数 LOG_ARCHIVE_FORMAT="ORCK%T%S.ARC"。这个格式中的%S表示日志序列号,自动左边补零;%s表示日志序列号,自动左边不补零;%T表示日志线程号,左边补零;%t表示日志线程号不补零。

e.重新启动数据库

 

4.CKPT进程(检查点进程)

  CKPT进程保证有修改过的数据库缓冲区中的数据都被写入到数据文件,日志文件、数据文件、数据库头和控制文件中都有写入检查点标记。数据库在恢复时,只需提供自上一个检查以来所做的修改。检查点完成时系统将更新数据库数据库头和控制文件。

  参数LOG_CHECKPOINT_TIMEOUT决定一个检查点发生的时间间隔。LOG_CHECKPOINT_INTERVAL决定一个检查需要填充的日志文件块的数量。检查点号,也称系统改变号(SCN),它标识一个检查点。可以通过v$log查询日志文件的检查点信息,通过v$datafile查询数据文件的检查点信息,通过v$database查询数据库头的检查点信息。三个地方的检查点号相同,如果不同,说明发明数据库不同步,此时数据库肯定无法正常启动。

三、控制文件

  控制文件是一个二进制文件,用来描述数据库的物理结构,一个数据库只需要一个控制文件,控制文件的内容包括:

  • 数据库名及数据库唯一标识
  • 数据文件和日志文件标识
  • 数据库恢复所需的同步信息,即检查点号

  控制文件由参数control_files指定,格式如下:

control_files=("home/app/.../control01.ctl","home/app/.../control02.ctl")

参数中各个文件是镜像关系,也就是说,几个文件中只要有一个文件完好,数据库就可以正常运行。

 

      由于控制文件存放有数据文件和日志文件等信息,因此Oracle数据库在启动时,数据库须访问控制文件。在数据库的使用过程中,Oracle将不断更新控制文件。如果由于某些原因导致控件文件被损坏,那么数据库也就不能正常工作了。

      为了获取控制文件的信息,可以通过查询V$CONTROLFILE数据字典获知。查询数据字典V$CONTROLFILE获取数据库的控制文件信息。

 

如果控制文件损坏或丢失,数据库将终止并且无法启动,所以,要对控制文件进行镜象,手工镜像步骤如下:

a.关闭数据库

b.复制控制文件

c.修改参数文件,加入新增的控制文件位置描述

d.重新启动数据库

 

  另外注意,控制文件中还包含几个服务器参数的设置,如果修改这些参数的值,刚需要重新创建控制文件,这些参数是:

  • MAXLOGFILES:最大日志文件个数
  • MAXLOGMEMBERS:最大日志成员个数
  • MAXLOGHISTORY:最大历史日志个数
  • MAXDATAFILES:最大数据文件个数
  • MAXINSTANCES:最大实例文件个数

  所有修改数据库结构的命令都会引起控制文件的改变。同时出会记录在oracle跟踪文件中,跟踪文件的名称为alter_SID.log,路径如下:

d:/oracle/product/10.1.0/admin/DB_NAME/bdump/SIDALRT.log(unix是alter_SID.ora)

也可以在参数文件中指定跟踪文件的存储路径,后台进程跟踪文件目录由参数background_dump_dest指定,用户跟踪文件位置由参数user_bdump_dest指定,如:

background_bdump_dest=/u01/app/oracle/oralog/bdump

user_bdump_dest=/u01/app//oralog/udump


四、参数文件
      除了构成Oracle数据库物理结构的三类主要文件外,Oracle数据库还具有另外一种重要的文件:参数文件。参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等。与旧版本的初始化参数文件INITsid.ora不同,在Oracle10g中还可以使用二进进制服务器参数文件,并且该服务器参数文件在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora,sid为所创建的数据库实例名。

SPFILEsid.ora中的参数是由Oracle系统自动管理。如果想要对数据库的某些参数进行设置,则可能过OEM或ALTER SYSTEM命令来修改。用户最好不要用编辑器进行修改。