在测试RAC环境的SUSPEND命令时,出现了这个错误。
这一篇继续这个问题,找到导致问题的原因。
SUSPEND导致RAC环境的ORA-29702错误(一):http://yangtingkun.itpub.net/post/468/483337
简单描述一下碰到的问题。测试SUSPEND对于RAC环境的影响时,选择了3节点的RAC环境,保持两个实例打开一个实例关闭的状态,在一个实例上执行SUSPEND命令,这里会发现启动的两个实例都处于SUSPEND状态,随后启动另一个实例,发现这个实例在MOUNT节点会被挂起,不过这个实例的状态是正常的。
随后奇怪的事情发生了,当在任一个实例上执行RESUME命令后,Oracle会自动SHUTDOWN ABORT,并RESTART开始处于启动状态的两个实例中的一个实例,在这个实例对应的alert文件中,可以看到ORA-29702错误。
这个现象描述清楚了,不过不能确定的是,到底是SUSPEND操作对RAC环境的影响,还是由于在SUSPEND状态中,尝试启动了新的实例,导致了这个问题的产生,下面就来测试这个问题。
在节点1上执行下面的操作:
SQL> conn / as sysdba
已连接。
SQL> select instance_name, status, database_status from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS
---------------- ------------ -----------------
testrac1 OPEN ACTIVE
testrac3 OPEN ACTIVE
testrac2 OPEN ACTIVE
SQL>
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select instance_name, status, database_status, startup_time from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS STARTUP_TIME
---------------- ------------ ----------------- -------------------
testrac1 OPEN ACTIVE 2009-02-21 18:37:30
testrac3 OPEN ACTIVE 2009-04-23 10:42:55
testrac2 OPEN ACTIVE 2009-02-21 01:17:58
SQL> alter system suspend;
系统已更改。
SQL> select instance_name, status, database_status, startup_time from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS STARTUP_TIME
---------------- ------------ ----------------- -------------------
testrac1 OPEN SUSPENDED 2009-02-21 18:37:30
testrac3 OPEN SUSPENDED 2009-04-23 10:42:55
testrac2 OPEN SUSPENDED 2009-02-21 01:17:58
可以看到3个节点都处于启动状态,随后执行的SUSPEND命令使得3个节点都会进行到SUSPEND状态。随后在其他节点上执行RESUME命令:
SQL> alter system resume;
系统已更改。
回到实例1检查各个实例是否发生过重启的现象:
SQL> select instance_name, status, database_status, startup_time from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS STARTUP_TIME
---------------- ------------ ----------------- -------------------
testrac1 OPEN ACTIVE 2009-02-21 18:37:30
testrac3 OPEN ACTIVE 2009-04-23 10:42:55
testrac2 OPEN ACTIVE 2009-02-21 01:17:58
显然,没有SHUTDOWN ABORT,没有重启,也没有ORA-29702错误。所有的实例状态都变为正常的ACTIVE。看来对于RAC环境设置SUSPEND是没有问题的,关键还在于在SUSPEND状态下尝试启动新的实例。
下面来验证一下:
bash-2.03$ srvctl stop inst -d testrac -i "testrac2,testrac3"
bash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is not running on node racnode2
Instance testrac3 is not running on node racnode3
bash-2.03$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on 星期六 2月 21 23:04:48 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select instance_name, status, startup_time from v$instance;
INSTANCE_NAME STATUS STARTUP_TIME
---------------- ------------ -------------------
testrac1 OPEN 2009-02-21 18:37:30
SQL> select instance_name, status, database_status from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS
---------------- ------------ -----------------
testrac1 OPEN ACTIVE
SQL> alter system suspend;
系统已更改。
将实例2和实例3全部关闭,然后将当前实例置于SUSPEND状态,下面启动实例2和实例3:
bash-2.03$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on 星期六 2月 21 23:06:44 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 436207752 bytes
Database Buffers 1694498816 bytes
Redo Buffers 14745600 bytes
实例2运行到MOUNT节点被阻塞,而实例3也一样:
bash-3.00$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on 星期四 4月 23 15:15:57 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 352321672 bytes
Database Buffers 1778384896 bytes
Redo Buffers 14745600 bytes
下面在实例1执行RESUME命令:
SQL> alter system resume;
系统已更改。
SQL> select instance_name, status, database_status from gv$instance;
但是随后查询全体实例的语句出现了等待,这时实例2和实例3的启动完成:
数据库装载完毕。
数据库已经打开。
SQL> select instance_name, status, database_status from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS
---------------- ------------ -----------------
testrac2 OPEN ACTIVE
testrac3 OPEN ACTIVE
由于实例2和实例3的结果完全一样,这里只贴出一个。实例2打开后,执行查询GV$INSTANCE的操作也出现了等待,大于半分钟左右,就会出现上面的最终结果,不过这个结果中看不到实例1的信息。
与此同时实例1等待的查询也有了结果,和实例2不同的是,查询报错了:
select instance_name, status, database_status from gv$instance
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束
SQL> conn / as sysdba
已连接。
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select instance_name, status, startup_time from v$instance;
INSTANCE_NAME STATUS STARTUP_TIME
---------------- ------------ -------------------
testrac1 OPEN 2009-02-21 23:09:49
SQL> select instance_name, status, database_status from gv$instance;
INSTANCE_NAME STATUS DATABASE_STATUS
---------------- ------------ -----------------
testrac1 OPEN ACTIVE
testrac3 OPEN ACTIVE
testrac2 OPEN ACTIVE
重新连接后,发现实例1出现了重启。现在可以确定,就是由于在SUSPEND状态下,尝试启动新的实例,导致RAC运行的实例无法确定一致性,从而使得实例发生了重启。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-591871/ ,如需转载,请注明出处,否则将追究法律责任。