查询初始化参数的方法很多,比如SHOW PARAMETER,或查询V$PARAMETER等,这里简单总结一下。
这一篇描述如何判断一个初始化参数的来源。
判断数据库启动是否启用了SPFILE很简单,只需要通过SHOW PARAMETER SPFILE命令就可以看到:
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /export/home/oracle/spfiletest1.ora
但是判断一个初始化参数是否由SPFILE设置,并不是那么容易。
首先V$SPPARAMETER里面包含了所有可以设置初始化参数的记录:
SQL> select sid, count(*)
2 from v$spparameter
3 group by sid;
SID COUNT(*)
---------- ----------
* 391
test2 6
test1 6
不过这个问题并不难解决,对于通过SPFILE指定的参数,V$SPPARAMETER视图中的ISSPECIFIED列的值为TRUE,如果在SPFILE中没有指定,则这个值为FALSE。
SQL> select isspecified, count(*)
2 from v$spparameter
3 group by isspecified;
ISSPEC COUNT(*)
------ ----------
TRUE 144
FALSE 259
SQL> select sid, name, value
2 from v$spparameter
3 where isspecified = 'TRUE'
4 and name not like '\_%' escape '\';
SID NAME VALUE
---------- ------------------------------ --------------------------------------------------
* processes 150
* resource_manager_plan
* sga_target 775946240
* control_files +DATA/test/controlfile/current.529.684067899
* db_block_size 8192
* compatible 11.1.0.0.0
* log_archive_config
* log_archive_dest_1 LOCATION=/data/oracle/oradata/test/archivelog
* log_buffer 4197376
* cluster_database TRUE
* cluster_database_instances 3
* db_create_file_dest +DATA
test1 thread 1
test2 thread 2
test1 undo_tablespace UNDOTBS1
test2 undo_tablespace UNDOTBS2
test1 instance_number 1
test2 instance_number 2
test1 remote_login_passwordfile SHARED
test2 remote_login_passwordfile EXCLUSIVE
* db_domain
* plsql_warnings DISABLE:ALL
* result_cache_max_size 3899392
test1 core_dump_dest /data/oracle/diag/rdbms/test/test1/cdump
test2 core_dump_dest /data/oracle/diag/rdbms/test/test2/cdump
* audit_file_dest /data/oracle/admin/test/adump
* audit_trail DB
* db_name test
test2 open_cursors 400
* open_cursors 500
* optimizer_mode ALL_ROWS
* query_rewrite_enabled TRUE
* pga_aggregate_target 256901120
* optimizer_dynamic_sampling 2
* skip_unusable_indexes TRUE
* diagnostic_dest /data/oracle
已选择36行。
上面就列出了SPFILE中所有指定的参数,不过并不以为SPFILE中设置的参数就一定会生效。
比如在使用PFILE指定SPFILE参数的方式启动时,PFILE里面可以在SPFILE之前指定实例级的初始化参数,用来覆盖SPFILE里相同的数据库级的初始化参数设置。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
test1
SQL> select sid, name, value
2 from v$spparameter
3 where name = 'open_cursors';
SID NAME VALUE
---------- ------------------------------ --------------------------------------------------
test1 open_cursors 600
test2 open_cursors 400
SQL> alter system reset open_cursors scope = spfile sid = 'test1';
系统已更改。
SQL> alter system set open_cursors = 500;
系统已更改。
SQL> select sid, name, value
2 from v$spparameter
3 where name = 'open_cursors';
SID NAME VALUE
---------- ------------------------------ --------------------------------------------------
test2 open_cursors 400
* open_cursors 500
下面通过修改inittest1.ora参数,在spfile参数前面,加上open_cursors参数:
SQL> host vi /export/home/oracle/inittest1.ora
test1.open_cursors=1000
spfile=/export/home/oracle/spfiletest1.ora
"/export/home/oracle/inittest1.ora" 3 lines, 68 characters
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup pfile=/export/home/oracle/inittest1.ora
ORACLE例程已经启动。
Total System Global Area 776896512 bytes
Fixed Size 2098776 bytes
Variable Size 246069672 bytes
Database Buffers 524288000 bytes
Redo Buffers 4440064 bytes
数据库装载完毕。
数据库已经打开。
SQL> select name, value
2 from v$system_parameter
3 where name = 'open_cursors';
NAME VALUE
------------------------------ --------------------------------------------------
open_cursors 1000
SQL> select sid, name, value, isspecified
2 from v$spparameter
3 where name = 'open_cursors';
SID NAME VALUE ISSPEC
---------- ------------------------------ ---------------------------------------- ------
test2 open_cursors 400 TRUE
* open_cursors 500 TRUE
检查当前的数据库设置可以发现,虽然当前SPFILE中open_cursors是明确设置的,但是由于pfile中设置了实例级的初始化参数覆盖了数据库级的初始化参数,导致系统当前的参数设置和SPFILE中的设置并不相同。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html