探索Oracle pfile和spfile的祕密

wuweilong發表於2012-05-03
判斷ORACLE啟動時使用spfile還是pfile
  
 
 自Oracle 9i以後啟動的時候預設使用的初始化檔案是spfile,我們可以通過如下三種方式來判斷是SPFILE還是PFILE方式啟動資料庫。
1、show parameter spfile
2、show parameter pfile
3、看v$spparameter檢視
1、通過檢視spfile、pfile檢視
 
 用spfile啟動資料庫:
SQL> show parameter pfile;
NAME                                 TYPE     VALUE
------------------------------------ -------- ------------------------------
spfile                               string   C:\ORACLE\PRODUCT\10.2.0\DB_1\
                                              DATABASE\SPFILEWWL.ORA
SQL> show parameter spfile;
NAME                                 TYPE     VALUE
------------------------------------ -------- ------------------------------
spfile                               string   C:\ORACLE\PRODUCT\10.2.0\DB_1\
                                              DATABASE\SPFILEWWL.ORA
 
 用pfile啟動資料庫
SQL> startup pfile=c:\initwwl.ora
ORACLE instance started.
Total System Global Area 1610612736 bytes
Fixed Size                  2066080 bytes
Variable Size             385878368 bytes
Database Buffers         1207959552 bytes
Redo Buffers               14708736 bytes
Database mounted.
Database opened.
SQL> col type format a8
SQL> show parameter pfile;
NAME                                 TYPE     VALUE
------------------------------------ -------- ------------------------------
spfile                               string
SQL> show parameter spfile;
NAME                                 TYPE     VALUE
------------------------------------ -------- ------------------------------
spfile                               string
SQL>
 
 
我們在這裡可以很明顯的發現,使用spfile啟動資料庫,在檢視show parameter pfile和show parameter spfile 都能看到spfile引數檔案的路徑。
反之使用pfile啟動的資料庫,我們無論是檢視show parameter pfile還是show parameter spfile 都無法看到pfile引數檔案的路徑。
 
 
2、通過v$spparameter檢視
   使用spfile啟動資料庫,我們可以看到查詢出來的結果是spfile
SQL> select decode(count(*),1,'spfile','pfile') from v$spparameter where rownum=1 and isspecified = 'TRUE';
 
DECODE(COUNT
------------
spfile
 
 
 使用pfile啟動資料庫,我們可以看到查詢出來的結果是pfile。
SQL> select decode(count(*),1,'spfile','pfile') from v$spparameter where rownum=1 and isspecified ='TRUE';
DECODE(COUNT
------------
pfile
 
 
自9i後,資料庫預設使用spfile啟動,但是我們也可以指定通過pfile的方式啟動。而且pfile和spfile是可以互相轉換的,並且轉換的話要應用到資料庫必須重啟資料庫。
 
   從spfile建立pfile
SQL> create pfile from spfile;
 
File created.
 
 從pfile建立spfile
SQL> create spfile from pfile;
 
File created.

如果在資料庫的$ORACLE_HOME/dbs/目錄下既有spfile又有pfile,使用spfile啟動資料庫,不需要指定引數檔案路徑(因為資料庫會優先選擇spfile啟動),使用pfile啟動,則需指定完整路徑,如例項1。如果引數檔案不在$ORACLE_HOME/dbs/目錄下,無論是通過spfile或pfile啟動均需要指定完整路徑。
  例項1:
SQL> startup pfile=$ORACLE_HOME/dbs/initorcl.ora
ORACLE instance started.
 
Total System Global Area 422670336 bytes
Fixed Size 1300352 bytes
Variable Size 306186368 bytes
Database Buffers 109051904 bytes
Redo Buffers 6131712 bytes
Database mounted.
Database opened.
 
SQL> show parameter spfile;
 
                NAME                        TYPE              VALUE
------------------------------------ ---------- ------------------------------
                spfile                        string
 
SQL> show parameter pfile;
 
                NAME                        TYPE              VALUE
------------------------------------ ---------- ------------------------------
                spfile                         string
 
 
 
show parameter spfile和show parameter pfile結果仍然一樣,此時spfile的值為NULL了。
 
 
 
SQL> select decode(count(*),1,'spfile','pfile') from v$spparameter where rownum=1 and isspecified = 'TRUE';
 
DECODE(COUNT
------------
pfile

 
 
spfile和pfile的區別
  
     就Oracle的spfile和pfile的區別主要是spfile的修改是可以線上的,而pfile的修改必須關閉資料庫,到引數檔案所在路徑下通過vi或記事本等文字編輯工具修改。(因為引數檔案裡面的內容太多,編輯起來容易導致錯誤的編輯到其它的引數,從而導致資料庫無法起來,所以在9i以前一般都是要備份pfile後再來做引數的修改,而且修改任何引數都需要停庫,非常的不方便;在9i以後的spfile就可以同通過命令修改指定的引數了,而且有很多引數都不用重啟資料庫,能夠線上生效,這個線上生效的引數會隨著資料庫的版本增高而增加。如果引數修改有問題資料庫起不來了可以在nomount狀態下建立成pfile再修改回來即可。)
 
修改spfile引數的三種模式:
scope=both       立即並永久改變,(預設模式)
scope=spfile     下次啟動執行新的改變。
scope=memory     立即臨時改變下次啟動新引數失效

spfile 修改的方法:
SQL> alter system set processes = 100 scope=both;                  ----該引數不支援動態修改,必須修改完後重啟資料庫
alter system set processes = 100 scope=both
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
-------------------------------------------------------------------------------------------------------------------------------
SQL> show parameter pga;
NAME                                 TYPE     VALUE
------------------------------------ -------- ------
pga_aggregate_target                 big inte 798M
                                     ger
SQL> alter system set pga_aggregate_target = 500m scope=both;      -----該引數支援動態修改,所以就立即生效了
System altered.
SQL> show parameter pga;
NAME                                 TYPE     VALUE
------------------------------------ -------- ------
pga_aggregate_target                 big inte 500M
                                     ger
SQL>
 
SQL> alter system set processes = 100 scope=spfile;                ----修改完後重啟資料庫能生效,不信你試試。
System altered.
SQL> alter system set pga_aggregate_target = 700m scope=spfile;    ----當然也可以選擇資料庫下次啟動的時候生效。
System altered.

SQL> alter system set processes = 100 scope=memory;                ----因為該引數不支援動態修改,同樣也就無法實現立即生效,下次啟動失效。
alter system set processes = 100 scope=memory
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified

SQL>
SQL> alter system set pga_aggregate_target = 600m scope=memory;    ---因為該引數支援動態修改,當然也就可以實現立即生效,下次啟動失效咯。
System altered.
SQL>
 
 

如果使用的是pfile則無法通過命令進行修改,會報ORA-02095或32001錯誤。
SQL> alter system set processes = 100;
alter system set processes = 100
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified

SQL> alter system set processes = 100 scope=spfile;
alter system set processes = 100 scope=spfile
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE specified at startup

SQL> alter system set processes = 100 scope=both;
alter system set processes = 100 scope=both
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified

SQL> alter system set processes = 100 scope=memory;
alter system set processes = 100 scope=memory
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified

SQL>
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20674423/viewspace-722669/,如需轉載,請註明出處,否則將追究法律責任。

相關文章