1. 程式人生 > 資料庫 >Oracle引數檔案—pfile與spfile

Oracle引數檔案—pfile與spfile

oracle的引數檔案:pfile和spfile

1、pfile和spfile
      Oracle中的引數檔案是一個包含一系列引數以及引數對應值的作業系統檔案。它們是在資料庫例項啟動時候載入的,決定了資料庫的物理結構、記憶體、資料庫的限制及系統大量的預設值、資料庫的各種物理屬性、指定資料庫控制檔名和路徑等資訊,是進行資料庫設計和效能調優的重要檔案。可以分為兩種型別:
    (1)pfile: 初始化引數檔案(Initialization Parameters Files),Oracle 9i之前,ORACLE一直採用pfile方式儲存初始化引數,pfile 預設的名稱為“init+例程名.ora”,檔案路徑:/data/app/oracle/product/12.1.0/dbhome_1/dbs,這是一個文字檔案,可以用任何文字編輯工具開啟。

    (2)spfile:伺服器引數檔案(Server Parameter Files),從Oracle 9i開始,Oracle引入了Spfile檔案,spfile 預設的名稱為“spfile+例程名.ora”,檔案路徑:/data/app/oracle/product/12.1.0/dbhome_1/dbs 以二進位制文字形式存在,不能用vi編輯器對其中引數進行修改,只能通過SQL命令線上修改。

      從作業系統上可以看到這兩者的區別,初始化引數檔案為ASCII文字檔案,Spfile為資料檔案。

[oracle@xqzt ~]$ cd /data/app/oracle/product/12.1.0/dbhome_1/dbs/
[oracle@xqzt dbs]$ ls
hc_orcl.dat init.ora lkORCL orapworcl spfileorcl.ora
[oracle@xqzt dbs]$ file init.ora 
init.ora: ASCII English text
[oracle@xqzt dbs]$ file spfileorcl.ora 
spfileorcl.ora: data
[oracle@xqzt dbs]$

2、使用spfile的好處
    (1)spfile改正了pfile管理混亂的問題,在多結點的環境裡,pfile會有多個image,啟動時候需要跟蹤最新的image。這是個煩瑣的過程。用spfile以後,所有引數改變都寫到spfile裡面(只要定義scope=spfile或both),引數配置有個權威的來源。
    (2)9i以前一般都是要備份pfile後再來做引數的修改,而且pfile的修改必須重啟例項才能生效。非常的不方便;在9i以後的spfile就可以同通過命令修改指定的引數了,而且有很多引數都不用重啟資料庫,能夠線上生效,這個線上生效的引數會隨著資料庫的版本增高而增加。如果引數修改有問題資料庫起不來了可以在 nomount狀態下建立成pfile再修改回來即可。)

3、如何檢視Spfile與pfile的目錄位置
方法一:

SQL> SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';

NAME           VALUE                                                    DISPLAY_VALUE
----------------------------------------------------------------------------------------------------------------------------------
spfile  /data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora   /data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
----------------------------------------------------------------------------------------------------------------------------------

方法二:

SQL> show parameter pfile

NAME           TYPE                         VALUE
------------------------------------------------------------------------------------
pfile          string   /data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
------------------------------------------------------------------------------------
SQL> show parameter spfile

NAME           TYPE                         VALUE
------------------------------------------------------------------------------------
spfile          string   /data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
------------------------------------------------------------------------------------

4、判斷Oracle啟動時使用spfile還是pfile
(1)通過v$spparameter檢視
使用spfile啟動資料庫,我們可以看到查詢出來的結果是spfile

SQL> select decode(count(*),1,'spfile','pfile') from v$spparameter where rownum=1 and isspecified ='TRUE';

DECODE
------
spfile

(2)通過檢視spfile、pfile引數
系統當前為從spfile啟動,在檢視show parameter pfile和show parameter spfile 都能看到spfile引數檔案的路徑:

SQL> show parameter pfile

NAME           TYPE                         VALUE
------------------------------------------------------------------------------------
pfile          string   /data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
------------------------------------------------------------------------------------
SQL> show parameter spfile

NAME           TYPE                         VALUE
------------------------------------------------------------------------------------
spfile          string   /data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
------------------------------------------------------------------------------------

關閉資料庫,從pfile啟動,startup pfile='/data/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl.ora'; 再次執行上述的兩個語句:

SQL> show parameter pfile

NAME           TYPE                         VALUE
------------------------------------------------------------------------------------
pfile          string   
------------------------------------------------------------------------------------
SQL> show parameter spfile

NAME           TYPE                         VALUE
------------------------------------------------------------------------------------
spfile          string   
------------------------------------------------------------------------------------

