ITPub博客

首页 > 数据库 > Oracle > RAC环境下连接指定实例的实验

RAC环境下连接指定实例的实验

原创 Oracle 作者:zildjianzhang 时间:2007-07-24 10:09:28 0 删除 编辑

今天在一次简单的通过远程服务器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 sys/racdb@racdb 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> conn sys/racdb@racdb as sysdba
已连接。
SQL>

可是虽然连接成功,但我又产生了另一个考虑,如何能显式的连接到集群中的指定实例呢?于是作了以下实验:

思考一:在客户端

客户端,由于每次连接只能是通过tnsnames的NET SERVICE ALIAS来解析服务名,而且由于集群安装成功后,net connection balancing是启动的!所以,每次通过客户端连接都是透明的,连接到racdb1和racdb2的可能性都存在。

SQL> conn sys/racdb@racdb2 as 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> conn sys/racdb@racdb as sysdba
已连接。
SQL> select instance_name ,status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
racdb2 OPEN

SQL> conn sys/racdb@racdb as sysdba
已连接。
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> conn sys/racdb@racdb1 as 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> conn sys/racdb@racdb2 as 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 sys/racdb@10.129.0.68:1521/racdb as sysdba
已连接。
SQL> select instance_name, status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
racdb1 OPEN

思考中......

由于EASY CONNECTION 的语法是CONNECT username/password@[//]host[:port][/service_name]

而service_name就是racdb,而无法进一步指明racdb1或是racdb2实例了

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/404722/viewspace-927680/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    15
  • 访问量
    206099