ORACLE中的參數文件是一個包含一系列參數以及參數對應值的操作系統文件,可以分為兩種類型。它們是在數據庫實例啟動時候加載的,決定了數據庫的物理結構、內存、數據庫的限制及系統大量的默認值、數據庫的各種物理屬性、指定數據庫控制文件名和路徑等信息,是進行數據庫設計和性能調優的重要文件。
初始化參數文件(Initialization Parameters Files),Oracle 9i之前,ORACLE一直采用PFILE方式存儲初始化參數,該文件為文本文件。
服務器參數文件(Server Parameter Files),從Oracle 9i開始,Oracle引入了SPFILE文件,該文件為二進制格式,不能通過手工修改。
1:PFILE與SPFILE的區別
1:PFILE是文本文件的,而SPFILE是二進制格式的。PFILE文件可以用文本編輯器打開手工配置、而SPFILE不行,只能通過SQL命令在線修改。從操作系統上可以看到這兩者的區別,初始化參數文件為ASCII文本文件,SPFILE為數據文件。
很多人有個很納悶的疑問,為什么SPFILE是二進制文件,但是可以用more命令查看?如下所示

[oracle@DB-Server dbs]$ more spfilewgods.ora _size=3992977408 wgods.__java_pool_size=16777216 wgods.__large_pool_size=16777216 wgods.__shared_pool_size=234881024 wgods.__streams_pool_size=16777216 *.aq_tm_processes=0 *.audit_file_dest='/database/admin/wgods/adump' *.background_dump_dest='/database/admin/wgods/bdump' *.compatible='10.2.0.1.0' *.control_files='/database/oradata/wgods/control01.ctl', '/database/oradata/wgods/control02.ctl', '/database/oradata/wgods/control03.ctl' *.core_dump_dest='/database/admin/wgods/cdump' *.db_block_size=8192 *.db_domain='' *.db_file_multiblock_read_count=16 *.db_files=1024 *.db_name='wgods' *.db_recovery_file_dest='/database/flash_recovery_area' *.db_recovery_file_dest_size=2147483648 *.db_writer_processes=3 *.dispatchers='(PROTOCOL=TCP) (SERVICE=wgodsXDB)' *.job_queue_processes=5 *.nls_territory='CHINA' *.open_cursors=300 *.pga_aggregate_target=761266176 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.sga_max_size=4294967296 *.sga_target=4294967296 *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' *.user_dump_dest='/database/admin/wgods/udump' *.utl_file_dir='/database/flash_recovery_area/WGODS/logmnr_dict'
大家把這個文件用文本編輯器打開,就會發現確實是二進制文件,如下圖所示:
2:SPFILE的修改是可以通過SQL命令在線修改,不再需要通過手工修改,對於動態參數所有更改可以立即生效,而PFILE的修改必須重啟實例才能生效。
3:手動創建數據庫而不是通過DBCA,則開始創建數據庫時,只能定義PFILE。
修改spfile參數的三種模式:
scope=both 立即並永久生效,(默認模式)
scope=spfile 下次啟動才能生效。
scope=memory 立即生效但下次啟動時失效
2: 如何查看SPFILE與PFILE的目錄位置?
2.1 方法一
- SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';
2.2 方法二
- SQL> show parameter spfile
- NAME TYPE VALUE
- ------------------------ ----------- ------------------------------
- spfile string /database/product/dbhome_1/dbs/spfilewgods.ora
- SQL> show parameter pfile
- NAME TYPE VALUE
- ------------------------ ----------- ------------------------------
- spfile string /database/product/dbhome_1/dbs/spfilewgods.ora
注意:如果數據庫使用spfile參數文件,那么用show parameter spfile與 show parameter pfile的結果一致,如果數據庫使用pfile參數文件,那么上面命令得到的結果都是空,這是為什么呢?
- SQL> show parameter spfile;
- NAME TYPE VALUE
- -------------------------------- ----------- -----------
- spfile string
- SQL> show parameter pfile;
- NAME TYPE VALUE
- -------------------------------- ----------- -----------
- spfile string
- SQL>
我們可以通過SQL_TRACE跟蹤查看具體原因:
- SQL> ALTER SESSION SET SQL_TRACE=TRUE;
- Session altered.
- SQL> show parameter spfile;
- NAME TYPE VALUE
- ------------ ----------- ------------------------------
- spfile string /u01/app/oracle/product/dbhome_1/dbs/spfilegsp.ora
- SQL> ALTER SESSION SET SQL_TRACE=FALSE;
- Session altered.
- SQL> SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' ||
- P.SPID || '.trc' TRACE_FILE_NAME
- FROM
- ( SELECT P.SPID
- FROM V$MYSTAT M, V$SESSION S, V$PROCESS P
- WHERE M.STATISTIC# =1
- AND S.SID = M.SID
- AND P.ADDR = S.PADDR
- ) P,
- ( SELECT T.INSTANCE
- FROM V$THREAD T, V$PARAMETER V
- WHERE V.NAME ='thread'
- AND(V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE))
- ) I,
- (SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T;
- TRACE_FILE_NAME
- --------------------------------------------------------------------------------
- /u01/app/oracle/admin/orcl/udump/gsp_ora_3010.trc
- SQL>
此時查看/u01/app/oracle/admin/orcl/udump/gsp_ora_3010.trc可以得知,其實show parameter命令本質是通過轉換成下面的SQL語句執行的
- SELECT NAME NAME_COL_PLUS_SHOW_PARAM,
- DECODE(TYPE,1,'boolean',2,'string',3,'integer',
- 4,'file',5,'number',
- 6,'big integer', 'unknown') TYPE,
- DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM
- FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%spfile%')
- ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM
所以show parameter pfile轉化為如下SQL語句
- SELECT NAME NAME_COL_PLUS_SHOW_PARAM,
- DECODE(TYPE,1,'boolean',2,'string',3,'integer',
- 4,'file',5,'number',
- 6,'big integer', 'unknown') TYPE,
- DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM
- FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%pfile%')
- ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM
而動態視圖V$PARAMETER里面沒有參數pfile,所以兩者結果一致,當數據庫以參數pfile啟動時,查詢結果為空。
3: 判斷數據庫從SPFILE還是PFILE啟動?
方法1:查詢動態視圖V$PARAMETER,如果VALUE值為非空,則是SPFILE啟動,否則是PFILE。
SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';
方法2:SHOW PARAMETER命令查看
SQL> show parameter spfile;
方法3:通過v$spparameter視圖,如果一下查詢返回0值,表示你在使用pfile,否則表明你使用的是spfile
SQL> SELECT COUNT(1) FROM v$spparameter where value is not null;
COUNT(1)
----------
22
或
SQL> select decode(count(1), 1, 'spfile', 'pfile') USED
2 from v$spparameter
3 where rownum=1 and isspecified ='TRUE';
USED
--------------
spfile
參數文件的搜索順序
參數文件的搜索順序如下:
1)spfile<sid>.ora
Unix/Linux缺省目錄 $ORACLE_HOME/dbs/
Windows缺省目錄 %ORACLE_HOME%\database
2) spfile.ora
Unix/Linux缺省目錄 $ORACLE_HOME/dbs/
Windows缺省目錄 %ORACLE_HOME%\database
3) init<sid>.ora
Unix/Linux缺省目錄 $ORACLE_HOME/dbs/
Windows缺省目錄 %ORACLE_HOME%\database
重建PFILE或SPFILE
create spfile[='xxxxx'] from pfile[='xxxx'];
create pfile[='xxxxx'] from spfile[='xxxx'];
通過spfile創建pfile文件(此時會在$ORACLE_HOME/dbs目錄下生成pfile:initwgods.ora),當然你也可以指定參數文件的位置。
SQL> create pfile from spfile;
File created.
scope參數說明:
靜態參數 必須指定為scope
動態參數issys_modifiable為IMMEDIATE不加scope默認的是 both,而動態參數issys_modifiable為DEFERRED的必須加上scope=spfile 或者 加上derferred,
參數類型 |
spfile |
memory |
both |
deferred |
靜態參數 |
可以,重啟服務器生效 |
不可以 |
不可以 |
不可以 |
動態參數(issys_modifiable為immediate |
可以,重啟服務器生效 |
可以,立即生效,重啟服務失效 |
可以,立即生效,重啟服務器仍然有效果 |
可以 |
動態參數(issys_modifiable為deferred) |
|
|
|
|
參考資料:[深入解析Oracle.DBA入門進階與診斷案例].蓋國強