最近在用虚拟机上的Oracle RAC做实验,看到后台日志一直报错,原因是配置的log_archive_dest_2参数指到了节点2,而节点2又没有开机,所以导致一直有报错。于是想这一参数是之前做实验的时候修改的,现在不需要了,直接把这个参数重置一下就可以了,于是执行了下面的语句:
alter system reset log_archive_dest_2;
再使用show parameter查看参数已经被清空了:
SQL> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string
看alert日志中报错也没有了,以为这样事情就结束了。但事实上还没有结束。等下一次数据库重启后看到之前的报错又出现了,而且log_archive_dest_2参数的设置又恢复到了重置之前的值:
SQL> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string service=rac2
难道是上次重置没有成功吗?
从上次的检查结果来看重置是成功的,而且alert日志中也提示修改成功。
那为什么这么灵异的事情居然发生了呢?
尝试再次重置:
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具体是怎么设置的:
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都做了设置,难道是这个原因么?
再次尝试重置,这次语句如下:
alter system reset log_archive_dest_2 sid='orcl1';
再次生成pfile文件,看到orcl1.log_archive_dest_2='service=rac2'这条记录已经没有了,说明已经把配置清除了,重启实例再次查看:
SQL> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string
alert日志中也不再报错了。
那么问题又来了,我第一次清除的又是什么配置呢?
有经验的同学应该已经想到这个问题的原因了。我们继续看下面的分析。
我们再回到第一次生成的spfile文件中可以看到如下配置,我们以log_archive_dest_1参数为例
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
parameter_name =
parameter_value [, parameter_value ]...
[ COMMENT = string ]
[ DEFERRED ]
[ { SCOPE = { MEMORY | SPFILE | BOTH }
| SID = { 'sid' | '*' }
}...
]
reset parameter
parameter_name
[ { SCOPE = SPFILE
| SID = { 'sid' | '*' }
}...
]
从上面的语法可以看到,设置和重置参数都有一个可选项:SID = { 'sid' | '*' },而默认的都是SID='*'。