在访问和维护实例参数设置方面,SPFILE是Oracle做出的一个重要改变。有了SPFILE,可以消除传统参数文件存在的两个严重问题:
q
可以杜绝参数文件的繁殖。SPFILE总是存储在数据库服务器上;必须存在于服务器主机本身,不能放在客户机上。对参数设置来说,这样就可以只有一个“信息来源”。
q
无需在数据库之外使用文本编辑器手动地维护参数文件(实际上,更确切的说法是不能手动地维护)。利用ALTER SYSTEM 命令,完全可以直接将值写入SPFILE。管理员不必再手动地查找和维护所有参数文件。
这个文件的命名约定默认为:

我强烈建议使用默认位置;否则会影响SPFILE的简单性。如果SPFILE在其默认位置,几乎一切都会为你做好。如果将SPFILE移到一个非默认的位置,你就必须告诉 Oracle到哪里去找SPFILE,这又会导致遗留参数文件的一大堆问题卷土重来!
1. 转换为SPFILE
假设有一个数据库,它使用了前面所述的遗留参数文件。转换为SPFILE非常简单;这里使用了
CREATE SPFILE命令。
注意 还可以使用一个“逆”命令从SPFILE创建参数文件(parameter file,PFILE),稍后我们会解释为什么希望这样做。
所以,假设使用一个
init.ora参数文件,而且这个init.ora 参数文件确实在服务器的默认位置上,那么只需发出
CREATE SPFILE命令,并重启服务器实例就行了:

这里使用
SHOW PARAMETER命令显示出原先没有使用SPFILE,但是创建SPFILE并重启实例后,确实使用了这个SPFILE,而且它采用了默认名。
注意 在集群环境中,通过使用Oracle RAC,所有实例共享同一个SPFILE,所以要以一种受控的方式完成这个转换过程(从PFILE转换为SPFILE)。这个SPFILE可以包含所有参数设置,甚至各个实例特有的设置都可以放在这一个SPFILE中 ,但是必须把所有必须的参数文件合并为一个有以下格式的PFILE。
在集群环境中,为了从使用各个PFILE转换为所有实例都共享一个公共的SPFILE,需要把各个PFILE合并为如下一个文件:


也就是说,集群中所有实例共享的参数设置都以*.开头。单个实例特有的参数设置(如
INSTANCE_NUMBER和所用的重做
THREAD)都以实例名(Oracle SID)为前缀。在前面的例子中,
q PFILE对应包含两个节点的集群,其中的实例分别为
O10G1和
O10G2。
q
*.db_name = 'O10G'
这个赋值指示,使用这个SPFILE的所有实例会装载一个名为
O10G的数据库。
q
O10G1.undo_tablespace='UNDOTBS1'指示,名为
O10G1的实例会使用这个特定的撤销(undo)表空间,等等。
2. 设置SPFILE中的参数值
一旦根据SPFILE启动并运行数据库,下一个问题就是如何设置和修改其中的值。要记住,SPFILE是二进制文件,它们可不能用文本编辑器来编辑。这个问题的答案就是使用
ALTER SYSTEM命令,语法如下(< > 中的部分是可选的,其中的管道符号(|)表示“取候选列表中的一个选项”):

默认情况下,
ALTER SYSTEM SET命令会更新当前运行的实例,并且会为你修改SPFILE,这就大大简化了管理;原先使用
init.ora参数文件时,通过
ALTER SYSTEM命令设置参数后,如果忘记更新
init.ora参数文件,或者把init.ora参数文件丢失了,就会产生问题,使用SPFILE则会消除这些问题。
记住这一点,下面来详细分析这个命令中的各个元素:
q
parameter=value
这个赋值提供了参数名以及参数的新值。例如,
pga_aggregate_target = 1024m会把
PGA_AGGREGATE_TARGET参数值设置为1 024 MB(1 GB)。
q
comment='text'是一个与此参数设置相关的可选注释。这个注释会出现在
V$PARAMETER视图的
UPDATE_COMMENT字段中。如果使用了相应选项允许同时保存对SPFILE的修改,注释会写入SPFILE,而且即便服务器重启也依然保留,所以将来重启数据库时会看到这个注释。
q
deferred指定系统修改是否只对以后的会话生效(对当前建立的会话无效,包括执行此修改的会话)。默认情况下,
ALTER SYSTEM命令会立即生效,但是有些参数不能“立即”修改,只能为新建立的会话修改这些参数。可以使用以下查询来看看哪些参数要求必须使用
deferred:

上面的代码表明,
SORT_AREA_SIZE可以在系统级修改,但是必须以延迟方式修改。以下代码显示了有
deferred选项和没有
deferred选项时修改这个参数的值会有什么结果:


