合 Oracle参数系列
、
前言部分
导读和注意事项
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,\~O(∩_∩)O\~:
① Oracle中的各种参数介绍及其查询方法
② Oracle中V\$PARAMETER及V\$PARAMETER2的区别
③ 隐含参数的查询、重置、清除
④ 会话参数和实例参数的查询
⑤ 静态参数和动态参数、延迟参数
⑥ V\$PARAMETER视图的每列含义(重点)
Oracle参数简介
Oracle数据库根据SPFILE或PFILE中设置的参数来配置数据库的启动。每个数据库实例在启动之前,首先读取这些参数文件中设置的不同参数。Oracle系统中的参数,根据系统使用情况可以简单分为两大类:
- 普通参数:Oracle系统正常使用的一些参数
- 非凡参数:包括3种,过时参数、强调参数和隐含参数。
图 3-8 Oracle参数分类
首先介绍一下参数的设置方法。初始化参数的设置方法有很多种:
- 通过“ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = MEMORY;”的方式仅在内存里修改。
- 通过“ALTER SYSTEM SET 参数名=参数值 SCOPE = SPFILE;”的方式只修改SPFILE里的值。
- 通过“ALTER SYSTEM SET 参数名=参数值 DEFERRED SCOPE = SPFILE;”的方式设置延迟生效,也就是说这个修改只对以后连接到数据库的会话生效,而对当前会话以及其它已经连接到Oracle的会话不会生效。
- 通过“ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = BOTH;”或省略BOTH这个关键词可以同时修改SPFILE和MEMORY中的值。
ALTER SESSION和ALTER SYSTEM的区别如下:
ALTER SESSION | 修改的参数只限于本次会话,退出会话再进入时修改失效 |
---|---|
ALTER SYSTEM | 修改的参数适用于数据库实例的所有会话,数据库关闭则修改失效。有特权用户和DBA可以执行 |
ALTER SYSTEM DEFERRED | 修改是延迟修改,退出会话,下次进入会话时生效。有特权用户和DBA可以执行 |
Oracle参数变更生效范围如下表所示:
在RAC环境中,若想修改所有实例,则可以在ALTER SYSTEM的最后加上“SID='*'”或“SID='实例名'”即可。“*”代表所有实例。
过时参数和强调参数
过时参数(Obsolete Parameters),顾名思义就是在Oracle以前的版本中存在,但在新版本中已经淘汰了的参数,已经不再使用的参数。在视图V\$OBSOLETE_PARAMETER中,包含这些参数的名称和一个列ISSPECIFIED,该列用来指出这个参数是否在参数文件中已实际设置。下面的SQL脚本列出了当前系统中所有的过时参数名称以及它们是否在当前系统中设定。
1 | SELECT NAME, ISSPECIFIED FROM V$OBSOLETE_PARAMETER; |
强调参数(Underscored Parameters),是指那些在新版本中保留了下来,但是除非非常需要否则不希望用户使用的那些参数。强调参数可以通过系统视图X\$KSPPO来查看,该视图中包含一个名为KSPPOFLAG的字段。该字段用来指明该参数在当前版本中是被丢弃还是被强调。若该值为1,则表示该参数已被丢弃,若该值为2,则表明该参数现为强调参数。
1 2 3 4 5 6 7 8 | SYS@lhrdb> SELECT KSPPONM, DECODE(KSPPOFLG, 1, 'Obsolete', 2, 'Underscored') 2 FROM X$KSPPO T 3 WHERE T.KSPPONM IN ('hash_join_enabled','job_queue_interval') 4 ORDER BY KSPPONM; KSPPONM DECODE(KSPP ---------------------------------------------------------------- ----------- hash_join_enabled Underscored job_queue_interval Obsolete |
可以看到HASH_JOIN_ENABLED这个参数为强调参数,在隐含参数中表现为“_HASH_JOIN_ENABLED”,而JOB_QUEUE_INTERVAL已变为了过时参数。
隐含参数
Oracle系统中还有一类参数称之为隐含参数(Hidden Parameters),在系统中使用,但Oracle官方没有公布的参数,这些参数可能是那些还没有成熟或者是系统开发中使用的参数。这些参数在所有Oracle官方提供的文档中都没有介绍,它们的命名有一个共同特征就是都以“_”作为参数的首字符。下面的查询可以得到当前系统中的所有隐藏参数,需要以SYS用户登陆,查看两个视图:X\$KSPPI和X\$KSPPCV。下面作者给出具体的SQL语句。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SET PAGESIZE 9999 SET LINE 9999 COL NAME FORMAT A40 COL KSPPDESC FORMAT A50 COL KSPPSTVL FORMAT A20 SELECT A.INDX, A.KSPPINM NAME, A.KSPPDESC, B.KSPPSTVL FROM X$KSPPI A, X$KSPPCV B WHERE A.INDX = B.INDX AND A.KSPPINM LIKE '/_%' ESCAPE '/' AND LOWER(A.KSPPINM) LIKE LOWER('%&PARAMETER%'); |
举个例子,如果需要查询隐含参数“_LM_DD_INTERVAL
”的值,那么执行上面的代码后输入“_LM_DD_INTERVAL”就可以看到该隐含参数的值了,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SYS@lhrdb> SET PAGESIZE 9999 SYS@lhrdb> SET LINE 9999 SYS@lhrdb> COL NAME FORMAT A40 SYS@lhrdb> COL KSPPDESC FORMAT A50 SYS@lhrdb> COL KSPPSTVL FORMAT A20 SYS@lhrdb> SELECT A.INDX, 2 A.KSPPINM NAME, 3 A.KSPPDESC, 4 B.KSPPSTVL 5 FROM X$KSPPI A, 6 X$KSPPCV B 7 WHERE A.INDX = B.INDX 8 AND A.KSPPINM LIKE '/_%' ESCAPE '/' 9 AND LOWER(A.KSPPINM) LIKE LOWER('%&PARAMETER%'); Enter value for parameter: _lm_dd_interval old 9: AND LOWER(A.KSPPINM) LIKE LOWER('%&PARAMETER%') new 9: AND LOWER(A.KSPPINM) LIKE LOWER('%_lm_dd_interval%') INDX NAME KSPPDESC KSPPSTVL ---------- ---------------------------------------- -------------------------------------------------- -------------------- 578 _lm_dd_interval dd time interval in seconds 10 |
可以看到该隐含参数的值为10。
对于隐含参数而言,修改隐含参数的值的时候需要将隐含参数用双引号括起来。若要清除SPFILE中的隐含参数可以使用RESET命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SYS@lhrdb> alter system set _lm_dd_interval=20 scope=spfile; alter system set _lm_dd_interval=20 scope=spfile * ERROR at line 1: ORA-00911: invalid character SYS@lhrdb> alter system set "_lm_dd_interval"=20 scope=spfile; System altered. SYS@lhrdb> alter system reset "_lm_dd_interval" scope=spfile sid='*'; System altered. |
普通用户是不具备查询隐含参数的权限的,可以通过创建视图和同义词的方式来解决这个问题,如下所示:
1 2 3 4 5 6 7 8 | CREATE OR REPLACE VIEW VW_YH_PARAMETER_LHR AS SELECT A.INDX, A.KSPPINM NAME, A.KSPPDESC, B.KSPPSTVL FROM X$KSPPI A, X$KSPPCV B WHERE A.INDX = B.INDX AND A.KSPPINM LIKE '/_%' ESCAPE '/' --TRANSLATE (ksppinm, '_', '#') LIKE '#%' ; GRANT SELECT ON VW_YH_PARAMETER_LHR TO PUBLIC; CREATE PUBLIC SYNONYM VW_YH_PARAMETER_LHR FOR SYS.VW_YH_PARAMETER_LHR; |
普通参数(系统当前参数)
1、普通参数
普通参数就是Oracle系统正常使用的一些参数。查询Oracle初始化参数的方式大约有如下几种:
表 3-8 查询Oracle初始化参数的方式
一般在查询初始化参数的时候都习惯性的使用SHOW PARAMETER,也就是查询V\$PARAMETER视图。V\$PARAMETER视图反映的是初始化参数在当前会话中生效的值,而V\$SYSTEM_PARAMETER反映的才是实例级上的初始化参数。有关视图V\$PARAMETER的解释参考下表:
表 3-9 V\$PARAMETER视图解释
V$PARAMETER和V$PARAMETER2
首先看一下V\$PARAMETER和V\$PARAMETER2的区别,这个区别同样适用于V\$SYSTEM_PARAMETER和V\$SYSTEM_PARAMETER2:
SELECT NAME, VALUE FROM V\$PARAMETER
MINUS
SELECT NAME, VALUE FROM V\$PARAMETER2;
SELECT NAME, VALUE FROM V\$PARAMETER2
MINUS
SELECT NAME, VALUE FROM V\$PARAMETER;
现在这两个视图的结果一目了然了。进一步的研究可以看到底层的数据源来自两个不同的位置,V\$PARAMETER来自x\$ksppcv ,V\$PARAMETER2来自x\$ksppcv2,数据源的不同也正是前端的不同。
V$PARAMETER和V$SYSTEM_PARAMETER
一般在查询初始化参数的时候都习惯性的使用SHOW PARAMETER,也就是查询V\$PARAMETER视图。V\$PARAMETER视图反映的是初始化参数在当前会话中生效的值,而V\$SYSTEM_PARAMETER反映的才是实例级上的初始化参数。
我们通过query_rewrite_enabled这个参数来做一个验证。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SQL> show parameter query_rewrite_enabled NAME TYPE VALUE ------------------------------------ ----------- -------------------- query_rewrite_enabled string TRUE SQL> select name, value 2 from v$parameter 3 where name = 'query_rewrite_enabled'; NAME VALUE ---------------------------------------- ---------------------------- query_rewrite_enabled TRUE SQL> select name, value 2 from v$system_parameter 3 where name = 'query_rewrite_enabled'; NAME VALUE ---------------------------------------- ---------------------------- query_rewrite_enabled TRUE |
这时候如果在会话级修改 query_rewrite_enabled 这个初始化参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | SQL> alter session set query_rewrite_enabled = false; 会话已更改。 SQL> show parameter query_rewrite_enabled NAME TYPE VALUE ------------------------------------ ----------- ------------------- query_rewrite_enabled string FALSE SQL> select name, value 2 from v$parameter 3 where name = 'query_rewrite_enabled'; NAME VALUE ---------------------------------------- --------------------------- query_rewrite_enabled FALSE SQL> select name, value 2 from v$system_parameter 3 where name = 'query_rewrite_enabled'; NAME VALUE ---------------------------------------- --------------------------- query_rewrite_enabled TRUE |
可以看到,show parameter 和查询 v\$parameter 视图的结果都是 FALSE,而刚才做的修改只是会话级,并没有修改系统的初始化参数。我们应该形成的知识常识:V\$PARAMETER 视图反映的是初始化参数在当前会话中生效的值,而 V\$SYSTEM_PARAMETER 反映的才是实例级上的初始化参数。