查询初始化参数的方法很多,比如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