通常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###