大家都知道,spfile是oracle使用的二进制文件,pfile是可编辑文件。并且我们可以通过create pfile/spfile from spile/pfile来进行相互转换。但是大家知道这个相互转换的功能是sqlplus提供的吗?意思是什么呢,就是说我们可以在oracle shutdown的条件下执行创建语句。我以前每次执行这条语句的时候,都首先把oracle启动起来,现在想想,真是笨死了。O(∩_∩)O哈哈~。
下面通过实验,来验证几个参数文件使用中的方式。
简单的诸如startup pfile='xxxxx'就不说了,我们来说一些有意思的事。
先来看看全貌
SYS@_connect_identifier>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@_connect_identifier>create pfile from spfile='spfileorcl.ora';
pfile的内容如下。
orcl.__db_cache_size=92274688
orcl.__java_pool_size=4194304
orcl.__large_pool_size=209715200
orcl.__oracle_base='/home/oracle/app/oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=4194304
orcl.__sga_target=478150656
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=159383552
orcl.__streams_pool_size=0
*.audit_file_dest='/home/oracle/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/home/oracle/app/oracle/oradata/orcl/control01.ctl','/home/oracle/app/oracle/fast_recovery_area/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/home/oracle/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/home/oracle/app/oracle'
*.dispatchers='(PROTOCOL=TCP)(SERVICE=orclXDB)(DISPATCHERS=3)'
*.fast_start_mttr_target=0
*.local_listener=''
*.log_archive_dest_1='location=/home/oracle/app/oracle/product/11.2.0/dbhome_1/log/archive'
*.log_archive_start=FALSE
*.log_checkpoints_to_alert=FALSE
*.memory_target=481296384
*.open_cursors=300
*.processes=500
*.remote_login_passwordfile='EXCLUSIVE'
*.remote_os_authent=TRUE
*.resumable_timeout=2
*.shared_servers=3
*.undo_tablespace='UNDOTBS1'
SYS@_connect_identifier>show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name stringorcl
编辑pfile文件,加上*.db_unique_name='orcluni'
以pfile创建spfileorcl0621.ora
SYS@_connect_identifier>create spfile='spfileorcl0621.ora' from pfile;
然后移除spfile文件
[oracle@localhost dbs]$ ls spfileorcl*
spfileorcl0621.ora spfileorcl.ora.old
编辑pfile,使之指向spfileorcl0621.ora
[oracle@localhost dbs]$ cat <
> SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
> EOF
[oracle@localhost dbs]$ more initorcl.ora
SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
[oracle@localhost dbs]$
SYS@_connect_identifier>startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 480182272 bytes
Fixed Size 2254424 bytes
Variable Size 369101224 bytes
Database Buffers 100663296 bytes
Redo Buffers 8163328 bytes
Database mounted.
Database opened.
SYS@_connect_identifier>show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string/home/oracle/app/oracle/produc
t/11.2.0/dbhome_1/dbs/spfileor
cl0621.ora
SYS@_connect_identifier>
SYS@_connect_identifier>show parameter unique
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name stringorcluni
看到了吧,参数文件通过pfile引用到了spfile文件。这也是RAC中常用的方式。将spfile文件存储在一个共享磁盘中,然后通过各个实例的pfile文件引用,实现多实例共用同一个spfile文件,避免了多实例间的参数不一致导致无法启动的问题。
我们再来看看更有意思的事:
创建spfileorcl.ora
SYS@_connect_identifier>create spfile from pfile;
File created.
SYS@_connect_identifier>!strings spfileorcl.ora
*.SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
SYS@_connect_identifier>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@_connect_identifier>!mv initorcl.ora initorcl.ora.old
SYS@_connect_identifier>!ls *orcl*
hc_orcl.dat initorcl.ora.old orapworcl pfileorcl.ora spfile_manual_orcl.ora spfileorcl.ora
hc_orcltest.dat initorcltest.ora orapworcl.old snapcf_orcl.f spfileorcl0621.oraspfileorcl.ora.old
SYS@_connect_identifier>startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 480182272 bytes
Fixed Size 2254424 bytes
Variable Size 369101224 bytes
Database Buffers 100663296 bytes
Redo Buffers 8163328 bytes
Database mounted.
Database opened.
SYS@_connect_identifier>show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string/home/oracle/app/oracle/produc
t/11.2.0/dbhome_1/dbs/spfileor
cl.ora
SYS@_connect_identifier>show parameter unique
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name stringorcluni
SYS@_connect_identifier>
注意看上面,这里显示了使用spfileorcl.ora参数文件,但是db_unique_name却是orcluni,这是非默认的参数,我们修改过的。所以可以得出结论:oracle通过spfile引用到了另外一个自定义的spfile0621.ora参数文件。
继续,我们来往spfile文件中修改参数
SYS@_connect_identifier>alter system reset db_unique_name scope=spfile;
alter system reset db_unique_name scope=spfile
*
ERROR at line 1:
ORA-32000: write to SPFILE requested but SPFILE is not modifiable
这个错误说明,我们通过spfile引用到另一个自定义的spfile,虽然可以启动oracle,但是不能修改参数。
网络上有另外一种声音,说是可以编辑掉spfile的乱码,而后就能修改,我们来实验:
先看看原型
[oracle@localhost dbs]$ vi spfileorcl.ora
C"^@^@^A^@^@^@^@^@^@^@^@^@^A^Dö ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^B^@^@S^@^@^@os<8b>6^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^AC^@^@C"^@^@^B^@^@^@^@^@^@^@^@^@^A^D^Nf^@^@*.SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^AC^@^@C"^@^@^C^@^@^@^@^@^@^@^@^@^A^D@e^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^AC^@^@
我们通过vi编辑掉乱码,仅保留string部分
变成这样
*.SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
SYS@_connect_identifier>!mv initorcl.ora initorcl.ora.old
SYS@_connect_identifier>!ls
afiedt.buf hc_test.dat initorcl.ora.old lkORCL log2test.dbf orapworcl.old snapcf_orcl.f spfileorcl.ora
cntrltest.dbf hc_wangfeng.dat initorcltest.oralkORCLUNI orapwDBUA5825119 pfile_1512051538.ora spfile_manual_orcl.ora spfileorcl.ora.old
hc_orcl.dat initDBUA5825119.ora lkinstwangfenglkTEST orapwDBUA5916172pfile.ora spfile.ora.old
hc_orcltest.dat initDBUA5916172.ora lkORC87654321log1test.dbf orapworcl pfileorcl.ora spfileorcl0621.ora
SYS@_connect_identifier>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@_connect_identifier>startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl.ora'
SYS@_connect_identifier>
这个报错的逻辑是这样的,oracle根据参数启动顺序,先找了spfileorcl.ora,再找了spfile.ora,最后找到了initorcl.ora,一路下来没找到可用的就抛错误出来。说明了,我们编辑后的spfileorcl.ora,oracle是不认的。怎么样,网络上的言论,不能全信!
结论就是,我们需要通过pfile来引用spfile。尽管通过spfile来引用spfile可以启动数据库,但是不能修改参数。并且,手动编辑后的spfile,oracle是不买账的。
另外一点,我们可以用形如下面的pfile,来覆盖某些在spfile中定义的参数。
[oracle@localhost dbs]$ more initorcl.ora
SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
*.db_unique_name='orclnew'
[oracle@localhost dbs]$
SYS@_connect_identifier>startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 480182272 bytes
Fixed Size 2254424 bytes
Variable Size 369101224 bytes
Database Buffers 100663296 bytes
Redo Buffers 8163328 bytes
Database mounted.
Database opened.
SYS@_connect_identifier>show parameter unique
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name stringorclnew
SYS@_connect_identifier>
看到了吧,这里后定义的db_unique_name参数覆盖了spfileorcl0621.ora中定义的参数值。
当我们因为某个参数设置不正确,导致oracle不能启动时,可以通过这种方法将其覆盖掉。实例启动后,通过alter system的方式再来修改。
SYS@_connect_identifier>show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /home/oracle/app/oracle/produc
t/11.2.0/dbhome_1/dbs/spfileor
cl0621.ora
SYS@_connect_identifier>alter system set db_unique_name=orcl0621;
alter system set db_unique_name=orcl0621
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
SYS@_connect_identifier>alter system set db_unique_name=orcl0621 scope=spfile;
System altered.
[oracle@localhost dbs]$ cat <initorcl.ora
> SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
> !
[oracle@localhost dbs]$ more initorcl.ora
SPFILE='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl0621.ora'
[oracle@localhost dbs]$
SYS@_connect_identifier>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@_connect_identifier>startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 480182272 bytes
Fixed Size 2254424 bytes
Variable Size 369101224 bytes
Database Buffers 100663296 bytes
Redo Buffers 8163328 bytes
Database mounted.
Database opened.
SYS@_connect_identifier>show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /home/oracle/app/oracle/produc
t/11.2.0/dbhome_1/dbs/spfileor
cl0621.ora
SYS@_connect_identifier>show parameter unique
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string ORCL0621
SYS@_connect_identifier>