这一章中,我们将分析构成数据库和实例的8种文件类型。与实例相关的文件只有:
q 参数文件(parameter file):这些文件告诉Oracle实例在哪里可以找到控制文件,并且指定某些初始化参数,这些参数定义了某种内存结构有多大等设置。我们还会介绍存储数据库参数文件的两种选择。
q 跟踪文件(trace file):这通常是一个服务器进程对某种异常错误条件做出响应时创建的诊断文件。
q 警告文件(alert file):与跟踪文件类似,但是包含“期望”事件的有关信息,并且通过一个集中式文件(其中包括多个数据库事件)警告DBA。
构成数据库的文件包括:
q 数据文件(data file):这些文件是数据库的主要文件;其中包括数据表、索引和所有其他的段。
q 临时文件(temp file):这些文件用于完成基于磁盘的排序和临时存储。
q 控制文件(control file):这些文件能告诉你数据文件、临时文件和重做日志文件在哪里,还会指出与文件状态有关的其他元数据。
q 重做日志文件(redo log file):这些就是事务日志。
q 密码文件(password file):这些文件用于对通过网络完成管理活动的用户进行认证。我们不打算详细讨论这些文件。
从Oracle 10g开始,又增加了两种新的可选文件类型,可以帮助Oracle实现更快的备份和更快的恢复操作。这两类新文件是:
q 修改跟踪文件(change tracking file):这个文件有利于对Oracle数据建立真正的增量备份。修改跟踪文件不一定非得放在闪回恢复区(Flash Recovery Area),不过它只与数据库备份和恢复有关,所以我们将在介绍闪回恢复区时再讨论这个文件。
q 闪回日志文件(flashback log file):这些文件存储数据库块的“前映像”,以便完成新增加的FLASHBACK DATABASE命令。
我们还会讨论通常与数据库有关的其他类型的文件,如:
q 转储文件(dump file ,DMP file):这些文件由Export(导出)数据库实用程序生成,并由Import(导入)数据库实用程序使用。
q 数据泵文件(Data Pump file):这些文件由Oracle 10g 新增的数据泵导出(Data Pump Export)进程生成,并由数据泵导入(Data Pump Import)进程使用。外部表也可以创建和使用这种文件格式。
q 平面文件(flat file):这些无格式文件可以在文本编辑器中查看。通常会使用这些文件向数据库中加载数据。
以上文件中,最重要的是数据文件和重做日志文件,因为其中包含了你辛辛苦苦才积累起来的数据。只要有这两个文件,就算是其他文件都没有了,我也能得到我的数据。如果把重做日志文件弄丢失了,可能会丢失一些数据。如果把数据文件和所有备份都丢失了,那么这些数据就永远也找不回来了。
下面将分别介绍上述各类文件,并分析这些文件中会有哪些内容。
3.1 参数文件
与Oracle数据库有关的参数文件有很多,从客户工作站上的tnsnames.ora文件(用于“查找”网络上的一个服务器)到服务器上的listener.ora文件(用于启动网络监听器),还有sqlnet.ora、cman.ora和ldap.ora等文件。不过,最重要的参数文件是数据库的参数文件,如果没有这个参数文件,甚至无法启动数据库。其他文件也很重要;它们涉及网络通信以及与数据库连接的各个方面。不过,这些参数文件超出了我们的范围,这里不做讨论。要了解如何配置和建立这些参数文件,建议你参考Net Services Administrator’s Guide。不过,作为开发人员,这些文件应该已经为你设置好了,不需要你来设置。
数据库的参数文件通常称为初始文件(init file),或init.ora文件。这是因为历史上它的默认名就是init<ORACLE_SID>.ora。之所以称之为“历史上”的默认名,原因是从Oracle9i Release 1以来,对于存储数据库的参数设置,引入了一个有很大改进的新方法:服务器参数文件(server parameter file),或简称为SPFILE。这个文件的默认名为spfile<ORACLE_SID>.ora。接下来分别介绍这两种参数文件。
注意 如果你还不熟悉术语SID或ORACLE_SID,下面给出一个完整的定义。SID是站点标识符(site identifie)。在UNIX中,SID和ORACLE_HOME(Oracle软件的安装目录)一同进行散列运算,创建一个惟一的键名从而附加到SGA。如果ORACLE_SID或ORACLE_HOME设置不当,就会得到ORACLE NOT AVAILABLE (ORACLE不可用)错误,因为无法附加到这个惟一键所标识的共享内存段。在Windows上,使用共享内存的方式与UNIX中有所不同,不过,SID还是很重要。同一个ORACLE_HOME上可以有多个数据库,所以需要有办法惟一地标识各个数据库及相应的配置文件。
如果没有参数文件,就无法启动一个Oracle数据库。所以参数文件相当重要,到了Oracle9i Release 2(9.2及以上版本),备份和恢复工具——恢复管理器(Recovery Manager,RMAN)认识到了这个文件的重要性,允许把服务器参数文件包括在备份集中(而不是遗留的init.ora 参数文件类型)。不过,由于init.ora参数文件只是一个纯文本文件,可以用任何文本编辑器创建,所以这个文件不需要你花大力气去“保卫”。只要知道文件中的内容,完全可以重新创建(例如,如果你能访问数据库的警告日志,就可以从中获得参数文件的信息)。
下面依次介绍这两类参数文件(init.ora和SPFILE),不过,在此之前,先来看看数据库参数文件是什么样子。
3.1.1 什么是参数?
简单地说,可以把数据库参数想成是一个“键”/“值”对。在上一章你已经看到过一个很重要的参数,即DB_NAME。这个DB_NAME参数简单地存储为db_name = ora10g。这里的“键”是DB_NAME,“值”是ora10g,这就是我们的键/值对。要得到一个实例参数的当前值,可以查询V$视图V$PARAMETER。另外,还可以在 SQL*Plus中使用SHOW PARAMETER命令来查看,如:

