1. 程式人生 > 其它 >pfile和spfile檔案詳解 pfile和spfile檔案詳解

pfile和spfile檔案詳解 pfile和spfile檔案詳解

pfile和spfile檔案詳解

 

 

介紹:

1、Oracle中的引數檔案是一個包含一系列引數以及引數對應值的作業系統檔案。它們是在資料庫例項啟動時候載入的,

決定了資料庫的物理結構、記憶體、資料庫的限制及系統大量的預設值、資料庫的各種物理屬性、指定資料庫控制檔名

和路徑等資訊,是進行資料庫設計和效能調優的重要檔案。可以分為兩種型別:

(1)pfile:

初始化引數檔案,Oracle9i之前,ORACLE一直採用pfile方式儲存初始化引數,pfile預設的名稱為"init+例程名.ora"

檔案路徑為"/application/oracle/product/11.2.0/db_1/dbs",這是一個文字檔案,可以用任何文字編輯工具開啟;

(2)spfile:

伺服器引數檔案,從Oracle9i開始,Oracle引入了Spfile檔案,spfile預設的名稱為"spfile+例程名.ora",檔案路徑

為"/application/oracle/product/11.2.0/db_1/dbs",以二進位制文字形式存在,不能用vi編輯器對其中引數進行修改,

只能通過SQL命令線上修改;

[oracle@slave-node2 ~]$ ls /application/oracle/product/11.2.0/db_1/dbs/

hc_orcl.dat init.ora initorcl.ora lkORCL orapworcl spfileorcl.ora

2、使用spfile的好處:

spfile改正了pfile管理混亂的問題,在多結點的環境裡,pfile會有多個image,啟動時候需要跟蹤最新的image。這

是個煩瑣的過程。用spfile以後,所有引數改變都寫到spfile裡面(只要定義scope=spfile或both),引數配置有個權威

的來源;9i以前一般都是要備份pfile後再來做引數的修改,而且pfile的修改必須重啟例項才能生效。非常的不方便;在9i

以後的spfile就可以同通過命令修改指定的引數了,而且有很多引數都不用重啟資料庫,能夠線上生效,這個線上生效的

引數會隨著資料庫的版本增高而增加。如果引數修改有問題資料庫起不來了可以在 nomount狀態下建立成pfile再修改回

來即可;

3、啟動優先順序:

startup 啟動次序 spfile優先於pfile。查詢檔案的順序是 spfileSID.ora-〉spfile.ora-〉initSID.ora-〉init.ora(spfile優先於pfile)。

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

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

4、spfile引數的三種scope:

(1)scope=spfile: 對引數的修改記錄在伺服器初始化引數檔案中,修改後的引數在下次啟動DB時生效,適用於動態和靜態初始化引數;

(2)scope=memory: 對引數的修改記錄在記憶體中,對於動態初始化引數的修改立即生效,在重啟DB後會丟失,會復原為修改前的引數值;

(3)scope=both: 對引數的修改會同時記錄在伺服器引數檔案和記憶體中,對於動態引數立即生效,對靜態引數不能用這個選項,如果使用

了伺服器引數檔案,則在執行alter system語句時,scope=both是default的選項;

(4)如果沒有使用伺服器引數檔案,而在執行alter system語句時指定scope=spfile|both都會出錯;

(5)小結:

 

引數型別

spfile

memory

both

靜態引數

可以,重啟生效

不可以

不可以

動態引數

可以,重啟生效

可以,立即生效,重啟後失效

可以立即生效,重啟後失效

 

 

 

5、如何判斷oracle例項使用的是pfile檔案還是spfile檔案:

show parameter spfile;

show parameter pfile;

#使用上面兩個sql語句,如果oracle例項使用的是pfile檔案則查詢不到任何的結果,如果使用的是spfile檔案,則顯示的都是spfile檔案的路徑;

6、pfile和spfile可以互相建立:

create spfile from pfile

create pfile from spfile

#當然在spfile和pfile的後面可以跟具體的路徑;

