Oracle RAC参数设置优先级别问题分析

通常oracle参数文件优先级别都比较清楚,spfilesid.ora>spfile.ora>initsid.ora>init.ora,

那么参数设置的优先级别又是怎么样的?

问题:

在rac环境下,修改参数,可以指定sid='*',也可以指定sid='sid',那么在spfile参数文件中,

对同一个参数,sid='*'和sid='sid'记录不同的值,重启实例后,哪个值会优先生效呢。

结论:

例如一套两节点RAC,dbname为cjcdb,实例1和2分别是cjcdb1和cjcdb2,初始设置归档路径如下:

SQL> alter system set log_archive_dest_1='location=+ARCH/arch1' sid='cjcdb1';
SQL> alter system set log_archive_dest_1='location=+ARCH/arch2' sid='cjcdb2';

后来由于某种原因,需要更改归档目录,将实例1和实例2归档路径都统一设置为+ARCH/arch目录,

执行如下命令:

SQL> alter system set log_archive_dest_1='location=+ARCH/arch' sid='*';

此时内存和spfile参数文件中的log_archive_dest_1参数都已经修改为+ARCH/arch,

当前归档目录也变成了+ARCH/arch目录,

此时参数文件sfile中记录log_archive_dest_1参数的值有三个,分别是:

SID NAME       TYPE   VALUE
-------- ----------------------------- ----------- ----------------------------
* log_archive_dest_1       string   location=+ARCH/arch
cjcdb1 log_archive_dest_1       string   location=+ARCH/arch1
cjcdb2 log_archive_dest_1       string   location=+ARCH/arch2

那么如果重启实例后,log_archive_dest_1值会变回原+ARCH/arch1和+ARCH/arch2值。

即,重启后sid='实例名'参数优先级高于sid='*';

实验过程如下:

一:配置数据库归档路径

[grid@vmrh74db02 ~]$ asmcmd
ASMCMD> cd ARCH
ASMCMD> mkdir arch1
ASMCMD> mkdir arch2
SQL> alter system set log_archive_dest_1='location=+ARCH/arch1' sid='cjcdb1';
SQL> alter system set log_archive_dest_1='location=+ARCH/arch2' sid='cjcdb2';

SQL> archive log list;
Database log mode       Archive Mode
Automatic archival       Enabled
Archive destination       +ARCH/arch1
Oldest online log sequence     533
Next log sequence to archive   534
Current log sequence       534

SQL> show parameter log_archive_dest_1
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1     string location=+ARCH/arch1

SQL> show spparameter log_archive_dest_1
SID NAME       TYPE   VALUE
-------- ----------------------------- ----------- ----------------------------
cjcdb1 log_archive_dest_1       string   location=+ARCH/arch1
cjcdb2 log_archive_dest_1       string   location=+ARCH/arch2

二:修改归档路径

SQL> alter system set log_archive_dest_1='location=+ARCH/arch' sid='*';
System altered.

三:查看参数信息

实例1和实例2当前归档路径已经修改成+ARCH/arch。

SQL> archive log list;
Database log mode       Archive Mode
Automatic archival       Enabled
Archive destination       +ARCH/arch
Oldest online log sequence     534
Next log sequence to archive   535
Current log sequence       535

SQL> show parameter log_archive_dest_1
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1     string location=+ARCH/arch

此时spfile存在三个值。

SQL> show spparameter log_archive_dest_1
SID NAME       TYPE   VALUE
-------- ----------------------------- ----------- ----------------------------
*     log_archive_dest_1       string   location=+ARCH/arch
cjcdb1 log_archive_dest_1       string   location=+ARCH/arch1
cjcdb2 log_archive_dest_1       string   location=+ARCH/arch2

四:重启实例

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 3724607488 bytes
Fixed Size    2258760 bytes
Variable Size 1006635192 bytes
Database Buffers 2701131776 bytes
Redo Buffers   14581760 bytes
Database mounted.
Database opened.

五:查看当前归档目录

重启实例后,归档路径又变回原来的路径,之前sid='*'级别的修改没有生效。

SQL> archive log list;
Database log mode       Archive Mode
Automatic archival       Enabled
Archive destination       +ARCH/arch1
Oldest online log sequence     535
Next log sequence to archive   536
Current log sequence       536

SQL> show parameter log_archive_dest_1
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1     string location=+ARCH/arch1

SQL> show spparameter log_archive_dest_1
SID NAME       TYPE   VALUE
-------- ----------------------------- ----------- ----------------------------
*     log_archive_dest_1       string   location=+ARCH/arch
cjcdb1 log_archive_dest_1       string   location=+ARCH/arch1
cjcdb2 log_archive_dest_1       string   location=+ARCH/arch2

六:可能存在的问题

可以考虑如下场景,生产环境下一开始rac实例的归档目录分别在各自服务器本地文件系统上,例如/arch1和/arch2。

后来出于某种原因,创建了单独的归档ASM磁盘组,将归档目录改到了ASM磁盘组下,

后来的某一天,又因为某种原因,重启了数据库实例,此时归档路径又会被重置成原本地文件系统目录,

此时如果没有注意到归档路径发生了改变,可能会引发归档空间不足或数据库挂起等情况。

七:解决方案

在RAC环境下修改参数时,例如log_archive_dest_1,需要查看下当前spfile下此参数的值是否唯一,

如果不唯一,在修改时,需要将sid='*'和sid='sid'同时修改,例如:

查看当前spfile记录的log_archive_dest_1值:

SQL> show spparameter log_archive_dest_1
SID NAME       TYPE   VALUE
-------- ----------------------------- ----------- ----------------------------
cjcdb1 log_archive_dest_1       string   location=+ARCH/arch1
cjcdb2 log_archive_dest_1       string   location=+ARCH/arch2

修改归档路径到+ARCH/arch路径下

alter system set log_archive_dest_1='location=+ARCH/arch' sid='*';
alter system set log_archive_dest_1='location=+ARCH/arch' sid='cjcdb1';
alter system set log_archive_dest_1='location=+ARCH/arch' sid='cjcdb2';

###chenjuchao 2021-02-06 16:50###

请使用浏览器的分享功能分享到微信等