体系结构 Oracle参数介绍
【体系结构】Oracle参数介绍
1 BLOG文档结构图
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~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种,过时参数、强调参数和隐含参数。

图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参数变更生效范围如下表所示:

在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初始化参数的方式

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

首先看一下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$PARAMETER和V$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
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
Window下Oracle Database 11g 发行
时间:2020-12-29
-
Oracle如何实现like多个值的
时间:2020-12-29
-
maven添加oracle依赖失败问题
时间:2020-12-29
-
OracleRAC基本概念及入门
时间:2020-12-29
-
Azure File Storage 基本用法
时间:2020-12-26
-
Oracle 权限(grant revoke)
时间:2020-12-26
-
Azure Queue Storage 基本用法
时间:2020-12-26
-
如何对比迁移前后的Orac
时间:2020-12-26
热门文章
-
Azure Queue Storage 基本用法 Azure Storage 之
时间:2020-12-26
-
Oracle存储过程编程详解
时间:2020-12-07
-
win10下oracle 11g安装图文教程
时间:2020-12-25
-
oracle 数据库学习 基本结构介绍
时间:2020-12-13
-
Azure File Storage 基本用法 Azure Storage 之 F
时间:2020-12-26
-
windows使用sqlpus连接oracle 数据库的教程图
时间:2020-12-25
-
Window下Oracle Database 11g 发行版2安装教程
时间:2020-12-29
-
Oracle解锁的方式介绍
时间:2020-12-14
-
linux下oracle设置开机自启动实现方法
时间:2020-12-13
-
Oracle学习记录之使用自定义函数和触发器
时间:2020-12-07
