Oracle 参数文件是包含一系列参数和对应参数值的文件,分成两类:
Initialization Parameters File(初始化参数文件) Oracle 9i之前的版本。
Server Parameters File(服务参数文件)Oracle 9i之后引入该参数文件。
通过对比两个文件类型可以看出 spfile是数据类型的二进制文件,而pfile则是ASCII文本文件
[oracle@021Y-SH-BKAP dbs]$ file initorcl.ora initorcl.ora: ASCII text [oracle@021Y-SH-BKAP dbs]$ file spfileorcl.ora spfileorcl.ora: data
pfile文件中的涉及的参数需要通过系统编辑工具编辑后,重启数据库对参数文件的改动内容进行加载。9i引入spfile之后,可以在数据库内通过ALTER SYSTEM/SESSION语句直接修改,并选择修改后的应用范围(内存中或是该文件中),并且这些参数修改值的应用不需要重启数据库。
另外,Oracle的RMAN工具把spfile纳入到备份恢复体系中。
SPFILE 创建
Oracle 9i开始,缺省情况下,Oracle启动数据库时加载spfile,而SPFILE需要从PFILE中创建出来(原来可以参考数据库启动过程)。新建的SPFILE在下一次数据库启动时生效。
创建语法:
CREATE SPFILE[='SPFILE_NAME'] FROM PFILE[='PFILE_NAME'] OR CREATE PFILE[='PFILE_NAME'] FROM SPFILE[='SPFILE_NAME']
如果不指定名称,通过默认的名字是spfile+实例名组成文件名称。
SPFILE的默认创建路径是$ORACLE_HOME/dbs
此外,Oracle还引入V$SPPARAMETER视图来显示SPFILE的内容。
比如:
SQL> create spfile='chinaman.ora' from pfile; File created. SQL> host [oracle@021Y-SH-BKAP dbs]$ ll chinaorcl.ora -rw-r----- 1 oracle oinstall 2560 Jan 20 09:09 chinaorcl.ora
盖国强书中提到SPFILE没有锁定的问题,在11G下已经得到解决:
SQL> host mv spfileorcl.ora spfileorcl.ora.bak SQL> alter system set db_cache_size=24M scope=spfile; alter system set db_cache_size=24M scope=spfile * ERROR at line 1: ORA-01565: error in identifying file '/DBBK/oracle/product/11.2.0.1.0/dbs/spfileorcl.ora' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 SQL> host mv spfileorcl.ora.bak spfileorcl.ora SQL> alter system set db_cache_size=24M scope=spfile; System altered.
不论如何,记住备份的重要性,甚至是SPFILE也要记得定期备份。
至于数据库的启动时默认查找并加载SPFILE的顺序如下(LINUX为例):
1、$ORACLE_HOME/dbs/spfile<Instance_name>.ora
2、$ORACLE_HOME/dbs/spfile.ora
3、$ORACLE_HOME/dbs/init<Instance_name>.ora
实验:
[oracle@021Y-SH-BKAP dbs]$ mv spfileorcl.ora spfileorcl.ora.bak [oracle@021Y-SH-BKAP dbs]$ mv initorcl.ora initorcl.ora.bak [oracle@021Y-SH-BKAP dbs]$ mv init.ora init.ora.bak [oracle@021Y-SH-BKAP dbs]$ !sqlplus SQL> startup nomount; ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file '/DBBK/oracle/product/11.2.0.1.0/dbs/initorcl.ora' SQL> host mv initorcl.ora.bak initorcl.ora SQL> startup nomount; ORACLE instance started. Total System Global Area 6680915968 bytes Fixed Size 2213936 bytes Variable Size 3556771792 bytes Database Buffers 3087007744 bytes Redo Buffers 34922496 bytes 把spfile<Instance_name>修改为spfile.ora启动数据库到mount状态发现,系统读取的是spfile.ora,而不是initorcl.ora SQL> !mv spfileorcl.ora.bak spfile.ora SQL> startup nomount; ORACLE instance started. Total System Global Area 6680915968 bytes Fixed Size 2213936 bytes Variable Size 3758098384 bytes Database Buffers 2885681152 bytes Redo Buffers 34922496 bytes SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ spfile string /DBBK/oracle/product/11.2.0.1. 0/dbs/spfile.ora 拷贝spfile.ora成spfile<Instance_name>.ora再次重启。 SQL> !cp spfile.ora spfileorcl.ora SQL> !ls spfile* spfile.ora spfileorcl.ora SQL> !ls -l spfile* -rw-r----- 1 oracle oinstall 3584 Jan 20 09:54 spfile.ora -rw-r----- 1 oracle oinstall 3584 Jan 20 09:57 spfileorcl.ora SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ spfile string /DBBK/oracle/product/11.2.0.1. 0/dbs/spfileorcl.ora
可以看到加载的是spfile<Instance_name>.ora而不是spfile.ora和initorcl.ora文件。
如果想通过手动指定PFILE的方式启动数据库,可以使用以下语句:
STARTUP PFILE='PATH/TO/PFILE_NAME.ORA'
可以再PFILE文件中显示的指明SPFILE路径,此时PFILE会链接到SPFILE,这时以PFILE启动时,会先读取SPFILE文件中的参数设置内容,如果在PFILE中又定义了与SPFILE相同的参数,则以最后读取的参数配置值为准。
[oracle@021Y-SH-BKAP dbs]$ vi initorcl.ora SPFILE='/DBBK/oracle/product/11.2.0.1.0/dbs/spfileorcl.ora' orcl.__db_cache_size=2885681152