10.2、登入到oracle例項:

[oracle@slave-node2 ~]echoechoORACLE_SID

orcl

[oracle@slave-node2 ~]$ sqlplus sys/123456@orcl as sysdba

SQL>show parameter name;

10.3、修改oracle例項的併發連線數:

1、查詢資料庫例項的會話連線情況:

SQL> select count(*) from v$session;

#查詢資料庫例項當前會話連線數;

SQL> select username,count(username) from v$session where username is not null group by username;

#查詢資料庫例項當前不同使用者的會話連線數;

SQL> select count(*) from v$session where status='ACTIVE';

#查詢資料庫例項當前會話的併發連線數;

2、查詢資料庫例項的程序連線數:

SQL> select count(*) from v$process;

#查詢資料庫例項當前程序的連線數;

3、修改spfile的引數步驟:

SQL> show parameter processes;

#查詢當前資料庫例項允許的最大連線數;

SQL> show parameter spfile;

#判斷當前所用的是spfile還是pfile檔案;

SQL> create pfile from spfile;

#將當前的spfile檔案備份;

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

#修改當前資料庫例項的(spfile檔案)最大連線數;

SQL> shutdown immediate;

#關閉當前資料庫例項;

SQL> startup;

#由於修改資料庫允許被連線的最大數太大,導致當前資料庫例項無法啟動;

SQL> startup pfile=/application/oracle/product/11.2.0/db_1/dbs/initorcl.ora;

#指定以pfile檔案啟動;

SQL> create spfile from pfile;

#將備份的spfile進行還原;

SQL> shutdown immediate;

#關閉資料庫例項;

SQL> startup;

#啟動資料庫例項;

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

#重新指定spfile的processes引數;

SQL> shutdown immediate;

#關閉資料庫例項;

SQL> startup

#啟動資料庫

10.4、檢視orcl資料庫例項的pfile檔案:

1、MEMORY_TARGET引數:

(1)該引數指定Oracle例項可用記憶體大小;

(2)取值範圍:152 MB to MEMORY_MAX_TARGET;

(3)Oracle例項在這個值的範圍根據自身負載自動調節SGA和PGA的小;

(4)如果在引數檔案中忽略了MEMORY_MAX_TARGET,則該引數的大小為MEMORY_TARGET的大小;

(5)如果忽略了MEMORY_TARGET,而設定了MEMORY_MAX_TARGET大小,則MEMORY_TARGET值為0,

為0表示禁用自動記憶體管理;

(6)例項啟動後可動態設定MEMORY_TARGET的大小,但不可超過MEMORY_MAX_TARGET的大小;

(7)SGA_MAX_SIZE 的預設值依靠於MEMORY_TARGET 和MEMORY_MAX_TARGET的大小;

2、SGA_TARGET:

(1)是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程序所共享。它包含Oracle伺服器的資料和控制資訊,它是在

Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫;

(2)SGA指定所有SGA元件的總大小,將該值設為正數則表示啟用自動共享記憶體管理特性,下列記憶體池會自動調節大小:

Buffer cache (DB_CACHE_SIZE)

Shared pool (SHARED_POOL_SIZE)

Large pool (LARGE_POOL_SIZE)

Java pool (JAVA_POOL_SIZE)

Streams pool (STREAMS_POOL_SIZE)

(3)當啟用自動記憶體管理(MEMORY_TARGET設定成正數),SGA_TARGET為最小的SGA大小;

3、PGA_AGGREGATE_TARGET:

(1)包含單個伺服器程序或單個後臺程序的資料和控制資訊,與幾個程序共享的SGA正相反,PGA是隻被一個

程序使用的區域,PGA在建立程序時分配,在終止程序時回收,將該引數設成非零值啟用自動PGA管理;

(2)將該引數設成非零值啟用自動PGA管理,同時 WORKAREA_SIZE_POLICY該引數會設為auto,將該引數

設成零時,WORKAREA_SIZE_POLICY引數會自動設成MANUAL