我們在這裡可以很明顯的發現,使用pfile啟動的資料庫,我們無論是檢視show parameter pfile還是show parameter spfile 都無法看到pfile引數檔案的路徑。

5、pfile和spfile的互相建立
create spfile[='xxxxx'] from pfile[='xxxx'];
create pfile[='xxxxx'] from spfile[='xxxx'];

SQL> create pfile from spfile ;

File created.

SQL>

通過spfile建立pfile檔案(此時會在$ORACLE_HOME/dbs目錄下生成pfile:initorcl.ora),當然你也可以指定引數檔案的位置。

[oracle@xqzt dbs]$ pwd
/data/app/oracle/product/12.1.0/dbhome_1/dbs
[oracle@xqzt dbs]$ ls
hc_orcl.dat  lkORCL     spfileorcl.ora
init.ora     initorcl.ora  orapworcl

6、使用pfile/spfile 啟動資料庫
(1)startup 啟動次序 spfile優先於pfile。查詢檔案的順序是 spfileSID.ora-〉spfile.ora-〉initSID.ora-〉init.ora(spfile優先於pfile)。
(2)startup pfile='檔案目錄'。使用pfile啟動,則需指定完整路徑,或刪除spfile.

SQL> startup pfile='/data/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl.ora';

ORACLE instance started.

Total System Global Area 2466250752 bytes

Fixed Size 2927384 bytes

Variable Size 1426064616 bytes

Database Buffers 1023410176 bytes

Redo Buffers 13848576 bytes

Database mounted.

Database opened.

SQL>

(3)如果在資料庫的$ORACLE_HOME/dbs/目錄下既有spfile又有pfile,使用spfile啟動資料庫,不需要指定引數檔案路徑(因為資料庫會優先選擇spfile啟動)

(4)如果引數檔案不在$ORACLE_HOME/dbs/目錄下,無論是通過spfile或pfile啟動均需要指定完整路徑。

7、spfile引數的三種scope
(1)scope=spfile: 對引數的修改記錄在伺服器初始化引數檔案中,修改後的引數在下次啟動DB時生效。適用於動態和靜態初始化引數。
(2)scope=memory: 對引數的修改記錄在記憶體中,對於動態初始化引數的修改立即生效。在重啟DB後會丟失,會復原為修改前的引數值。
(3)scope=both: 對引數的修改會同時記錄在伺服器引數檔案和記憶體中,對於動態引數立即生效,對靜態引數不能用這個選項
注:如果使用了伺服器引數檔案,則在執行alter system語句時,scope=both是default的選項。
如果沒有使用伺服器引數檔案,而在執行alter system語句時指定scope=spfile|both都會出錯。

8、修改引數例子
scope=both: 對於動態引數立即生效:

SQL> show parameter pga;

NAME                                   TYPE               VALUE

------------------------------------ ----------- ------------------------------

pga_aggregate_limit big                  integer            2G

pga_aggregate_target big                 integer          500M

SQL> alter system set pga_aggregate_target = 600m scope=both;


System altered.


SQL> show parameter pga;


NAME                                    TYPE                 VALUE

------------------------------------ ----------- ------------------------------

pga_aggregate_limit big                integer                 2G

pga_aggregate_target big               integer                600M

對靜態引數不能使用scope=both:

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>

靜態引數 scope=spfile 修改完後重啟資料庫能生效:

SQL> show parameter processes


NAME                                     TYPE                VALUE

------------------------------------ ----------- ------------------------------

aq_tm_processes                         integer                1

db_writer_processes                     integer                1

gcs_server_processes                    integer                0

global_txn_processes                    integer                1

job_queue_processes                     integer                1000

log_archive_max_processes               integer                4

processes                               integer                300

SQL> alter system set processes = 100 scope=spfile;


System altered.


SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 2466250752 bytes

Fixed Size 2927384 bytes

Variable Size 1358955752 bytes

Database Buffers 1090519040 bytes

Redo Buffers 13848576 bytes

Database mounted.

Database opened.

SQL> show parameter processes


NAME                                    TYPE                VALUE

------------------------------------ ----------- ------------------------------

aq_tm_processes                        integer                1

db_writer_processes                    integer                1

gcs_server_processes                   integer                0

global_txn_processes                   integer                1

job_queue_processes                    integer                1000

log_archive_max_processes              integer                4

processes                              integer                100

scope=memory 對於動態引數,可以實現立即生效,下次啟動失效:

SQL> alter system set pga_aggregate_target = 600m scope=memory;

System altered.

SQL>

如果使用的是pfile,則無法通過命令進行修改,會報ORA-02095或32001錯誤:

SQL> startup pfile='/data/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl.ora';