无论采用哪种方法,输出的信息基本上都一样,不过从V$PARAMETER能得到更多信息(这个例子中只选择了一列,实际上还可以选择更多的列)。但是,我还是比较倾向于使用SHOW PARAMETER,因为这个命令使用更简单,而且它会自动完成“通配”。注意我只键入了pga_agg;SHOW PARAMETER会自动在前面和后面添加%。
注意 所有V$视图和所有字典视图在Oracle Database Reference手册中都有充分的说明。要想了解给定视图里有什么,这个手册可以作为一个权威资源。
对于Oracle 9.0.1、9.2.0和10.1.0版本,如果对可以设置的有记录的(documented)参数做一个统计,可能会分别得到参数个数为251、258和255(我相信,在不同的操作系统上可能还会增加另外的参数)。换句话说,参数个数(和参数名)因版本而异。大多数参数(如DB_BLOCK_SIZE)留存已久(它们不会因版本变化而消失),不过,随着时间的推移,其他的很多参数会随着实现的改变而过时。
例如,在Oracle 9.0.1中有一个DISTRIBUTED_TRANSACTIONS参数,这个参数可以设置为某个正整数,它能控制数据库可以执行的并发分布式事务的个数。以前的版本中都有这个参数,但是在9.0.1以后,这个参数就被去掉了。实际上,如果在以后的版本中还想使用这个参数,将产生一个错误:

如果你想查看这些参数,了解有哪些参数,以及各个参数能做什么,请参考Oracle Database Reference手册。这个手册的第1章就详细地分析了每一个有记录的参数。需要指出,一般来讲,这些参数的默认值对于大多数系统都已经足够了(如果某些参数是从其他参数得到默认设置,则完全可以使用所得到的值)。一般而言,要为各个数据库分别设置不同的参数值,如CONTROL_FILES参数(指定系统上控制文件的位置)、DB_BLOCK_SIZE(数据库块大小)以及与内存相关的各个参数。
注意,在上一段中我用了“有记录的”(documented)一词。还有一些无记录的(undocumented)参数。如果参数名用下划线(_)开头,就说明这个参数在文档中未做说明,即所谓的“无记录”。关于这些参数有很多推测。因为文档中没有这些参数,有些人以为它们肯定是“神奇的”,许多人都认为大家都知道这些参数,它们是Oracle“内部人士”用的。不过在我看来,实际上恰恰相反。这些参数并不是大家都知道的,而且也很少用到。其中大多数参数实际上令人厌烦,因为它们表示的只是过时的功能以及为保证向后兼容性而设置的标志。还有一些参数有助于数据的恢复,而不是数据库本身的恢复;例如,有些无记录的参数允许数据库在某些极端环境中启动,但是时间不长,只足以把数据取出来。取出数据后还是得重新构建。
除非Oracle Support明确要求,否则没有理由在你的配置中使用这种无记录的参数。其中很多参数都有副作用,而且可能是破坏性的。在我的开发数据库中,即使有无记录的参数,也只会设置一个这样的参数:
![]()
有了这个参数,所有人都可以读取跟踪文件,而不仅限于DBA小组。在我的开发数据库上,我希望开发人员经常使用SQL_TRACE、TIMED_STATISTICS和TKPROF实用程序(真的,我强烈建议使用它们);所以他们必须能读取跟踪文件。不过,由于Oracle 9.0.1及以上版本增加了外部表,可以看到,即便是要允许别人访问跟踪文件,也不再需要使用这个参数了。
我的生产数据库则没有设置任何无记录的参数。实际上,前面提到的看似“安全”的无记录参数可能会在实际系统中产生不好的副作用。想想看跟踪文件中的敏感信息,如SQL甚至数据值(见后面的“跟踪文件”一节),问问自己,“我真的想让所有最终用户读取这个数据吗?”大多数情况下答案都是否定的。
警告 只有在Oracle Support要求的情况下才使用无记录的参数。使用这些参数可能对数据库有害,而且这些参数在不同版本中的实现可能有变化(而且将会改变)。
可以用两种方式来设置各个参数值:只设置当前实例的参数值,或者永久性地设置。你要确保参数文件包含你期望的值。使用遗留的init.ora参数文件时,这是一个手动过程。如果使用init.ora文件,要永久地修改一个参数值(即使服务器重启这个新设置也有效),就必须手动地编辑和修改init.ora参数文件。如果是服务器参数文件,则只需一条命令就能轻松完成,这多少有些全自动的味道。





