oracle

推荐列表 站点导航

当前位置:首页 > 数据库 > oracle >

体系结构 Oracle参数介绍

来源:网络整理  作者:fen  发布时间:2020-12-26 15:26
【体系结构】Oracle参数介绍1BLOG文档结构图2前言部分2 1导读和注意事项各位技术爱好者,看完本文后,你可以掌握如...

体系结构】Oracle参数介绍

1  BLOG文档结构图

wpsCB0F.tmp

2  前言部分 2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① Oracle中的各种参数介绍及其查询方法

② Oracle中V$PARAMETER及V$PARAMETER2的区别

③ 隐含参数的查询、重置、清除

④ 会话参数和实例参数的查询

⑤ 静态参数和动态参数、延迟参数

V$PARAMETER视图的每列含义(重点)

Tips:

① 本文在itpub()、博客园()和微信公众号(xiaomaimiaolhr)上有同步更新。

② 文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:。

③ 若网页文章代码格式有错乱,请下载pdf格式的文档来阅读。

④ 在本篇BLOG中,代码输出部分一般放在一行一列的表格中。其中,需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如在下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。

List of Archived Logs in backup set 11

Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

---- ------- ---------- ------------------- ---------- ---------

1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

[ZHLHRDB1:root]:/>lsvg -o

T_XLHRD_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

====》2097152*512/1024/1024/1024=1G

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

2.3  本文简介

其实很早就想把杨廷琨大神的参数系列的文章整理一下了,一直没空,最近写书碰到了这里问题,正好就抽空整理一下。

第二章 Oracle参数简介

Oracle数据库根据SPFILE或PFILE中设置的参数来配置数据库的启动。每个数据库实例在启动之前,首先读取这些参数文件中设置的不同参数。Oracle系统中的参数,根据系统使用情况可以简单分为两大类:

l 普通参数:Oracle系统正常使用的一些参数

l 非凡参数:包括3种,过时参数、强调参数和隐含参数。

wpsCB10.tmp

图3-8 Oracle参数分类

首先介绍一下参数的设置方法。初始化参数的设置方法有很多种:

l 通过“ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = MEMORY;”的方式仅在内存里修改。

l 通过“ALTER SYSTEM SET 参数名=参数值 SCOPE = SPFILE;”的方式只修改SPFILE里的值。

l 通过“ALTER SYSTEM SET 参数名=参数值 DEFERRED SCOPE = SPFILE;”的方式设置延迟生效,也就是说这个修改只对以后连接到数据库的会话生效,而对当前会话以及其它已经连接到Oracle的会话不会生效。

l 通过“ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = BOTH;”或省略BOTH这个关键词可以同时修改SPFILE和MEMORY中的值。

ALTER SESSION和ALTER SYSTEM的区别如下:

ALTER SESSION

 

修改的参数只限于本次会话,退出会话再进入时修改失效

 

ALTER SYSTEM

 

修改的参数适用于数据库实例的所有会话,数据库关闭则修改失效。有特权用户和DBA可以执行

 

ALTER SYSTEM DEFERRED

 

修改是延迟修改,退出会话,下次进入会话时生效。有特权用户和DBA可以执行

 

Oracle参数变更生效范围如下表所示:

wpsCB11.tmp

在RAC环境中,若想修改所有实例,则可以在ALTER SYSTEM的最后加上“SID='*'”或“SID='实例名'”即可。“*”代表所有实例。

2.1   过时参数和强调参数

过时参数(Obsolete Parameters),顾名思义就是在Oracle以前的版本中存在,但在新版本中已经淘汰了的参数,已经不再使用的参数。在视图V$OBSOLETE_PARAMETER中,包含这些参数的名称和一个列ISSPECIFIED,该列用来指出这个参数是否在参数文件中已实际设置。下面的SQL脚本列出了当前系统中所有的过时参数名称以及它们是否在当前系统中设定。

SELECT   NAME, ISSPECIFIED FROM V$OBSOLETE_PARAMETER;

 

强调参数(Underscored Parameters),是指那些在新版本中保留了下来,但是除非非常需要否则不希望用户使用的那些参数。强调参数可以通过系统视图X$KSPPO来查看,该视图中包含一个名为KSPPOFLAG的字段。该字段用来指明该参数在当前版本中是被丢弃还是被强调。若该值为1,则表示该参数已被丢弃,若该值为2,则表明该参数现为强调参数。

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已变为了过时参数。

