暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

IT小Chen 2021-04-13
850

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

                        文章转载自IT小Chen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论