今天在客户处测试Oracle 9.2.0.8 on HP-UX IA64的RAC Failover功能,遇到ORA-01034错误。
表现为:
当关闭RAC环境的某一个实例之后(无论是shutdown abort还是shutdown immediate),再用远程客户端通过tns连接RAC Service都会间歇性报ORA-01034错误。
$ sqlplus system/oracle@prod
SQL*Plus: Release 9.2.0.8.0 - Production on Tue Nov 17 20:52:09 2009
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
HPUX-ia64 Error: 2: No such file or directory
客户端的TNS配置是很常规的客户端failover。
PROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = VIP1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = VIP2)(PORT = 1521))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = prod)
(FAILOVER_MODE=
(TYPE=SELECT)
(METHOD=BASIC))
)
)
纳闷许久,仔细检查服务器端的listener.ora配置,才发现设置了GLOBAL_DBNAME,这是对于还没有往本地监听动态注册服务名功能的Oracle8和Oracle7才需要设置,在Oracle9i之后,如果设置了该参数,将会导致Failover失败。
将listener.ora中的配置从:
SID_LIST_LISTENER_PROD2 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME=prod)
(ORACLE_HOME = /oracle/product/9.2)
(SID_NAME = prod2)
)
)
修改为:
SID_LIST_LISTENER_PROD2 =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /oracle/product/9.2)
(SID_NAME = prod2)
)
)
再次测试Failover,一切正常。
结论:
1. 对于监听依然存在,然后数据库实例关闭的情况,必须是在监听中动态注册的服务,才可以实现Failover。
2. GLOBAL_DBNAME会影响Failover。