2.2   隐含参数

Oracle系统中还有一类参数称之为隐含参数(Hidden Parameters),在系统中使用,但Oracle官方没有公布的参数,这些参数可能是那些还没有成熟或者是系统开发中使用的参数。这些参数在所有Oracle官方提供的文档中都没有介绍,它们的命名有一个共同特征就是都以“_”作为参数的首字符。下面的查询可以得到当前系统中的所有隐藏参数,需要以SYS用户登陆,查看两个视图:X$KSPPI和X$KSPPCV。下面作者给出具体的SQL语句。

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”就可以看到该隐含参数的值了,如下所示:

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命令。

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.

 

普通用户是不具备查询隐含参数的权限的,可以通过创建视图和同义词的方式来解决这个问题,如下所示:

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;

 
  2.3   普通参数(系统当前参数

注意:本小节内容多数来源于杨廷琨老师的博客。

1、普通参数

普通参数就是Oracle系统正常使用的一些参数。查询Oracle初始化参数的方式大约有如下几种:

表3-8 查询Oracle初始化参数的方式

wpsCB12.tmp

一般在查询初始化参数的时候都习惯性的使用SHOW PARAMETER,也就是查询V$PARAMETER视图。V$PARAMETER视图反映的是初始化参数在当前会话中生效的值,而V$SYSTEM_PARAMETER反映的才是实例级上的初始化参数。有关视图V$PARAMETER的解释参考下表:

表3-9 V$PARAMETER视图解释

wpsCB13.tmp

2.3.1  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,数据源的不同也正是前端的不同。

2.3.2  V$PARAMETERV$SYSTEM_PARAMETER

一般在查询初始化参数的时候都习惯性的使用SHOW PARAMETER,也就是查询V$PARAMETER视图。V$PARAMETER视图反映的是初始化参数在当前会话中生效的值,而V$SYSTEM_PARAMETER反映的才是实例级上的初始化参数。

我们通过query_rewrite_enabled这个参数来做一个验证。

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 这个初始化参数:

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 反映的才是实例级上的初始化参数

再来看看延迟参数修改的情况:

SQL> select name, value

2  from v$parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               on

SQL> select name, value

2  from v$system_parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               on

SQL> alter system set recyclebin = off deferred scope = memory;

系统已更改。

SQL> select name, value

2  from v$parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               on

SQL> select name, value

2  from v$system_parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               OFF

 

结果和前面的恰好反过来,v$parameter 视图中的结果没有发生变化,而 v$system_parameter 视图的结果变成了 OFF。

这是因为延迟修改对数据库中当前存在的会话不生效,因此反映当前会话情况的 v$parameter 视图结果不变,而对于系统而言,初始化参数已经改变,而且所有新建会话的参数也会改变,所以 v$system_parameter 视图的结果发生了改变。

SQL> CONN / as sysdba

已连接。

SQL> select name, value

2  from v$parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ---------------------------

recyclebin                               OFF

SQL> select name, value

2  from v$system_parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ---------------------------

recyclebin                               OFF

 

根据这两个例子可以获得的常识是:利用 V$PARAMETER 视图获取系统的启动初始化参数是不准确的,因为它获取的是当前会话的参数,应该从 V$SYSTEM_PARAMETER 视图来获取。

2.3.3  RAC环境下初始化参数的查询

使用 SHOW PARAMETER 查询,看到的是当前会话可以看到的初始化参数,那么这个参数导致是全局设置还是当前实例设置的,是从这个命令中看不到的。虽然 Oracle 提供了 GV$ 开头的初始化参数,可以用来查询两个实例上的设置,但是情况并不是这么简单的。

一个简单的例子:

SQL> show parameter open_cursors

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

open_cursors                         integer     300

SQL> alter system set open_cursors = 500 scope = both sid = 'test1';

系统已更改。

SQL> disc

从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options 断开

SQL> set instance test2

Oracle Database 11g Release 11.1.0.0.0 - Production

SQL> conn sys as sysdba

输入口令:

已连接。

SQL> alter system set open_cursors = 400 scope = both sid = 'test2';

系统已更改。

SQL> disc

从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options 断开

SQL> set instance local

Oracle Database 11g Release 11.1.0.0.0 - Production

SQL> conn / as sysdba

已连接。

 

现在来看看不同的查询方法得到的结果:

SQL> select name, value

2  from v$parameter

3  where name = 'open_cursors';

NAME                           VALUE

------------------------------ --------------------------------------------------

open_cursors                   500

SQL> select inst_id, name, value

2  from gv$parameter

3  where name = 'open_cursors';

INST_ID NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

1 open_cursors                   500

2 open_cursors                   400

SQL> show parameter open_cursors

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

open_cursors                         integer     500

SQL> select sid, name, value

2  from v$spparameter

3  where name = 'open_cursors';

SID        NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

*          open_cursors                   300

test1      open_cursors                   500

test2      open_cursors                   400

SQL> show spparameter open_cursors

SID      NAME                          TYPE        VALUE

-------- ----------------------------- ----------- ----------------------------

*        open_cursors                  integer     300

test2    open_cursors                  integer     400

test1    open_cursors                  integer     500

 

似乎除了看不到全局设置外,GV$PARAMETER 参数和 V$SPPARAMETER 没有什么不同,其实不然,如果 alter system set 的时候只修改了 spfile 或只修改了 memory 参数,结果就会不同:

SQL> alter system set open_cursors = 600 scope = memory sid = 'test1';

系统已更改。

SQL> alter system set open_cursors = 700 scope = spfile sid = 'test2';

系统已更改。

SQL> select name, value

2  from v$parameter

3  where name = 'open_cursors';

NAME                           VALUE

------------------------------ --------------------------------------------------

open_cursors                   600

SQL> select inst_id, name, value

2  from gv$parameter

3  where name = 'open_cursors';

INST_ID NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

1 open_cursors                   600

2 open_cursors                   400

SQL> select sid, name, value

2  from v$spparameter

3  where name = 'open_cursors';

SID        NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

*          open_cursors                   300

test1      open_cursors                   500

test2      open_cursors                   700

 

从上面的对比就可以看出,通过 GV$ 视图访问的结果和 SPFILE 中包含的信息其实是两回事。

除了上面介绍的几种视图之外,CREATE PFILE 其实也是一个不错的选择,在10g 以前只能 CREATE PFILE FROM SPFILE,得到的结果类似于对 VSPPARAMETER 视图的查询,而11g增加了 CREATE PFILE FROM MEMORY 选项,这个得到的结果类似于从 GV$SYSTEM_PARAMETER 视图获取的查询。

2.3.4  GV$SPPARAMETER参数的必要性

其实这里还有一个问题,就是 GV$SPPARAMETER 是否有意义。因为 V$SPPARAMETER 参数本身就包含了 SID 列,SPFILE 中本身就包含了所有实例的设置,那么查询 GV$SPPARAMETER 视图是否就意义不大呢,其实不然。

因为 RAC 的各个节点可以使用统一的 SPFILE 启动,同样也可以选择不同的 SPFILE 来进行启动,这时 GV$SPPARAMETER 视图中获取结果,才是真正各个实例 SPFILE 中设置的结果。

这样说比较难以理解,看一个简单的例子:

SQL> select inst_id, name, value

2 from gv$system_parameter

3 where name = 'open_cursors';

INST_ID NAME VALUE

---------- ------------------------------ --------------------------------------------------

1 open_cursors 600

2 open_cursors 400

SQL> select sid, name, value

2 from v$spparameter

3 where name = 'open_cursors';

SID NAME VALUE

---------- ------------------------------ --------------------------------------------------

* open_cursors 300

test1 open_cursors 500

test2 open_cursors 700

SQL> select inst_id, sid, name, value

2 from gv$spparameter

3 where name = 'open_cursors';

INST_ID SID NAME VALUE

---------- ---------- ------------------------------ ------------------------------------

1 * open_cursors 300

1 test1 open_cursors 500

1 test2 open_cursors 700

2 * open_cursors 300

2 test1 open_cursors 500

2 test2 open_cursors 700

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://www.juheyunku.com/sql/oracle/9336.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

体系结构 Oracle参数介绍

2020-12-26 编辑:fen

体系结构】Oracle参数介绍

1  BLOG文档结构图

wpsCB0F.tmp

2  前言部分 2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① Oracle中的各种参数介绍及其查询方法

② Oracle中V$PARAMETER及V$PARAMETER2的区别

③ 隐含参数的查询、重置、清除

④ 会话参数和实例参数的查询

⑤ 静态参数和动态参数、延迟参数

V$PARAMETER视图的每列含义(重点)

Tips:

① 本文在itpub()、博客园()和微信公众号(xiaomaimiaolhr)上有同步更新。

② 文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:。

③ 若网页文章代码格式有错乱,请下载pdf格式的文档来阅读。

④ 在本篇BLOG中,代码输出部分一般放在一行一列的表格中。其中,需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如在下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。

List of Archived Logs in backup set 11

Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

---- ------- ---------- ------------------- ---------- ---------

1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

[ZHLHRDB1:root]:/>lsvg -o

T_XLHRD_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

====》2097152*512/1024/1024/1024=1G

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

2.3  本文简介

其实很早就想把杨廷琨大神的参数系列的文章整理一下了,一直没空,最近写书碰到了这里问题,正好就抽空整理一下。

第二章 Oracle参数简介

Oracle数据库根据SPFILE或PFILE中设置的参数来配置数据库的启动。每个数据库实例在启动之前,首先读取这些参数文件中设置的不同参数。Oracle系统中的参数,根据系统使用情况可以简单分为两大类:

l 普通参数:Oracle系统正常使用的一些参数

l 非凡参数:包括3种,过时参数、强调参数和隐含参数。

wpsCB10.tmp

图3-8 Oracle参数分类

首先介绍一下参数的设置方法。初始化参数的设置方法有很多种:

l 通过“ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = MEMORY;”的方式仅在内存里修改。

l 通过“ALTER SYSTEM SET 参数名=参数值 SCOPE = SPFILE;”的方式只修改SPFILE里的值。

l 通过“ALTER SYSTEM SET 参数名=参数值 DEFERRED SCOPE = SPFILE;”的方式设置延迟生效,也就是说这个修改只对以后连接到数据库的会话生效,而对当前会话以及其它已经连接到Oracle的会话不会生效。

l 通过“ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = BOTH;”或省略BOTH这个关键词可以同时修改SPFILE和MEMORY中的值。

ALTER SESSION和ALTER SYSTEM的区别如下:

ALTER SESSION

 

修改的参数只限于本次会话,退出会话再进入时修改失效

 

ALTER SYSTEM

 

修改的参数适用于数据库实例的所有会话,数据库关闭则修改失效。有特权用户和DBA可以执行

 

ALTER SYSTEM DEFERRED

 

修改是延迟修改,退出会话,下次进入会话时生效。有特权用户和DBA可以执行

 

Oracle参数变更生效范围如下表所示:

wpsCB11.tmp

在RAC环境中,若想修改所有实例,则可以在ALTER SYSTEM的最后加上“SID='*'”或“SID='实例名'”即可。“*”代表所有实例。

2.1   过时参数和强调参数

过时参数(Obsolete Parameters),顾名思义就是在Oracle以前的版本中存在,但在新版本中已经淘汰了的参数,已经不再使用的参数。在视图V$OBSOLETE_PARAMETER中,包含这些参数的名称和一个列ISSPECIFIED,该列用来指出这个参数是否在参数文件中已实际设置。下面的SQL脚本列出了当前系统中所有的过时参数名称以及它们是否在当前系统中设定。

SELECT   NAME, ISSPECIFIED FROM V$OBSOLETE_PARAMETER;

 

强调参数(Underscored Parameters),是指那些在新版本中保留了下来,但是除非非常需要否则不希望用户使用的那些参数。强调参数可以通过系统视图X$KSPPO来查看,该视图中包含一个名为KSPPOFLAG的字段。该字段用来指明该参数在当前版本中是被丢弃还是被强调。若该值为1,则表示该参数已被丢弃,若该值为2,则表明该参数现为强调参数。

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已变为了过时参数。

2.2   隐含参数

Oracle系统中还有一类参数称之为隐含参数(Hidden Parameters),在系统中使用,但Oracle官方没有公布的参数,这些参数可能是那些还没有成熟或者是系统开发中使用的参数。这些参数在所有Oracle官方提供的文档中都没有介绍,它们的命名有一个共同特征就是都以“_”作为参数的首字符。下面的查询可以得到当前系统中的所有隐藏参数,需要以SYS用户登陆,查看两个视图:X$KSPPI和X$KSPPCV。下面作者给出具体的SQL语句。

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”就可以看到该隐含参数的值了,如下所示:

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命令。

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.

 

普通用户是不具备查询隐含参数的权限的,可以通过创建视图和同义词的方式来解决这个问题,如下所示:

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;

 
  2.3   普通参数(系统当前参数

注意:本小节内容多数来源于杨廷琨老师的博客。

1、普通参数

普通参数就是Oracle系统正常使用的一些参数。查询Oracle初始化参数的方式大约有如下几种:

表3-8 查询Oracle初始化参数的方式

wpsCB12.tmp

一般在查询初始化参数的时候都习惯性的使用SHOW PARAMETER,也就是查询V$PARAMETER视图。V$PARAMETER视图反映的是初始化参数在当前会话中生效的值,而V$SYSTEM_PARAMETER反映的才是实例级上的初始化参数。有关视图V$PARAMETER的解释参考下表:

表3-9 V$PARAMETER视图解释

wpsCB13.tmp

2.3.1  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,数据源的不同也正是前端的不同。

2.3.2  V$PARAMETERV$SYSTEM_PARAMETER

一般在查询初始化参数的时候都习惯性的使用SHOW PARAMETER,也就是查询V$PARAMETER视图。V$PARAMETER视图反映的是初始化参数在当前会话中生效的值,而V$SYSTEM_PARAMETER反映的才是实例级上的初始化参数。

我们通过query_rewrite_enabled这个参数来做一个验证。

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 这个初始化参数:

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 反映的才是实例级上的初始化参数

再来看看延迟参数修改的情况:

SQL> select name, value

2  from v$parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               on

SQL> select name, value

2  from v$system_parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               on

SQL> alter system set recyclebin = off deferred scope = memory;

系统已更改。

SQL> select name, value

2  from v$parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               on

SQL> select name, value

2  from v$system_parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ------------------------------------

recyclebin                               OFF

 

结果和前面的恰好反过来,v$parameter 视图中的结果没有发生变化,而 v$system_parameter 视图的结果变成了 OFF。

这是因为延迟修改对数据库中当前存在的会话不生效,因此反映当前会话情况的 v$parameter 视图结果不变,而对于系统而言,初始化参数已经改变,而且所有新建会话的参数也会改变,所以 v$system_parameter 视图的结果发生了改变。

SQL> CONN / as sysdba

已连接。

SQL> select name, value

2  from v$parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ---------------------------

recyclebin                               OFF

SQL> select name, value

2  from v$system_parameter

3  where name = 'recyclebin';

NAME                                     VALUE

---------------------------------------- ---------------------------

recyclebin                               OFF

 

根据这两个例子可以获得的常识是:利用 V$PARAMETER 视图获取系统的启动初始化参数是不准确的,因为它获取的是当前会话的参数,应该从 V$SYSTEM_PARAMETER 视图来获取。

2.3.3  RAC环境下初始化参数的查询

使用 SHOW PARAMETER 查询,看到的是当前会话可以看到的初始化参数,那么这个参数导致是全局设置还是当前实例设置的,是从这个命令中看不到的。虽然 Oracle 提供了 GV$ 开头的初始化参数,可以用来查询两个实例上的设置,但是情况并不是这么简单的。

一个简单的例子:

SQL> show parameter open_cursors

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

open_cursors                         integer     300

SQL> alter system set open_cursors = 500 scope = both sid = 'test1';

系统已更改。

SQL> disc

从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options 断开

SQL> set instance test2

Oracle Database 11g Release 11.1.0.0.0 - Production

SQL> conn sys as sysdba

输入口令:

已连接。

SQL> alter system set open_cursors = 400 scope = both sid = 'test2';

系统已更改。

SQL> disc

从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options 断开

SQL> set instance local

Oracle Database 11g Release 11.1.0.0.0 - Production

SQL> conn / as sysdba

已连接。

 

现在来看看不同的查询方法得到的结果:

SQL> select name, value

2  from v$parameter

3  where name = 'open_cursors';

NAME                           VALUE

------------------------------ --------------------------------------------------

open_cursors                   500

SQL> select inst_id, name, value

2  from gv$parameter

3  where name = 'open_cursors';

INST_ID NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

1 open_cursors                   500

2 open_cursors                   400

SQL> show parameter open_cursors

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

open_cursors                         integer     500

SQL> select sid, name, value

2  from v$spparameter

3  where name = 'open_cursors';

SID        NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

*          open_cursors                   300

test1      open_cursors                   500

test2      open_cursors                   400

SQL> show spparameter open_cursors

SID      NAME                          TYPE        VALUE

-------- ----------------------------- ----------- ----------------------------

*        open_cursors                  integer     300

test2    open_cursors                  integer     400

test1    open_cursors                  integer     500

 

似乎除了看不到全局设置外,GV$PARAMETER 参数和 V$SPPARAMETER 没有什么不同,其实不然,如果 alter system set 的时候只修改了 spfile 或只修改了 memory 参数,结果就会不同:

SQL> alter system set open_cursors = 600 scope = memory sid = 'test1';

系统已更改。

SQL> alter system set open_cursors = 700 scope = spfile sid = 'test2';

系统已更改。

SQL> select name, value

2  from v$parameter

3  where name = 'open_cursors';

NAME                           VALUE

------------------------------ --------------------------------------------------

open_cursors                   600

SQL> select inst_id, name, value

2  from gv$parameter

3  where name = 'open_cursors';

INST_ID NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

1 open_cursors                   600

2 open_cursors                   400

SQL> select sid, name, value

2  from v$spparameter

3  where name = 'open_cursors';

SID        NAME                           VALUE

---------- ------------------------------ --------------------------------------------------

*          open_cursors                   300

test1      open_cursors                   500

test2      open_cursors                   700

 

从上面的对比就可以看出,通过 GV$ 视图访问的结果和 SPFILE 中包含的信息其实是两回事。

除了上面介绍的几种视图之外,CREATE PFILE 其实也是一个不错的选择,在10g 以前只能 CREATE PFILE FROM SPFILE,得到的结果类似于对 VSPPARAMETER 视图的查询,而11g增加了 CREATE PFILE FROM MEMORY 选项,这个得到的结果类似于从 GV$SYSTEM_PARAMETER 视图获取的查询。

2.3.4  GV$SPPARAMETER参数的必要性

其实这里还有一个问题,就是 GV$SPPARAMETER 是否有意义。因为 V$SPPARAMETER 参数本身就包含了 SID 列,SPFILE 中本身就包含了所有实例的设置,那么查询 GV$SPPARAMETER 视图是否就意义不大呢,其实不然。

因为 RAC 的各个节点可以使用统一的 SPFILE 启动,同样也可以选择不同的 SPFILE 来进行启动,这时 GV$SPPARAMETER 视图中获取结果,才是真正各个实例 SPFILE 中设置的结果。

这样说比较难以理解,看一个简单的例子:

SQL> select inst_id, name, value

2 from gv$system_parameter

3 where name = 'open_cursors';

INST_ID NAME VALUE

---------- ------------------------------ --------------------------------------------------

1 open_cursors 600

2 open_cursors 400

SQL> select sid, name, value

2 from v$spparameter

3 where name = 'open_cursors';

SID NAME VALUE

---------- ------------------------------ --------------------------------------------------

* open_cursors 300

test1 open_cursors 500

test2 open_cursors 700

SQL> select inst_id, sid, name, value

2 from gv$spparameter

3 where name = 'open_cursors';

INST_ID SID NAME VALUE

---------- ---------- ------------------------------ ------------------------------------

1 * open_cursors 300

1 test1 open_cursors 500

1 test2 open_cursors 700

2 * open_cursors 300

2 test1 open_cursors 500

2 test2 open_cursors 700

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://www.juheyunku.com/sql/oracle/9336.shtml

相关文章

风云图片

推荐阅读

返回oracle频道首页