(3)當啟用自動記憶體管理(MEMORY_TARGET )時該值為最小PGA值;

4、Oracle官方推薦的MEMORY_TARGET、PGA、SGA的大小:

(1)ORACLE例項分配的實體記憶體的大小:

MEMORY_TARGET=實體記憶體 x 80%

MEMORY_MAX_SIZE=實體記憶體 x 80%

(2)對於OLTP系統:

SGA_TARGET=(實體記憶體 x 80%) x 80%

SGA_MAX_SIZE=(實體記憶體 x 80%) x 80%

PGA_AGGREGATE_TARGET=(實體記憶體 x 80%) x 20%

(3)對於DSS系統:

SGA_TARGET=(實體記憶體 x 80%) x 50%

SGA_MAX_SIZE=(實體記憶體 x 80%) x 50%

PGA_AGGREGATE_TARGET=(實體記憶體 x 80%) x 50%

(4)pga和sga的總和是oracle使用計算機記憶體的實際大小;

SQL> show parameter sga;

SQL> show parameter pga;

5、資料庫orcl例項pfile檔案(4G):

[root@slave-node2 ~]# cat /application/oracle/product/11.2.0/db_1/dbs/initorcl.ora

orcl.__db_cache_size=1107296256

#sga自動管理

orcl.__java_pool_size=16777216

#sga自動管理

orcl.__large_pool_size=16777216

#sga自動管理

orcl.__oracle_base='/application/oracle'#ORACLE_BASE set from environment

#資料庫安裝目錄

orcl.__pga_aggregate_target=1342177280

#pga=(實體記憶體 x 80%) x 20%,由memory_target自動管理;

orcl.__sga_target=2013265920

#sga=(實體記憶體 x 80%) x 80%,由memory_target自動管理;

orcl.__shared_io_pool_size=0

orcl.__shared_pool_size=805306368

#sga自動管理

orcl.__streams_pool_size=33554432

#sga自動管理

*.audit_file_dest='/application/oracle/admin/orcl/adump'

#日誌審計目錄

*.audit_trail='db'

#記錄資料庫例項的審計記錄;

*.compatible='11.2.0.0.0'

#資料庫版本號

*.control_files='/application/oracle/oradata/orcl/control01.ctl','/application/oracle/flash_recovery_area/orcl/control02.ctl'

#資料庫例項控制檔案位置

*.db_block_size=8192

#定義oracle資料庫例項塊的大小,8k

*.db_domain=''

#定義一個數據庫例項在網路架構中的一個邏輯位置

*.db_name='orcl'

#資料庫例項名

*.db_recovery_file_dest='/application/oracle/flash_recovery_area'

#該引數控制的是閃回恢復區域(FRA)的位置

*.db_recovery_file_dest_size=4070572032

#該引數控制的是閃回恢復區域(FRA)的大小

*.diagnostic_dest='/application/oracle'

#資料庫例項診斷目錄,位於$ORACLE_BASE/diag/rdbms/orcl/

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

#oracle資料庫例項多執行緒

*.memory_target=3340763136

#Oracle例項可用記憶體=實體記憶體 x 80%,同時也開啟了oracle例項記憶體自動管理sga和pga的功能

*.open_cursors=500

#指定一個session同時開啟的遊標的最大數目,需要設定該引數足夠大來保證應用的正常執行,預設300

*.processes=3000

#資料庫例項允許被連線的最大數,預設150

*.remote_login_passwordfile='EXCLUSIVE'

#通過sqlnet.ora檔案驗證使用者;

*.undo_tablespace='UNDOTBS1'

#回滾表空間

10.5、oracle資料庫優化:

1、修改oracle例項的最大連線數;

本文上面有介紹,在此就不再贅述了;

2、修改oracle例項的session遊標數

SQL> alter system set open_cursors=500 scope=spfile;

SQL> shutdown immediate;

SQL> startup;

3、修改oracle例項可用記憶體大小:

SQL> alter system set memory_target=4340763136 scope=spfile;

