分类: Linux
这个问题其实已经在文章《CLUSTER_DATABASE_INSTANCES参数》中提到过,但是当时并没有太在意。以至于在随后两天的测试中,连续两次由于这个问题导致了RAC实例无法启动,因此还是有必要单独描述一下这个问题。
CLUSTER_DATABASE_INSTANCES参数:http://yangtingkun.itpub.net/post/468/482960
对于RAC数据库而言,初始化参数可以多个实例共用,也可以设置各自实例的初始化参数。
用来标识实例本身的初始化参数就不用说了,每个实例必须单独设置。剩下的参数都是可以共用,也可以每个实例单独设置。在实例上设置的参数会覆盖数据库级的参数设置。
虽然没有什么参数是必须多个实例共用,但是有些参数要求各个实例的配置必须一致,否则会导致实例无法启动。
一个例子就是上面的提到的CLUSTER_DATABASE_INSTANCES:
SQL> show parameter cluster_database_instances
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database_instances integer 2
SQL> select instance_name from gv$instance;
INSTANCE_NAME
----------------
test1
test2
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
test1
在这个RAC环境中,有两个实例,CLUSTER_DATABASE_INSTANCES的配置也是2。
对于CLUSTER_DATABASE_INSTANCES这种不能直接修改,只有重启数据库实例才能生效的参数,如果修改SPFILE后需要注意:
SQL> alter system set cluster_database_instances = 3;
alter system set cluster_database_instances = 3
*
第 1 行出现错误:
ORA-02095: 无法修改指定的初始化参数
SQL> alter system set cluster_database_instances = 3 scope = spfile;
系统已更改。
修改参数很容易,但是留下一个隐患,下次重启数据库的时候两个实例必须全部重启,否则就会导致错误:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORA-29707: inconsistent value 3 for initialization parameter cluster_database_instances with other instances
如果要重启其中某个实例,关闭并启动时会报错。
问题很简单,由于CLUSTER_DATABASE_INSTANCES参数的修改不影响正在运行的实例,因此另一个运行的实例的参数设置为2,而现在要以参数值3启动当前实例,所以导致错误的产生。
解决方法有很多种,比如关闭另外的实例,然后重启整个数据库,或者修改SPFILE,将参数改变回原值,或者通过pfile的方式为实例指定一个临时的值。无论何种方法要最终解决这个问题还需要所有实例同时重启。
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options 断开
bash-3.00$ srvctl stop db -d test
bash-3.00$ srvctl start db -d test
bash-3.00$ sqlplus "/ as sysdba"
SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 4月 24 16:16:16 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> show parameter cluster_database_instances
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database_instances integer 3
还有一种参数也要求多个实例的设置必须相同,且这种参数是可以动态修改的:
SQL> show parameter log_archive_config
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_config string DG_CONFIG=(test,teststby)
SQL> alter system set log_archive_config = '';
系统已更改。
SQL> show parameter log_archive_config
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_config string
由于这个参数的修改不需要重启,所以修改很轻松,即修改了当前实例,也修改了SPFILE,使得数据库所有的实例重启都使用新设置的值。似乎没有什么问题,然后这个操作已经埋下了问题。
如果当前的实例需要重启,则会碰到错误:
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
test1
SQL> select instance_name from gv$instance;
INSTANCE_NAME
----------------
test1
test2
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 776896512 bytes
Fixed Size 2098776 bytes
Variable Size 220912040 bytes
Database Buffers 549453824 bytes
Redo Buffers 4431872 bytes
数据库装载完毕。
ORA-03113: 通信通道的文件结束
进程 ID: 24455
会话 ID: 58 序列号: 6
重启居然碰到了ORA-3113错误,检查alert文件可以发现,问题就是LOG_ARCHIVE_CONFIG参数在两个实例上配置不同造成的:
Fri Apr 24 16:31:47 2009
ALTER DATABASE MOUNT
NOTE:Loaded library: System
SUCCESS: diskgroup DATA was mounted
Errors in file /data/oracle/diag/rdbms/test/test1/trace/test1_ping_24656.trc:
Setting recovery target incarnation to 1
Successful mount of redo thread 1, with mount id 1983157714
Database mounted in Shared Mode (CLUSTER_DATABASE=TRUE)
Lost write protection disabled
Completed: ALTER DATABASE MOUNT
Fri Apr 24 16:31:54 2009
ALTER DATABASE OPEN
Picked broadcast on commit scheme to generate SCNs
WARNING: The 'LOG_ARCHIVE_CONFIG' init.ora parameter settings
are inconsistent with another started instance. This may be
caused by the 'DB_UNIQUE_NAME' init.ora parameter being specified
differently on one or more of the other RAC instances; the
DB_UNIQUE_NAME parameter value MUST be identical for all
instances of the database.
Errors in file /data/oracle/diag/rdbms/test/test1/trace/test1_lgwr_24686.trc:
ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance
Errors in file /data/oracle/diag/rdbms/test/test1/trace/test1_lgwr_24686.trc:
ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance
LGWR (ospid: 24686): terminating the instance due to error 16188
Fri Apr 24 16:31:54 2009
ORA-1092 : opitsk aborting process
Fri Apr 24 16:31:54 2009
System state dump is made for local instance
System State dumped to trace file /data/oracle/diag/rdbms/test/test1/trace/test1_diag_24652.trc
Trace dumping is performing id=[cdmp_20090424163154]
Fri Apr 24 16:31:56 2009
Instance terminated by LGWR, pid = 24686
即使修改另外实例上的LOG_ARCHIVE_CONFIG参数,也无法解决这个问题:
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
test2
SQL> alter system set log_archive_config = '' scope = memory;
系统已更改。
重启实例1仍然是ORA-3113错误,只能重启整个数据库:
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 776896512 bytes
Fixed Size 2098776 bytes
Variable Size 220912040 bytes
Database Buffers 549453824 bytes
Redo Buffers 4431872 bytes
数据库装载完毕。
ORA-03113: 通信通道的文件结束
进程 ID: 29431
会话 ID: 145 序列号: 1
SQL> exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options 断开
bash-3.00$ srvctl stop db -d test
PRKP-1002 : Error stopping instance test1 on node ser1
CRS-0233: ??????????????????????????????????????
bash-3.00$ srvctl start db -d test
bash-3.00$ sqlplus "/ as sysdba"
SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 4月 24 16:43:56 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> show parameter log_archive_config
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_config string
SQL> select instance_name from gv$instance;
INSTANCE_NAME
----------------
test1
test2
需要注意LOG_ARCHIVE_CONFIG参数只是在清除参数设置的时候才会有问题,如果是设置不同的值并不会导致上面的错误。