q
SCOPE=MEMORY|SPFILE|BOTH指示了这个参数设置的“作用域”。设置参数值时作用域有以下选择:
n
SCOPE=MEMORY只在实例中修改;数据库重启后将不再保存。下一次重启数据库时,设置还是修改前的样子。
n
SCOPE=SPFILE只修改
SPFILE中的值。数据库重启并再次处理SPFILE之前,这个修改不会生效。有些参数只能使用这个选项来修改,例如,
processes参数就必须使用
SCOPE=SPFILE,因为我们无法修改活动实例的
processes值。
n
SCOPE=BOTH
是指,内存和
SPFILE
中都会完成参数修改。这个修改将反映在当前实例中,下一次重启时,这个修改也会生效。
这是使用
SPFILE
时默认的作用域值
。如果使用
init.ora
参数文件,默认值则为
SCOPE=MEMORY
,这也是此时惟一合法的值。
q
sid='sid|*
'主要用于集群环境;默认值为
sid='*
'。这样可以为集群中任何给定的实例惟一地指定参数设置。除非你使用Oracle RAC,否则一般不需要指定
sid=设置。
这个命令的典型用法很简单:

或者,更好的做法是,还可以指定
COMMENT=
赋值来说明何时以及为什么执行某个修改:

3. 取消SPFILE中的值设置
下一个问题又来了,“好吧,这样就设置了一个值,但是现在我们又想‘取消这个设置’,换句话说,我们根本不希望SPFILE有这个参数设置,想把它删掉。但是既然不能使用文本编辑器来编辑这个文件,那我们该怎么办呢?”同样地,这也要通过
ALTER SYSTEM命令来完成,但是要使用
RESET子句:

在这里,SCOPE/SID 设置的含义与前面一样,但是
SID=部分不再是可选的。
Oracle SQL Reference手册在介绍这个命令时有点误导,因为从手册来看,好像这只对RAC(集群)数据库有效。实际上,手册中有下面的说明:
alter_system_reset_clause(
ALTER SYSTEM命令的
RESET子句)用于“真正应用集群”(RAC)环境。
接下来,它又说:
在非RAC环境中,可以为这个子句指定
SID='*
'。
这就有点让人糊涂了。不过,要从SPFILE“删除”参数设置,也就是仍然采用参数原来的默认值,就要使用这个命令。所以,举例来说,如果我们想删除
SORT_AREA_SIZE,以允许使用此前指定的默认值,可以这样做:

这样会从SPFILE中删除
SORT_AREA_SIZE,通过执行以下命令可以验证这一点:

然后可以查看
/tmp/pfile.tst的内容,这个文件将在数据库服务器上生成。可以看到,参数文件中不再有
SORT_AREA_SIZE参数了。
4. 从SPFILE创建PFILE
上一节用到的
CREATE PFILE...FROM SPFILE命令刚好与
CREATE SPFILE相反。这个命令根据二进制SPFILE创建一个纯文本文件,生成的这个文件可以在任何文本编辑器中编辑,并且以后可以用来启动数据库。正常情况下,使用这个命令至少有两个原因:
q
创建一个“一次性的”参数文件,用于启动数据库来完成维护,其中有一些特殊的设置。所以,可以执行
CREATE PFILE...FROM SPFILE命令,并编辑得到的文本PFILE,修改所需的设置。然后启动数据库,使用
PFILE=<FILENAME>选项指定要使用这个PFILE而不是SPFILE。完成后,可以正常地启动,数据库又会使用SPFILE。
q
维护修改历史,在注释中记录修改。过去,许多DBA会在参数文件中加大量的注释,来记录修改历史。例如,如果一年内把缓冲区缓存大小修改过20次,在
db_cache_size init.ora参数设置前就会有20条注释,这些注释会指出修改的日期,以及修改的原因。SPFILE不支持这样做,但是如果习惯了以下用法,也可以达到同样的效果:

通过这种方式,修改历史就会在一系列参数文件中长久保存。
5. 修正被破坏的SPFILE
关于SPFILE还有最后一个问题,“SPFILE是二进制文件,如果SPFILE被破坏了,数据库无法启动,那该怎么办?还是
init.ora文件更好一些,至少它是文本文件,我们可以直接编辑和修正”。嗯,这么说吧,SPFILE不会像数据文件、重做日志文件、控制文件等那样被破坏,但是,倘若真的发生了这种情况,还是有几种选择的。
首先,SPFILE中的二进制数据量很小。如果在UNIX平台上,只需一个简单的
strings命令就能提取出所有设置:

在
Windows
上,则要用
write.exe
(
WordPad
,即写字板)打开这个文件。
WordPad
会显示出文件中的所有文本,只需将其剪切并粘贴到
init<ORACLE_SID>.ora
中,就能创建启动实例的
PFILE
。
万一SPFILE丢失了(不论是什么原因,反正我没有见过SPFILE消失的情况),还可以从数据库的警告日志恢复参数文件的信息(稍后将介绍警告日志的更多内容)。每次启动数据库时,警告日志都会包含如下一部分内容:


通过这一部分内容,可以很容易地创建一个PFILE,再用
CREATE SPFILE命令将其转换为一个新的SPFILE。