oracle spfile pfile 的相互转换与oracle启动

大家都知道,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 < initorcl.ora
> 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>

你可能感兴趣的:(oracle)