Oracle中的pfile和spfile詳解

在9i 以前,Oracle 使用pfile 存儲初始化參數配置,這些參數在實例啓動時被讀取,任何修改需要重起實例才能生效;使用spfile 您能夠使用ALTER SYSTEM 或ALTER SESSION來動態修改那些可動態修改的參數,任何更改能夠立即生效,您能夠選擇使更改只應用於當前實例還是同時應用到spfile。這就使得任何對spfile 的修改都能夠在命令行完成,我們能夠完全告別手工修改初始化參數文檔,這就大大減少了人爲錯誤的發生。
SPFILE 是個二進制文檔,能夠使用RMAN 進行備份,這樣實際上Oracle 把參數文檔也納入了備份恢復管理。
除了第一次啓動數據庫需要PFILE(然後能夠根據PFILE 創建SPFILE),我們能夠不再需要PFILE,ORACLE 強烈推薦使用spfile,應用其新特性來存儲和維護初始化參數配置。

一. 創建SPFILE
缺省的,ORACLE 使用PFILE 啓動數據庫,SPFILE 必須由PFILE 創建,新創建的SPFILE在下一次啓動數據庫時生效,CREATE SPFILE 需要SYSDBA 或SYSOPER 的權限:
語法如下:
CREATE SPFILE[=’SPFILE-NAME’] FROM PFILE[=’PFILE-NAME’]
例:
SQL> create spfile from pfile;
缺省的,spfile 創建到系統缺省目錄
(Unix: $ORACLE_HOME/dbs; NT: $ORACLE_HOME/database)
假如SPFILE 已存在,那麼創建會返回以下錯誤:
SQL> create spfile from pfile;
create spfile from pfile
*
ERROR 位於第1 行:
ORA-32002: 無法創建已由例程使用的SPFILE,這也能夠用來判斷當前是否使用了SPFILE 文檔。
然而意外的時,Oracle 並沒有向其他文檔相同,在運行期間保持鎖定,讓我們作以下試驗:
SQL> host rename SPFILEEYGLEN.ORA SPFILEEYGLEN.ORA.BAK
SQL> alter system set db_cache_size=24M scope=both;
系統已更改。
SQL> host dir *.ora
驅動器E 中的卷是Doc
卷的序列號是980C-8EFF
E:/Oracle/Ora9iR2/database 的目錄
2003-02-10 14:35 2,048 PWDeyglen.ORA
1 個文檔2,048 字節
0 個目錄150,347,776 可用字節
SQL> alter system set db_cache_size=24M scope=spfile;
alter system set db_cache_size=24M scope=spfile
*
ERROR 位於第1 行:
ORA-27041: 無法打開文檔
OSD-04002: 無法打開文檔
O/S-Error: (OS 2) 系統很難找到指定的文檔。
SQL> host rename SPFILEEYGLEN.ORA.BAK SPFILEEYGLEN.ORA
SQL> alter system set db_cache_size=24M scope=spfile;
系統已更改。
SQL>
估計Oracle 以後會想辦法來鎖定這個文檔。

二. 使用SPFILE
重新啓動數據庫,使用startup 命令,Oralce 將會按照以下順序在缺省目錄中搜索參數文檔:
a. spfile${ORACLE_SID}.ora
缺省目錄UNIX: ${ORACLE_HOME}/dbs/
NT: ${ORACLE_HOME}/database
b. spfile.ora
缺省目錄UNIX: ${ORACLE_HOME}/dbs/
NT: ${ORACLE_HOME}/database
c. init${ORACLESID}.ora
缺省目錄UNIX: ${ORACLE_HOME}/dbs/
NT: ${ORACLE_HOME}/database or
${ORACLE_HOME}/admin/db_name/pfile/
創建了spfile,重新啓動數據庫,Oracle 會按順序搜索以上目錄,spfile 就會自動生效。

