今天在一次简单的通过远程服务器sqlplus连接RACD集群中的实例竟然失败:
SQL*Plus: Release 10.1.0.4.2 - Production on 星期二 7月 24 10:13:07 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn sysdba
ERROR:
ORA-12154: TNS: 无法解析指定的连接标识符as
后经过调查,原来罪魁是新近安装的ORACLE_BI套件,由于它的安装,导致了使用的客户端的环境变量发生变化,后安装的BI套件变成了默认的。所以,所使用的sqlplus程序和tnsname文件等一系列东东都变成了BI那一套,由于从未配置过到达RAC的连接,所以连的上才怪呢。
后来在安装OUI调整了二者的顺序,重新启动服务器(不重起无法生效)。一切恢复正常!(注意上下两个sqlplus的版本的区别)
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 7月 24 10:21:31 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> connas sysdba
已连接。
SQL>
可是虽然连接成功,但我又产生了另一个考虑,如何能显式的连接到集群中的指定实例呢?于是作了以下实验:
思考一:在客户端
客户端,由于每次连接只能是通过tnsnames的NET SERVICE ALIAS来解析服务名,而且由于集群安装成功后,net connection balancing是启动的!所以,每次通过客户端连接都是透明的,连接到racdb1和racdb2的可能性都存在。
SQL> connas sysdba
已连接。
SQL> select instance_name ,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
racdb1 OPEN
人为关闭实例1(racdb1):
C:>srvctl stop instance -d racdb -i "racdb1" -o immediate
再连接,则数据库透明的切换到racdb2实例:
SQL> connas sysdba
已连接。
SQL> select instance_name ,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
racdb2 OPEN
SQL> conn assysdba
已连接。
SQL> select instance_name ,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
racdb2 OPEN
上面的实验也证明了这个观点,通过人为的关闭实例1(racdb1),应用将连接到rac2上。那么,只好手工修改所使用的客户端的tnsnames文件了,添加一行指定实例的描述:
RACDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.0.66)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
(INSTANCE_NAME = racdb2) )
)
连接成功!
思考二:在服务端
今天通过实验,在服务端通过设置环境变量,成功连接到指定的实例
C:>set oracle_sid=racdb1
C:>sqlplus/nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 7月 25 16:21:15 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> connas sysdba
已连接。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
racdb1
C:>set oracle_sid=racdb2
C:>sqlplus/nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 7月 25 16:23:15 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> connas sysdba
已连接。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
racdb2
进一步,我尝试了绕过netservice解析,打算通过easy connection 来实现对集群指定实例的访问。可是无论怎么设置环境变量,还都只能连上racdb1实例。
C:>sqlplus/nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 7月 24 10:23:46 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn as sysdba
已连接。
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
racdb1 OPEN
思考中......
由于EASY CONNECTION 的语法是CONNECT ]
而service_name就是racdb,而无法进一步指明racdb1或是racdb2实例了[@more@]