#Oracle例項可用記憶體增大為4G,注意:最大不能超過實體記憶體的80%;

SQL> shutdown immediate;

SQL> startup;

 

 

介紹:

1、Oracle中的引數檔案是一個包含一系列引數以及引數對應值的作業系統檔案。它們是在資料庫例項啟動時候載入的,

決定了資料庫的物理結構、記憶體、資料庫的限制及系統大量的預設值、資料庫的各種物理屬性、指定資料庫控制檔名

和路徑等資訊,是進行資料庫設計和效能調優的重要檔案。可以分為兩種型別:

(1)pfile:

初始化引數檔案,Oracle9i之前,ORACLE一直採用pfile方式儲存初始化引數,pfile預設的名稱為"init+例程名.ora"

檔案路徑為"/application/oracle/product/11.2.0/db_1/dbs",這是一個文字檔案,可以用任何文字編輯工具開啟;

(2)spfile:

伺服器引數檔案,從Oracle9i開始,Oracle引入了Spfile檔案,spfile預設的名稱為"spfile+例程名.ora",檔案路徑

為"/application/oracle/product/11.2.0/db_1/dbs",以二進位制文字形式存在,不能用vi編輯器對其中引數進行修改,

只能通過SQL命令線上修改;

[oracle@slave-node2 ~]$ ls /application/oracle/product/11.2.0/db_1/dbs/

hc_orcl.dat init.ora initorcl.ora lkORCL orapworcl spfileorcl.ora

2、使用spfile的好處:

spfile改正了pfile管理混亂的問題,在多結點的環境裡,pfile會有多個image,啟動時候需要跟蹤最新的image。這

是個煩瑣的過程。用spfile以後,所有引數改變都寫到spfile裡面(只要定義scope=spfile或both),引數配置有個權威

的來源;9i以前一般都是要備份pfile後再來做引數的修改,而且pfile的修改必須重啟例項才能生效。非常的不方便;在9i

以後的spfile就可以同通過命令修改指定的引數了,而且有很多引數都不用重啟資料庫,能夠線上生效,這個線上生效的

引數會隨著資料庫的版本增高而增加。如果引數修改有問題資料庫起不來了可以在 nomount狀態下建立成pfile再修改回

來即可;

3、啟動優先順序:

startup 啟動次序 spfile優先於pfile。查詢檔案的順序是 spfileSID.ora-〉spfile.ora-〉initSID.ora-〉init.ora(spfile優先於pfile)。

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

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

4、spfile引數的三種scope:

(1)scope=spfile: 對引數的修改記錄在伺服器初始化引數檔案中,修改後的引數在下次啟動DB時生效,適用於動態和靜態初始化引數;

(2)scope=memory: 對引數的修改記錄在記憶體中,對於動態初始化引數的修改立即生效,在重啟DB後會丟失,會復原為修改前的引數值;

(3)scope=both: 對引數的修改會同時記錄在伺服器引數檔案和記憶體中,對於動態引數立即生效,對靜態引數不能用這個選項,如果使用

了伺服器引數檔案,則在執行alter system語句時,scope=both是default的選項;

(4)如果沒有使用伺服器引數檔案,而在執行alter system語句時指定scope=spfile|both都會出錯;

(5)小結:

 

引數型別

spfile

memory

both

靜態引數

可以,重啟生效

不可以

不可以

動態引數

可以,重啟生效

可以,立即生效,重啟後失效

可以立即生效,重啟後失效

 

 

 

5、如何判斷oracle例項使用的是pfile檔案還是spfile檔案:

show parameter spfile;

show parameter pfile;

#使用上面兩個sql語句,如果oracle例項使用的是pfile檔案則查詢不到任何的結果,如果使用的是spfile檔案,則顯示的都是spfile檔案的路徑;

6、pfile和spfile可以互相建立:

create spfile from pfile

create pfile from spfile

#當然在spfile和pfile的後面可以跟具體的路徑;

10.2、登入到oracle例項:

[oracle@slave-node2 ~]echoechoORACLE_SID

orcl

