4.3 动态参数文件
从Oracle 9i开始,Oracle引入了所谓动态的初始化参数文件,Oracle为该文件取名叫做spfile。之所以引入spfile,主要就是为了能够弥补pfile的缺点,比如修改参数以后,如果重启实例,则丢失所做的修改等。同时,从Oracle 9i起引入了很多自动调整的参数,而这些参数都需要使用spfile。而且RMAN能够对spfile进行自动备份,而pfile只能由我们手工进行备份。
该spfile相对于pfile来说是一个二进制的文件,尽管我们可以使用文本编辑器打开该spfile,但是我们不能直接编辑它。如果我们编辑完毕spfile并保存,则该spfile被破坏,不能再使用。
从Oracle 9i开始,如果我们直接发出startup的命令,则Oracle会先去默认目录下找spfileSID.ora文件;如果没有找到,则找spfile.ora文件;如果没有,则找initSID.ora文件;如果没有,则找init.ora文件;如果还没有找到,则显示错误消息。也就是说,相对Oracle 9i之前的情况,Oracle会多找两个文件。当然,startup pfile=/u01/app/oracle/my_init.ora这样的写法还是得到支持的。
创建spfile时,我们需要借助pfile。也就是要先有pfile,然后再根据pfile来创建spfile。其命令如下所示:
CREATE SPFILE [='SPFILE-NAME'] FROM PFILE[='PFILE-NAME'];
像这里所显示的,我们可以不写spfile以及pfile的具体路径,而是直接发出create spfile from pfile的命令。这样的话,Oracle会到默认目录下找默认的pfile,并在默认目录下生成默认的spfile。我们只需要以系统管理员的身份连入数据库,就可以运行该命令。该命令与数据库实例是否启动没有任何关系,可以在数据库实例没有启动的情况下创建spfile。
SQL> !ls $ORACLE_HOME/dbs orapwora10g SQL> create spfile from pfile='/u01/app/oracle/my_init.ora'; File created. SQL> !ls $ORACLE_HOME/dbs orapwora10g spfileora10g.ora SQL> startup
当我们启动数据库时,就将以spfileora10g.ora来启动了。如果要验证数据库是否采用了spfile进行启动,可以非常简单地执行下面的命令,从而显示初始化参数spfile的值:
SQL> show parameter spfile NAME TYPE VALUE --------- ------- ---------------------------------------------------------- spfile string /u01/app/oracle/product/10.2.0/db_1/dbs/spfileora10g.ora
很明显,我们使用了spfileora10g.ora来启动实例。如果使用spfile来启动实例,则我们只能使用Oracle提供的命令来修改spfile里所记录的参数值。其语法格式如下所示:
ALTER SYSTEM SET parameter_name = parameter_value [COMMENT 'text'] [SCOPE = MEMORY|SPFILE|BOTH] [SID= 'sid'|'*']
在该命令中,COMMENT表示为该参数所做的备注,可以从v$spparameter里看到该备注。SCOPE表示修改参数的范围,有三个取值:MEMORY表示只修改当前内存里的配置,不修改spfile里的配置;SPFILE表示只修改spfile里的配置,不修改内存里的配置;BOTH表示内存和spfile同时修改,BOTH是默认值。而SID则用在RAC环境中,表示希望该配置对哪个实例生效,默认为*,也就是所有实例。
SQL> show parameter shared_pool_size NAME TYPE VALUE ----------------- ----------- ------------- shared_pool_size big integer 72M SQL> alter system set shared_pool_size=80M comment='my test'; SQL> show parameter shared_pool_size NAME TYPE VALUE ----------------- ----------- ------------- shared_pool_size big integer 80M SQL> select value,UPDATE_COMMENT from v$spparameter where name='shared_pool_size'; VALUE UPDATE_COMMENT ------------- --------------------- 83886080 my test
我们不仅可以根据pfile创建spfile,还可以根据spfile来创建pfile。使用的命令如下所示:
CREATE PFILE [='PFILE-NAME'] FROM SPFILE[='SPFILE-NAME'];
比如,我们将当前实例的spfile导出到/u01下,并打开所导出的pfile。
SQL> create pfile='/u01/init.ora' from spfile; SQL> !vi /u01/init.ora
我们可以看到导出的pfile内容为:
ora10g.__db_cache_size=100663296 ora10g.__java_pool_size=4194304 ora10g.__large_pool_size=4194304 ora10g.__shared_pool_size=54525952 ora10g.__streams_pool_size=0 *.audit_file_dest='/u01/app/oracle/admin/ora10g/adump' *.db_block_size=8192 *.db_domain='' *.db_file_multiblock_read_count=16 *.db_name='ora10g' ...........
可以很明显地看到,从spfile导出的pfile内容与Oracle 9i之前的pfile内容有了很大的不同。主要体现在每个参数前都有了一个前缀:*表示该初始化参数对所有实例都生效;ora10g表示只对名为ora10g的实例生效。
当我们设置参数的值时,指定scope=spfile,但同时又无意中设置了错误的参数值。则下次使用该spfile启动数据库时,由于其包含错误的参数值导致数据库无法启动时,这时数据库还没有启动起来,所以我们不能通过alter system set的方式将错误的参数值修改成正确的值。因此,这时,我们只能先将spfile里的参数设置导出成文本文件的pfile,然后采用文本编辑器对错误参数进行修改,修改完毕以后,再根据pfile创建为spfile。这样,才能再次使用spfile启动数据库。我们来看下面的例子。
SQL> alter system set sga_target=10000000M scope=spfile; SQL> shutdown SQL> startup ORA-27102: out of memory
由于我们将sga_target错误的设置为10000000MB,已经超出了物理内存的大小,因此启动时报告超出内存的错误。这时我们试图对该参数进行修改,则会报错。
SQL> alter system set sga_target=200M scope=spfile; alter system set sga_target=200M scope=spfile * ERROR at line 1: ORA-01034: ORACLE not available
这时,我们只有先将当前的spfile导出到pfile,编辑pfile以后再转回到spfile。
SQL> create pfile='/u01/init.ora' from spfile; SQL> !echo '*.sga_target=200M' >> /u01/init.ora SQL> create spfile from pfile='/u01/init.ora'; SQL> startup
除了在默认目录下放置默认名称的spfile,我们还有一种使用spfile的方式,就是在pfile里指定spfile参数,因为spfile本身就是一个初始化的参数。比如我们可以在pfile里指定:
spfile=/home/Oracle/initora10g.ora
这样的话,当我们以pfile启动数据库时,同样会使用spfile来存放初始化参数。如果在spfile条目的上面,我们还定义了其他的初始化参数,而这些参数在spfile里也定义了,那么就像前面所描述的那样,后面定义的参数值覆盖前面定义的参数值。