使用alter system set修改参数不生效

简介:

最近在用虚拟机上的Oracle RAC做实验,看到后台日志一直报错,原因是配置的log_archive_dest_2参数指到了节点2,而节点2又没有开机,所以导致一直有报错。于是想这一参数是之前做实验的时候修改的,现在不需要了,直接把这个参数重置一下就可以了,于是执行了下面的语句:

1
alter system reset log_archive_dest_2;

再使用show parameter查看参数已经被清空了:

1
2
3
4
5
SQL> show parameter log_archive_dest_2 
 
NAME                      TYPE   VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2           string

看alert日志中报错也没有了,以为这样事情就结束了。但事实上还没有结束。等下一次数据库重启后看到之前的报错又出现了,而且log_archive_dest_2参数的设置又恢复到了重置之前的值:

1
2
3
4
5
SQL> show parameter log_archive_dest_2 
 
NAME                      TYPE   VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2           string     service=rac2

难道是上次重置没有成功吗?

从上次的检查结果来看重置是成功的,而且alert日志中也提示修改成功。

那为什么这么灵异的事情居然发生了呢?

尝试再次重置:

1
2
3
4
5
SQL>  alter  system reset log_archive_dest_2;
alter  system reset log_archive_dest_2
*
ERROR  at  line 1:
ORA-32010: cannot find entry  to  delete  in  SPFILE

看到出现上面的报错,是说spfile中没有相应的条目可以删除。

如果没有条目我的设置又是从哪里来的呢?

于是生成pfile来查看参数文件中关于log_archive_dest_2具体是怎么设置的:

1
2
3
4
5
orcl2.log_archive_dest_1= 'location=/home/oracle/rac2'
orcl1.log_archive_dest_1= 'location=/home/oracle/rac1'
*.log_archive_dest_1= 'location=+data'
orcl2.log_archive_dest_2= 'service=rac1'
orcl1.log_archive_dest_2= 'service=rac2'

从上面可以看到针对每一个实例的log_archive_dest_2都做了设置,难道是这个原因么?

再次尝试重置,这次语句如下:

1
alter  system reset log_archive_dest_2 sid= 'orcl1' ;

再次生成pfile文件,看到orcl1.log_archive_dest_2='service=rac2'这条记录已经没有了,说明已经把配置清除了,重启实例再次查看:

1
2
3
4
5
SQL> show parameter log_archive_dest_2 
 
NAME                      TYPE   VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2           string

alert日志中也不再报错了。

那么问题又来了,我第一次清除的又是什么配置呢?

有经验的同学应该已经想到这个问题的原因了。我们继续看下面的分析。

我们再回到第一次生成的spfile文件中可以看到如下配置,我们以log_archive_dest_1参数为例

1
2
3
orcl2.log_archive_dest_1= 'location=/home/oracle/rac2'
orcl1.log_archive_dest_1= 'location=/home/oracle/rac1'
*.log_archive_dest_1= 'location=+data'

对于log_archive_dest_1参数设置有两类,一类是'*.'开头的,一个是以'<sid>.'开头的。'*.'开头的设置是对所有与数据库相关的且没有设置该参数的实例有效,而以'<sid>.'开头的设置只对设置对应的实例有效。

我这前是对两个实例orcl1和orcl2的log_archive_dest_1分别设置了不同的值,而分别设置之前所有的实例的log_archive_dest_1参数值都是'location=+data'。

我们再来看alter system set|reset parameter的语法:

set parameter

1
2
3
4
5
6
7
8
parameter_name =
    parameter_value [, parameter_value ]...
    [ COMMENT = string ]
    [ DEFERRED ]
    [ { SCOPE = { MEMORY | SPFILE | BOTH }
      | SID = {  'sid'  '*'  }
      }...
    ]

reset parameter 

1
2
3
4
5
parameter_name
    [ { SCOPE = SPFILE 
      | SID = {  'sid'  '*'  }
      }...
    ]

从上面的语法可以看到,设置和重置参数都有一个可选项:SID = { 'sid' | '*' },而默认的都是SID='*'。

这里应该就可以解释我第一次重置log_archive_dest_2时为什么可以成功,而第二次没有成功的原因:我第一次删除了*.log_archive_dest_2='xxxx'这一条目,第一次再次删除时文件中没有了,所以报错。

这也能解释为什么重置时加上sid='orcl1'项后重启依然生效。

还有一个问题就是如果参数文件中,对于同一个参数同时有'*.'开头的和以'<sid>.'开头的参数设置时,Oracle会选哪个做为实例的参数设置的,我们来看一句官方文档中对SID的描述,就可以回答这个问题了:

SID The SID clause lets you specify the SID of the instance where the value will take effect.

  • Specify SID = '*' if you want Oracle Database to change the value of the parameter for all instances that do not already have an explicit setting for this parameter.

  • Specify SID = 'sid' if you want Oracle Database to change the value of the parameter only for the instance sidThis setting takes precedence over previous and subsequent ALTER SYSTEM SET statements that specify SID = '*'.

If you do not specify this clause, then:

  • If the instance was started up with a pfile (traditional plain-text initialization parameter file), then Oracle Database assumes the SID of the current instance.

  • If the instance was started up with an spfile (server parameter file), then Oracle Database assumes SID = '*'.

小提示:可以使用show spparameter <parameter_name>查看spfile中对于参数的设置

1
2
3
4
5
6
sys@ORA11G>show spparameter log_archive_dest_1
 
SID   NAME                  TYPE     VALUE
-------- ----------------------------- ----------- ----------------------------
ora11g   log_archive_dest_1           string       location=/home/oracle/dump
*    log_archive_dest_1           string       location=/u01/


参考:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2014.htm#i2061284


      本文转自hbxztc 51CTO博客,原文链接:http://blog.51cto.com/hbxztc/1972907,如需转载请自行联系原作者







相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
关系型数据库 PostgreSQL
PostgreSQL 的哪些参数不能通过ALTER SYSTEM SET 修改
在 PostgreSQL 中,有一些参数是不能通过 `ALTER SYSTEM SET` 语句进行动态修改的,这些参数通常需要在 PostgreSQL 的配置文件中进行手动修改。以下是一些不能通过 `ALTER SYSTEM SET` 修改的常见参数: 1. **track_activities** 2. **track_counts** 3. **track_io_timing** 4. **track_functions** 5. **track_activity_query_size** 6. **track_commit_timestamp** 7. **shared_preload
|
关系型数据库 MySQL
ALTER TABLE 对 Null 值和默认值的影响
ALTER TABLE 对 Null 值和默认值的影响
247 0
|
关系型数据库 MySQL 数据库
mysql中的update(更新)与alter(更改)以及 change和modify的区别
mysql中的update(更新)与alter(更改)以及 change和modify的区别
1167 0
|
Oracle 关系型数据库 Linux