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;