[oracle@slave-node2 ~]$ sqlplus sys/123456@orcl as sysdba

SQL>show parameter name;

10.3、修改oracle例項的併發連線數:

1、查詢資料庫例項的會話連線情況:

SQL> select count(*) from v$session;

#查詢資料庫例項當前會話連線數;

SQL> select username,count(username) from v$session where username is not null group by username;

#查詢資料庫例項當前不同使用者的會話連線數;

SQL> select count(*) from v$session where status='ACTIVE';

#查詢資料庫例項當前會話的併發連線數;

2、查詢資料庫例項的程序連線數:

SQL> select count(*) from v$process;

#查詢資料庫例項當前程序的連線數;

3、修改spfile的引數步驟:

SQL> show parameter processes;

#查詢當前資料庫例項允許的最大連線數;

SQL> show parameter spfile;

#判斷當前所用的是spfile還是pfile檔案;

SQL> create pfile from spfile;

#將當前的spfile檔案備份;

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

#修改當前資料庫例項的(spfile檔案)最大連線數;

SQL> shutdown immediate;

#關閉當前資料庫例項;

SQL> startup;

#由於修改資料庫允許被連線的最大數太大,導致當前資料庫例項無法啟動;

SQL> startup pfile=/application/oracle/product/11.2.0/db_1/dbs/initorcl.ora;

#指定以pfile檔案啟動;

SQL> create spfile from pfile;

#將備份的spfile進行還原;

SQL> shutdown immediate;

#關閉資料庫例項;

SQL> startup;

#啟動資料庫例項;

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

#重新指定spfile的processes引數;

SQL> shutdown immediate;

#關閉資料庫例項;

SQL> startup

#啟動資料庫

10.4、檢視orcl資料庫例項的pfile檔案:

1、MEMORY_TARGET引數:

(1)該引數指定Oracle例項可用記憶體大小;

(2)取值範圍:152 MB to MEMORY_MAX_TARGET;

(3)Oracle例項在這個值的範圍根據自身負載自動調節SGA和PGA的小;

(4)如果在引數檔案中忽略了MEMORY_MAX_TARGET,則該引數的大小為MEMORY_TARGET的大小;

(5)如果忽略了MEMORY_TARGET,而設定了MEMORY_MAX_TARGET大小,則MEMORY_TARGET值為0,

為0表示禁用自動記憶體管理;

(6)例項啟動後可動態設定MEMORY_TARGET的大小,但不可超過MEMORY_MAX_TARGET的大小;

(7)SGA_MAX_SIZE 的預設值依靠於MEMORY_TARGET 和MEMORY_MAX_TARGET的大小;

2、SGA_TARGET:

(1)是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程序所共享。它包含Oracle伺服器的資料和控制資訊,它是在

Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫;

(2)SGA指定所有SGA元件的總大小,將該值設為正數則表示啟用自動共享記憶體管理特性,下列記憶體池會自動調節大小:

Buffer cache (DB_CACHE_SIZE)

Shared pool (SHARED_POOL_SIZE)

Large pool (LARGE_POOL_SIZE)

Java pool (JAVA_POOL_SIZE)

Streams pool (STREAMS_POOL_SIZE)

(3)當啟用自動記憶體管理(MEMORY_TARGET設定成正數),SGA_TARGET為最小的SGA大小;

3、PGA_AGGREGATE_TARGET:

(1)包含單個伺服器程序或單個後臺程序的資料和控制資訊,與幾個程序共享的SGA正相反,PGA是隻被一個

程序使用的區域,PGA在建立程序時分配,在終止程序時回收,將該引數設成非零值啟用自動PGA管理;

(2)將該引數設成非零值啟用自動PGA管理,同時 WORKAREA_SIZE_POLICY該引數會設為auto,將該引數

設成零時,WORKAREA_SIZE_POLICY引數會自動設成MANUAL

(3)當啟用自動記憶體管理(MEMORY_TARGET )時該值為最小PGA值;

4、Oracle官方推薦的MEMORY_TARGET、PGA、SGA的大小:

