Oracle参数的查询和修改方法

61次阅读
没有评论

共计 9210 个字符,预计需要花费 24 分钟才能阅读完成。

这篇文章主要讲解了“Oracle 参数的查询和修改方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Oracle 参数的查询和修改方法”吧!

测试环境

DB Version: oracle 11.2 RAC

OS: RHEL 6.x

v$parameter, v$parameter2, v$system_parameter, v$system_parameter2, v$spparameter 的区别

Oracle 11g 里主要的查询参数的视图有 v$parameter, v$parameter2, v$system_parameter, v$system_parameter2, v$spparameter, dba_hist_parameter

v$parameter 和 v$parameter2 有什么区别呢?就跟 v$system_parameter 和 v$system_parameter2 的区别是一样的。呵呵,具体为:

v$parameter 里存的是每个 parameter 的 value, 一个 parameter 一条记录。v$parameter2 也存的是每个 parameter 的 value, 不过在 v$parameter2 里是每行的 name 只会存一个 value。以 control_files 为例,这个 parameter 会对应至少两个值,那么在 v$parameter 里只会有一条记录,而在 v$parameter2 里却会有 2 条记录。其实真想不明白 oracle 为啥要设计出一个这样的视图来,使用场景在哪?欢迎有知道的童鞋告诉我下

v$parameter 和 v$system_parameter 的区别:v$parameter 是存储当前 session 的 parameter/value, 而 v$system_parameter 存储的是当前 instance 级别的 parameter/value; 也就是说一个新建立的 session,v$parameter 和 v$system_parameter 里面的 parameter/value 是一致的; 因为 session level parameter 是从 instance level parameter 继承来的; 然后通过 alter session 可以修改 v$parameter 的值,但是并不会修改 v$system_parameter data

我尝试从 session1 执行一个 alter session, 然后再 session1 看到 v$parameter 值是变化了,打开 session2, 看到的 v$parameter 的值还是老的值,这我就困惑了,不是说 v$parameter 能看到 alter session 之后的值吗?为啥 session1 和 session2 看到的结果不一样呢? 这就是因为 v$parameter 显示的是当前 session 的 parameter name/value 呀.

v$spparameter 和 v$system_parameter: 这两个 view 的区别在于: v$spparameter 用于存储 spfile 里的 parameter name/value, 而 v$system_parameter 用于存储 instance level 当前的 parameter name/value; 体现在哪呢?

例子

SQL select name, value from v$system_parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

SQL select name, value from v$spparameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

SQL select name, value from v$parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

———— 执行 alter session 之后三张表的查询结果

Session 1:

SQL select userenv(sid) from dual;

USERENV(SID)

————–

569

SQL alter session set cursor_sharing= FORCE

Session altered.

SQL select name, value from v$parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       FORCE

SQL select name, value from v$spparameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

SQL select name, value from v$system_parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

Session 2:

SQL select userenv(sid) from dual;

USERENV(SID)

————–

853

SQL select name, value from v$parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

SQL select name, value from v$spparameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

SQL select name, value from v$system_parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

从这里可以看到通过 alter session 修改之后,当前 session1 里查 v$parameter, cursor_sharing 已经改成了 FORCE, 但是另外一个 session 的 v$parameter 里的值并没有改变; 通过 v$system_parameter 和 v$spparameter 里的值也没有改变;

例子 2:

仅仅修改 v$spparameter

通过 alter system set … scope=spfile,这样修改的参数就只会进入 spfile 里,所以只有 v$spparameter 才能看到;

修改前

SQL select name, value from v$parameter where name= cursor_sharing

NAME       VALUE

—————————— ——————————

cursor_sharing       EXACT

SQL select name, value from v$parameter where name= open_cursors

NAME       VALUE

—————————— ——————————

open_cursors       500

SQL select name, value from v$system_parameter where name= open_cursors

NAME       VALUE

—————————— ——————————

open_cursors       500

SQL select name, value from v$spparameter where name= open_cursors

NAME       VALUE

—————————— ——————————

open_cursors       500

修改后

SQL alter system set open_cursors=3000
scope=spfile sid= *

System altered.

SQL select name, value from v$system_parameter where name= open_cursors

NAME       VALUE

—————————— ——————————

open_cursors      
500

SQL select name, value from v$spparameter where name= open_cursors

NAME       VALUE

—————————— ——————————

open_cursors      
3000

SQL select name, value from v$parameter where name= open_cursors

NAME       VALUE

—————————— ——————————

open_cursors      
500

例子 3

只修改 v$system_parameter

修改前

SQL select name, value from v$spparameter where name= db_file_multiblock_read_count

NAME       VALUE

—————————— ——————————

db_file_multiblock_read_count

注意这里显示的是 NULL,表示这个 parameter value 在 spfile 里没有设置,但是 v$system_parameter 里又有值,这是因为系统会根据一定的规则自己计算出一个值来

SQL select name, value from v$system_parameter where name= db_file_multiblock_read_count

NAME       VALUE

—————————— ——————————

db_file_multiblock_read_count  128

SQL select name, value from v$parameter where name= db_file_multiblock_read_count

NAME       VALUE

—————————— ——————————

db_file_multiblock_read_count  128

修改后

SQL alter system set db_file_multiblock_read_count=256
scope=memory sid= *

System altered.

SQL select name, value from v$spparameter where name= db_file_multiblock_read_count

NAME       VALUE

—————————— ——————————

db_file_multiblock_read_count

SQL select name, value from v$system_parameter where name= db_file_multiblock_read_count

NAME       VALUE

—————————— ——————————

db_file_multiblock_read_count  256

SQL select name, value from v$parameter where name= db_file_multiblock_read_count

NAME       VALUE

—————————— ——————————

