1.1.2 Oracle物理存储结构

Oracle Database使用磁盘上的多个物理存储结构来保存和管理用户事务的数据。其中一些存储结构,如数据文件、重做日志文件和归档重做日志文件保存真正的用户数据。而其他一些结构,如控制文件,则维护数据库对象的状态。基于文本的警报和跟踪文件包含数据库中的例行事件和错误条件的记录信息。图1-2显示这些物理结构与逻辑存储结构之间的关系。数据库文件是控制文件、数据文件或者联机重做日志文件。其他对于数据库的成功运行并不重要的文件包括参数文件、口令文件、备份文件、归档重做日志文件、跟踪文件和警报日志文件。

图1-2 Oracle物理存储结构

1.数据文件

Oracle Database至少必须包含一个数据文件。一个Oracle数据文件对应于磁盘上的一个物理操作系统文件。Oracle Database中的每个数据文件正好是一个表空间的成员。但是,一个表空间可以包含多个数据文件。大文件表空间是例外情况,这个表空间正好包含一个数据文件。

如果DBA使用AUTOEXTEND参数创建数据文件,那么在空间不足的情况下,Oracle数据文件可以自动扩展。另外,使用ALTER DATABASE DATAFILE命令,可以手动扩展事件文件。DBA还可以使用MAXSIZE参数来限制给定数据文件的扩展量。在任意一种情况下,数据文件的大小最终都会受到其所在的磁盘容量大小的限制。

数据文件是数据库中所有数据的最终栖息之地。数据文件中频繁访问的块都会缓存到内存中。同样,新数据块并非直接写入数据文件,而是根据数据库写入器进程的激活时间写入到数据文件中。在用户的事务完成前,会将事务的更改写入重做日志文件。

2.重做日志文件

每次在表、索引或其他Oracle对象中添加、删除或更改数据时,都会将一个条目写入当前的重做日志文件中。由于Oracle以循环方式重用重做日志文件,Oracle数据库至少必须有两个重做日志文件。在一个重做日志文件填满重做日志条目时,如果实例恢复仍需要使用此当前日志文件,就将此文件标记为ACTIVE;如果实例恢复不需要此文件,就将其标记为INACTIVE。接着会按顺序从头使用下一个日志文件,并将此文件标记为CURRENT。

在理想状况下,永远都不会使用重做日志文件中的信息。但是,如果发生了停电故障或其他一些服务器故障,从而导致Oracle实例失败,那么数据库缓冲区缓存中的新数据块或更新的数据块可能尚未写入到数据文件中。重新启动Oracle实例时,会在前滚操作中将重做日志文件中的条目应用于数据库数据文件,以便将数据库的状态恢复到发生故障时的状态。

为了能够在一个重做日志组的一个重做日志文件丢失时执行恢复,可以在不同的物理磁盘上保存重做日志文件的多个副本。你将在本章后面了解到,可以实现重做日志文件、归档日志文件和控制文件的多路复用,以便确保Oracle数据库的可用性和数据完整性。简而言之,多路复用的意思是拥有多个结构副本,以便提高性能和可用性。

3.控制文件

Oracle Database至少有一个控制文件,此文件维护数据库的元数据。元数据是数据库本身的物理结构的数据。除其他外,控制文件还包含数据库名称、创建数据库的时间,以及所有数据文件和重做日志文件的名称和地址。另外,控制文件维护恢复管理器(Recovery Manager, RMAN)使用的信息,如持久性RMAN设置以及数据库上已经执行的备份类型。每当数据库结构发生任何改动时,更改信息会立即在控制文件中反映出来。

由于控制文件对数据库的运行如此重要,因此也可以对控制文件进行多路复用(可以复制一个或多个控制文件)。但是,无论有多少个控制文件的副本与一个实例相关,都只有一个控制文件主要用于检索数据库元数据。

ALTER DATABASE BACKUP CONTROLFILE TO TRACE命令是另一种备份控制文件的方式。它生成SQL脚本,如果由于发生了灾难性故障造成控制文件的所有多路复用二进制版本丢失,则可以使用此脚本来重新创建数据库控制文件。

还可以使用此跟踪文件在以下情况下重新创建控制文件:需要重命名数据库,或更改各种数据库限制(如果不重新创建整个数据库,不能以其他方式更改)。

4.归档日志文件

Oracle Database可按以下两种模式运行:ARCHIVELOG或NOARCHIVELOG模式。如果数据库处于NOARCHIVELOG模式,则循环重用重做日志文件(又称联机重做日志文件)将意味着,在出现硬盘故障或其他与介质相关的故障时,重做条目(以前事务的内容)不再可用。以NOARCHIVELOG模式运行可以在实例发生故障或系统崩溃时保护数据库的完整性,因为只能在联机重做日志文件中使用已经提交但尚未写入数据文件的所有事务。因此,崩溃恢复的范围仅限于联机重做日志中的当前条目。如果在最早的重做日志文件之前数据文件最近一次备份发生故障,将无法恢复数据库。