(1)ORACLE例項分配的實體記憶體的大小:

MEMORY_TARGET=實體記憶體 x 80%

MEMORY_MAX_SIZE=實體記憶體 x 80%

(2)對於OLTP系統:

SGA_TARGET=(實體記憶體 x 80%) x 80%

SGA_MAX_SIZE=(實體記憶體 x 80%) x 80%

PGA_AGGREGATE_TARGET=(實體記憶體 x 80%) x 20%

(3)對於DSS系統:

SGA_TARGET=(實體記憶體 x 80%) x 50%

SGA_MAX_SIZE=(實體記憶體 x 80%) x 50%

PGA_AGGREGATE_TARGET=(實體記憶體 x 80%) x 50%

(4)pga和sga的總和是oracle使用計算機記憶體的實際大小;

SQL> show parameter sga;

SQL> show parameter pga;

5、資料庫orcl例項pfile檔案(4G):

[root@slave-node2 ~]# cat /application/oracle/product/11.2.0/db_1/dbs/initorcl.ora

orcl.__db_cache_size=1107296256

#sga自動管理

orcl.__java_pool_size=16777216

#sga自動管理

orcl.__large_pool_size=16777216

#sga自動管理

orcl.__oracle_base='/application/oracle'#ORACLE_BASE set from environment

#資料庫安裝目錄

orcl.__pga_aggregate_target=1342177280

#pga=(實體記憶體 x 80%) x 20%,由memory_target自動管理;

orcl.__sga_target=2013265920

#sga=(實體記憶體 x 80%) x 80%,由memory_target自動管理;

orcl.__shared_io_pool_size=0

orcl.__shared_pool_size=805306368

#sga自動管理

orcl.__streams_pool_size=33554432

#sga自動管理

*.audit_file_dest='/application/oracle/admin/orcl/adump'

#日誌審計目錄

*.audit_trail='db'

#記錄資料庫例項的審計記錄;

*.compatible='11.2.0.0.0'

#資料庫版本號

*.control_files='/application/oracle/oradata/orcl/control01.ctl','/application/oracle/flash_recovery_area/orcl/control02.ctl'

#資料庫例項控制檔案位置

*.db_block_size=8192

#定義oracle資料庫例項塊的大小,8k

*.db_domain=''

#定義一個數據庫例項在網路架構中的一個邏輯位置

*.db_name='orcl'

#資料庫例項名

*.db_recovery_file_dest='/application/oracle/flash_recovery_area'

#該引數控制的是閃回恢復區域(FRA)的位置

*.db_recovery_file_dest_size=4070572032

#該引數控制的是閃回恢復區域(FRA)的大小

*.diagnostic_dest='/application/oracle'

#資料庫例項診斷目錄,位於$ORACLE_BASE/diag/rdbms/orcl/

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

#oracle資料庫例項多執行緒

*.memory_target=3340763136

#Oracle例項可用記憶體=實體記憶體 x 80%,同時也開啟了oracle例項記憶體自動管理sga和pga的功能

*.open_cursors=500

#指定一個session同時開啟的遊標的最大數目,需要設定該引數足夠大來保證應用的正常執行,預設300

*.processes=3000

#資料庫例項允許被連線的最大數,預設150

*.remote_login_passwordfile='EXCLUSIVE'

#通過sqlnet.ora檔案驗證使用者;

*.undo_tablespace='UNDOTBS1'

#回滾表空間

10.5、oracle資料庫優化:

1、修改oracle例項的最大連線數;

本文上面有介紹,在此就不再贅述了;

2、修改oracle例項的session遊標數

SQL> alter system set open_cursors=500 scope=spfile;

SQL> shutdown immediate;

SQL> startup;

3、修改oracle例項可用記憶體大小:

SQL> alter system set memory_target=4340763136 scope=spfile;

#Oracle例項可用記憶體增大為4G,注意:最大不能超過實體記憶體的80%;

SQL> shutdown immediate;

SQL> startup;