db_file_multiblock_read_count  256

v$spparameter 里的值仍然为空,v$system_parameter 的值改为了 256, 并且   并且 v$parameter 里的值也是 256. 这说明什么问题?说明如果一个参数没有执行 alter session, 那么这个参数的值在 v$parameter 和 v$system_parameter 里的值是一样的;

当然也可以通过 alter system set … scope=BOTH sid= * 让改动在 v$spparameter 和 v$system_parameter 里都能看到; 这也就是 scope=BOTH/MEMORY/SPFILE 的区别

oracle 11G 里有 355 个 parameter, 那到底哪个是可以通过 alter session 修改的,哪个是可以通过 alter system 修改的呢?以及那些不可以修改的呢?这个通过 v$system_parameter 就可以知道;

isses_modifiable: 是否能通过 alter session 修改. 这只有两个值: TRUE/FALSE

issys_modifiable: 是否能通过 alter system 修改: 这有三个值: IMMEDIATE/DEFERRED/FALSE  (IMMEDIATE 表示立即生效,在当前 session 就生效; DEFFERED: 表示对所有当前正在连接的 session 都不生效,只有对这之后的连接才生效. FALSE 就表示不允许 alter system 修改)

对于 ISSYS_MODIFIABLE=DEFERRED 的参数,必须通过 alter system …. deferred 才能修改; 否则都会报错 ORA-02096

ORA-02096: specified initialization parameter is not modifiable with this option

当使用 ASMM 或者 AMM 的时候,很多 parameter value 都是系统自动调整的,当你修改了某个参数之后又想把这个参数交回给系统自动来管理,那怎么办呢?其实也就是恢复默认值。可以通过 SQL: alter system reset name= value scope=… 注意这里使用的是 RESET 命令。reset 的命令的意思其实就是不设置了,也就是把一个 item 从 spfile 里删除,那么如果要删除,就一定要现有这个 item, 所以如果你要 reset 一个不存在的 parameter 的时候也会报错。或者在 RAC 里,如果设置的时候是 instance by instance 设置的,而 reset 的时候通过 alter system reset … sid= * 也会报错;

SQL select name, value from v$spparameter where name= db_file_multiblock_read_count

NAME   VALUE

————————————————– ————————————————–

db_file_multiblock_read_count

在 v$spparameter 里找不到这个 parameter value, 说明没有设置

SQL alter system reset db_file_multiblock_read_count scope=spfile sid= *

alter system reset db_file_multiblock_read_count scope=spfile sid= *

ERROR at line 1:

ORA-32010: cannot find entry to delete in SPFILE

这里报错了

这是一种情况, 对于 RAC 来说,你可以 instance by instance 设置参数信息

这里看到每个 instnace 的 parameter value 不一样。即使 value 一样你也可以 instance by instance 设置

SQL select sid, name, value from v$spparameter where name= db_file_multiblock_read_count

SID NAME    VALUE

——————————————————————————– ———————————-

racaaweb1 db_file_multiblock_read_count    64

racaaweb2 db_file_multiblock_read_count    256

SQL alter system reset db_file_multiblock_read_count scope=spfile sid= *

alter system reset db_file_multiblock_read_count scope=spfile sid= *

ERROR at line 1:

ORA-32010: cannot find entry to delete in SPFILE

这里还是出错了

隐含参数

Oracle 还有另外一种参数,称为隐含参数,隐含参数的名字以下划线_打头。默认情况下隐含参数不会出现在上面的几张表里,除非你修改了这些参数的值;

例子

alter system set _undo_autotune =TRUE;

这个语句修改了隐含参数_undo_autotune 的值; 这里涉及到注意点:

1) 修改隐含参数的时候,隐含参数名字需要用双引号 括起来

2) 对于这种后面没带 scope 的,scope 的默认值是 BOTH

3) 对于这种后面没带 sid 的,sid 的默认值是 *

更新之后的值如下:

SQL select name, value from v$spparameter where name= _undo_autotune

NAME   VALUE

————————————————– ————————————————–

_undo_autotune   TRUE

SQL select name, value from v$system_parameter where name= _undo_autotune

NAME   VALUE

————————————————– ————————————————–

_undo_autotune   TRUE

也就是说,所有修改过的并且当前生效的参数都可以在 v$parameter 里看到, 不管是隐含的还是非隐含的。那么如何查询哪些没有修改过的隐含参数呢?使用一下 SQL:

Hidden Parameter

set linesize 1000

SET VERIFY OFF

COLUMN parameter      FORMAT a37

COLUMN description    FORMAT a50 WORD_WRAPPED

COLUMN session_value  FORMAT a10

COLUMN instance_value FORMAT a10

SELECT a.ksppinm AS parameter,

a.ksppdesc AS description,

b.ksppstvl AS session_value,

c.ksppstvl AS instance_value

FROM   x$ksppi a,

x$ksppcv b,

x$ksppsv c

WHERE  a.indx = b.indx

AND    a.indx = c.indx

AND    a.ksppinm LIKE % ||LOWER(1)|| % ESCAPE /

ORDER BY a.ksppinm;

补充

1:  x$ksppi: 这里存的是所有的 parameter name;  x$ksppcv 存的是 session level 的 parameter value, x$ksppsv 存的是 instance level 的 parameter value; 这个通过查询 x$fixed_view_definition 就能看到了

2. oracle snapshot 也会记录下这些 parameter value,所以从这里也能看到是否有变化;

3. 当修改任何一个 parameter 的时候,都会在 alert log 里有记录,所以从这里也能看到所有被改变的 parameter;

感谢各位的阅读,以上就是“Oracle 参数的查询和修改方法”的内容了,经过本文的学习后,相信大家对 Oracle 参数的查询和修改方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计9210字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)