三. 使用pfile/spfile 啓動數據庫
假如您想使用pfile 啓動數據庫,您能夠在啓動時指定pfile 或刪除spfile.
SQL> startup pfile='E:/Oracle/admin/eyglen/pfile/init.ora';
您不能以同樣的方式指定spfile,但是能夠創建一個包含spfile 參數的pfile 文檔,指向spfile.
SPFILE 是個自Oracle9i 引入的初始化參數,類似於IFILE 參數。SPFILE 參數用於定義非缺省路徑的spfile 文檔。
您能夠在PFILE 鏈接到SPFILE 文檔,同時在PFILE 中定義其他參數,假如參數重複配置,後讀取的參數將取代先前的配置。
PFILE 參數的使用,例如:
這是我們使用SPFILE 啓動的榭觶?br> SQL> startup
ORACLE 例程已啓動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
數據庫裝載完畢。
數據庫已打開。
SQL> show parameter log_archive_start
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
log_archive_start boolean
TRUE
SQL> show parameter spfile
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
spfile string
%ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA
SQL>
我們修改PFILE 文檔內容如下:
#Pfile link to SPFILE
SPFILE= 'E:/Oracle/Ora9iR2/database/SPFILEEYGLEN.ORA'
log_archive_start = false
能夠預見這個log_archive_start 參數配置將會代替SPFILE 中的配置:
SQL> startup pfile='e:/initeyglen.ora'
ORACLE 例程已啓動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
數據庫裝載完畢。
數據庫已打開。
SQL> show parameter spfile
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
spfile string
E:/Oracle/Ora9iR2/database/SPFILEEYGLEN.ORA
SQL> show parameter log_archive_start
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
log_archive_start boolean
FALSE
然後我們能夠使用ALTER SYSTEM 方式將修改固定到SPFILE.
SQL> alter system set log_archive_start=false scope=spfile;
系統已更改。
所以您也能夠通過如上方式在啓動時修改初始化參數。比我們在本文最後介紹的導入導出方法要簡便的多。

四. 修改參數
能夠通過ALTER SYSTEM 或導入導出來更改SPFILE 的內容。
ALTER SYSTEM 增加了一個新選項:SCOPE。SCOPE 參數有三個可選值:
MEMORY ,SPFILE , BOTH
MEMORY:只改變當前實例運行
SPFILE:只改變SPFILE 的配置
BOTH:改變實例及SPFILE
1. SCOPE=MEMORY
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
TRUE
SQL> ALTER SYSTEM SET timed_statistics=FALSE SCOPE=MEMORY;
系統已更改。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
FALSE
SQL> shutdown immediate
數據庫已關閉。
已卸載數據庫。
ORACLE 例程已關閉。
SQL> startup
ORACLE 例程已啓動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
數據庫裝載完畢。
數據庫已打開。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
TRUE
2. SCOPE=SPFILE
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
TRUE
SQL> ALTER SYSTEM SET timed_statistics=FALSE SCOPE=SPFILE;
系統已更改。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
TRUE
SQL> shutdown immediate
數據庫已關閉。
已卸載數據庫。
ORACLE 例程已關閉。
SQL> startup
ORACLE 例程已啓動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
數據庫裝載完畢。
數據庫已打開。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
FALSE
SQL>
3. SCOPE = BOTH
使用BOTH 選項實際上等同於不帶參數的ALTER SYSTEM 語句。
注意:假如修改靜態參數,那麼需要指定SPFILE 參數,否則將會報錯。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
FALSE
SQL> ALTER SYSTEM SET timed_statistics=TRUE SCOPE=BOTH;
系統已更改。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
TRUE
SQL> shutdown immediate
數據庫已關閉。
已卸載數據庫。
ORACLE 例程已關閉。
SQL> startup
ORACLE 例程已啓動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
數據庫裝載完畢。
數據庫已打開。
SQL> show parameter timed_statistics
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
timed_statistics boolean
TRUE
SQL> ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH;
ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH
*
ERROR 位於第1 行:
ORA-02095: 無法修改指定的初始化參數
SQL> ALTER SYSTEM SET sql_trace=FALSE SCOPE=SPFILE;
系統已更改。
4.您也能夠在數據庫shutdown 時創建和修改spfile,例如:
SQL> show sga
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> shutdown immediate
數據庫已關閉。
已卸載數據庫。
ORACLE 例程已關閉。
SQL> create pfile from spfile;
文檔已創建。
SQL> create spfile from pfile;
文檔已創建。
SQL>

五. 是否使用了spfile
判斷是否使用了SPFILE,能夠使用以下方法:
1.查詢v$parameter 動態視圖,假如以下查詢返回空值,那麼您在使用pfile.
SQL> SELECT name,value FROM v$parameter WHERE name='spfile';
NAME
------------------------------------------------------------------
VALUE
------------------------------------------------------------------
spfile
%ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA
2.或您能夠使用SHOW 命令來顯示參數配置,假如以下結果value 列返回空值,那麼說明您在使用pfile:
SQL> SHOW PARAMETER spfile
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
spfile string
%ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA
3.查詢v$spparameter 視圖
假如以下查詢返回0 值,表示您在使用pfile,否則表明您使用的是spfile:
SQL> SELECT COUNT(*) FROM v$spparameter WHERE value IS NOT NULL;
COUNT(*)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章