与此相反,ARCHIVELOG模式将填满的重做日志文件发送到一个或多个指定目标,可以在数据库介质发生故障时,在任何特定的时间点使用备份文件重新构造数据库。例如,如果包含数据文件的硬盘发生崩溃,有了最新的备份数据文件、重做日志文件和归档日志文件(在备份后生成),则可将数据库的内容恢复到崩溃前的一个时间点。

为填满的重做日志文件使用多个归档日志目标对于Oracle中名为Oracle Data Guard(以前称为Oracle Standby Database)的高可用性功能至关重要。

5.初始化参数文件

启动数据库实例时,会为Oracle实例分配内存,并会打开两类初始化参数文件中的一个:基于文本的文件init<SID>.ora(通常称为init.ora或PFILE)或服务器参数文件(SPFILE)。实例首先在操作系统的默认位置(例如,Unix上的$ORACLE_HOME/dbs)查找SPFILE文件spfile<SID>.ora或spfile.ora。如果这些文件都不存在,实例会查找名为init<SID>.ora的PFILE。另外,STARTUP命令可显式指定在启动Oracle时使用的PFILE。

无论采用哪种格式,初始化参数文件都指定跟踪文件、控制文件和填满的重做日志文件等的位置。它们还设置系统全局区域(System Global Area, SGA)中各种结构的大小,以及允许多少用户同时连接到数据库。

一直到Oracle Database 9i,只能使用init.ora文件来指定实例的初始化参数。虽然可以使用文本编辑器方便地进行编辑,但是此文件存在一些缺点。如果在命令行使用ALTER SYSTEM命令更改动态系统参数,DBA必须记住更改init.ora文件,以便下次重新启动实例时新参数值可以生效。

SPFILE使DBA可以更方便高效地管理参数。如果运行的实例正在使用SPFILE,那么,如果任何ALTER SYSTEM命令更改初始化参数,将自动更改SPFILE中的初始化参数(可以仅针对运行的实例,也可能针对两者)。无须编辑SPFILE文件,甚至也无法对其进行编辑(否则会损坏SPFILE)。

虽然本质上无法对参数文件或SPFILE进行镜像操作,但可将SPFILE备份为init.ora文件。应该使用传统的操作系统命令备份Oracle实例的init.ora和SPFILE(对于SPFILE,可以使用恢复管理器)。

使用DBCA(Database Configuration Assistant,数据库配置助手)工具来创建数据库时,会默认创建SPFILE。

6.警报和跟踪日志文件

出现故障时,Oracle可以而且经常会将消息写到警报日志文件,对于后台进程或用户会话,则会写入跟踪日志文件。

警报日志文件位于BACKGROUND_DUMP_DEST初始化参数指定的目录中,包含最重要的例行状态消息以及重要错误条件。在启动或关闭数据库时,会将消息以及一系列未采用默认值的初始化参数记录到警报日志中。还会记录DBA发送的任何ALTER DATABASE或ALTER SYSTEM命令。此处还会记录涉及表空间及其数据文件的操作,例如,添加表空间、删除表空间以及将数据文件添加到表空间中。错误条件,例如表空间的空间不足或重做日志文件受损等(这些都是重要条件)也会记录在此处。

Oracle实例后台进程的跟踪文件也位于BACKGROUND_DUMP_DEST中。例如,PMON(process monitor,进程监视器)和SMON(system monitor,系统监视器)的跟踪文件包含错误发生时间的条目,或SMON需要执行实例恢复操作的时间的条目。QMON(queue monitor,队列监视器)的跟踪文件包含何时产生新进程的消息。

也为各个用户会话或数据库连接创建跟踪文件,这些跟踪文件位于初始化参数USER_DUMP_DEST指定的目录中。在两种情况下为用户进程创建跟踪文件:由于权限问题,用户会话发生了一些类型的错误或用户进程的运行空间不足。也可以使用以下的命令显式创建跟踪文件,以帮助诊断问题:

        ALTER SESSION SET SQL_TRACE=TRUE;

为用户执行的每条SQL语句生成跟踪信息,在调整用户的SQL语句时,跟踪信息会起到帮助作用。

可以随时删除或重命名警报日志文件;下次生成警报日志消息时会重新创建此文件。DBA经常通过操作系统机制(Oracle Database内部调度机制)或Oracle Enterprise Manager的调度程序,设置一项日常批处理作业,在日常工作中重命名和归档警报日志。

从Oracle Database 11g第1版开始,实例的诊断信息被集中到初始化参数DIAGNOSTIC_DEST指定的单个目录中,并且忽略USER_DUMP_DEST和BACKGROUND_DUMP_DEST。

7.备份文件

可以从多个来源,例如操作系统复制命令或Oracle RMAN生成备份文件。如果DBA执行冷备份,那么备份文件只是数据文件、重做日志文件、控制文件和归档重做日志文件等的操作系统副本。

除了数据文件的逐位映像副本(RMAN的默认操作)外,RMAN可以生成数据文件、控制文件、归档重做日志文件和特殊格式的SPFILE的完整和增量备份,称为备份集,备份集仅供RMAN读取。RMAN备份集备份通常比原始的数据文件小,因为RMAN不备份未使用过的块。RMAN是管理备份和恢复的标准,但在RMAN备份处理会对性能产生不利影响的情况下除外。