ORACLE instance started.

Total System Global Area 2466250752 bytes

Fixed Size 2927384 bytes

Variable Size 1426064616 bytes

Database Buffers 1023410176 bytes

Redo Buffers 13848576 bytes

Database mounted.

Database opened.

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 is in use

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

9、引數列表
引數檔案:

# Cache and I/O     快取記憶體和 I/O
###########################################
db_block_size=8192   指定資料塊大小為8KB
db_cache_size=33554432    指定資料緩衝區為32MB,該值越大,可以減少對資料庫檔案的I/O次數,提高效率
db_file_multiblock_read_count=16
###########################################

# Cursors and Library Cache   遊標和庫快取記憶體
###########################################
open_cursors=300   指定一個會話一次可以開啟的遊標的最大數量為300,應將該值設定得足夠高,這樣才能防止應用程式耗盡開啟的遊標
###########################################

# Database Identification   資料庫標識
###########################################
db_domain=""   資料庫域名為mynet,加上資料庫名稱db_name構成全域性資料庫名稱
db_name=cicro   資料庫名稱為myoracle
###########################################

# Diagnostics and Statistics    診斷和統計
###########################################
background_dump_dest=/opt/oracle/admin/cicro/bdump   後臺程序跟蹤檔案目錄
core_dump_dest=/opt/oracle/admin/cicro/cdump         核心轉儲跟蹤檔案目錄
timed_statistics=TRUE                                收集作業系統的計時資訊,這些資訊可被用來優化資料庫和 SQL 語句
user_dump_dest=/opt/oracle/admin/cicro/udump         使用者程序跟蹤檔案目錄
###########################################
# File Configuration
control_files=("/opt/oracle/oradata/cicro/control01.ctl", "/opt/oracle/oradata/cicro/control02.ctl", 

"/opt/oracle/oradata/cicro/control03.ctl")    指定控制檔案的路徑及檔名
###########################################

###########################################
# Instance Identification   網路註冊
###########################################
instance_name=test   例程名稱為test

###########################################
# Job Queues
###########################################
job_queue_processes=10

###########################################
# MTS 多執行緒伺服器配置標識,在Oracle 9i裡稱為共享伺服器配置
###########################################
dispatchers="(PROTOCOL=TCP) (SERVICE=testXDB)"   多執行緒伺服器配置

###########################################
# Miscellaneous   其他
###########################################
aq_tm_processes=1
compatible=9.2.0.0.0   相容版本9.2.0

########################################### 
# Optimizer
###########################################
hash_join_enabled=TRUE
query_rewrite_enabled=FALSE
star_transformation_enabled=FALSE
db_name=cicro

###########################################

###########################################
# Pools 池
###########################################
java_pool_size=83886080    指定Java儲存池的大小為32MB,用於儲存 Java 的方法、類定義和Java物件。
large_pool_size=16777216   指定大型池的大小為1MB, 用於共享伺服器的會話記憶體、並行執行的訊息緩衝區以及RMAN備份和恢復的磁碟 I/O 緩衝區。
shared_pool_size=83886080  指定共享池的大小為32MB,用於儲存共享遊標、儲存的過程、控制結構和並行執行訊息緩衝區等物件。較大的值能改善多使用者系統的效能.

###########################################
# Processes and Sessions 程序和會話
###########################################
processes=150 指定可同時連線到一個Oracle Server上的作業系統使用者程序的最大數量為150

###########################################
# Redo Log and Recovery   重做日誌和恢復
###########################################
fast_start_mttr_target=300   指定從單個數據庫例程崩潰中恢復所需的時間為300秒

###########################################
# Security and Auditing 安全與驗證
###########################################
remote_login_passwordfile=EXCLUSIVE   指定作業系統或口令檔案是否具有檢查使用者口令的許可權。設定為EXCLUSIVE, 將使用資料庫的口令檔案對每個具有許可權的使用者進.

###########################################
# Sort, Hash Joins, Bitmap Indexes   排序, 雜湊聯接, 點陣圖索引
###########################################
pga_aggregate_target=25165824
sort_area_size=524288   指定排序區使用的最大記憶體量為512KB。排序完成後, 各行將返回, 並且記憶體將釋放。增大該值可以提高大型排序的效率。

###########################################
# System Managed Undo and Rollback Segments   系統管理的撤消和回退段
###########################################
undo_management=AUTO   指定系統使用的撤消空間管理方式為SMU 方式,在SMU方式下, 撤消空間會像撤消表空間一樣在外部分配.
undo_retention=10800   
undo_tablespace=UNDOTBS1   指定回滾表空間為UNDOTBS




參考部落格:
[1]