c*****d 发帖数: 6045 | 1 碰到这么一个db link的问题
我有2个db server,比如说是db_a, db_b
然后我在db_a的user_a里创建了一个db_link_a_to_b
create database link db_link_a_to_b
connect to "user_b"
identified by "password_b"
using 'tns_a_to_b'
然后在db_a上创建了tns_a_to_b
tnsping tns_a_to_b成功
SQL> select * from dual@db_link_a_to_b
成功
现在我的laptop上用sqlplus连接db_a
tns_laptop_to_a
sqlplus user_a/password_a@tns_laptop_to_a
SQL> select * from dual@db_link_a_to_b
出错
ERROR at line 1:
ORA-12154: TNS:could not resolve the connect identifier specified
这个是啥情况?
不需要在laptop上创建tns_a_to_b
第一不需要,第二我试过了,还是一样的问题 |
m****d 发帖数: 372 | 2 listener启动的时候TNS_ADMIN设置不同于当前的TNS_ADMIN?
db_a server上:
sqlplus user/pwd@db_a
select * from db_link? 有问题吗?
如果没问题,db_a是不是设置了shared_server?
【在 c*****d 的大作中提到】 : 碰到这么一个db link的问题 : 我有2个db server,比如说是db_a, db_b : 然后我在db_a的user_a里创建了一个db_link_a_to_b : create database link db_link_a_to_b : connect to "user_b" : identified by "password_b" : using 'tns_a_to_b' : 然后在db_a上创建了tns_a_to_b : tnsping tns_a_to_b成功 : SQL> select * from dual@db_link_a_to_b
|
c*****d 发帖数: 6045 | 3 呵呵,大牛出山了
可以看到这个dblink_a_to_b |
B*****g 发帖数: 34098 | 4 鄙视你这种不贴解决方案的
【在 c*****d 的大作中提到】 : 碰到这么一个db link的问题 : 我有2个db server,比如说是db_a, db_b : 然后我在db_a的user_a里创建了一个db_link_a_to_b : create database link db_link_a_to_b : connect to "user_b" : identified by "password_b" : using 'tns_a_to_b' : 然后在db_a上创建了tns_a_to_b : tnsping tns_a_to_b成功 : SQL> select * from dual@db_link_a_to_b
|
c*****d 发帖数: 6045 | |
c*****d 发帖数: 6045 | 6 我在网上找了很久,结果在一个论坛上找到一篇回文
和我的情况一模一样
解决方法很简单,但是原理未知
删除原来的db link
重新创建db link,但是在using 'tns_a_to_b'
换成tnsname.ora中tns_a_to_b的描述
using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(Host =
server_b)(Port = 1521))) (CONNECT_DATA = (SID=sid_b))) '
问题就神奇的解决了 |
c*****d 发帖数: 6045 | 7 究其原因,肯定是因为tns_a_to_b无法解析
现在把tns的描述直接放到db link里问题就解决了
但是为什么找不到tnsnames,
应该是因为tnsname.ora不在缺省位置
但是server_a上的oracle用户的profile里设置了TNS_ADMIN |
m****d 发帖数: 372 | 8 如果db_a没有设置shared server,那应该是TNS_ADMIN的设置问题.listner启动时的TNS
_ADMIN与当前不同。
登陆到db_a server,
sqlplus user/pwd
select * from dual@db_link -> OK
sqlplus user/pwd@db_a
select * from dual@db_link -> get error.
你可以用下面的方法验证一下上面两种情况下TNS_ADMIN返回值是否一样。
SQL> var tmp_str varchar2(255);
SQL> exec dbms_system.get_env('TNS_ADMIN',:tmp_str);
SQL> print tmp_str
我遇到过shared server的问题,前段时间想去弄明白怎么回事的,但一直没空。
【在 c*****d 的大作中提到】 : 究其原因,肯定是因为tns_a_to_b无法解析 : 现在把tns的描述直接放到db link里问题就解决了 : 但是为什么找不到tnsnames, : 应该是因为tnsname.ora不在缺省位置 : 但是server_a上的oracle用户的profile里设置了TNS_ADMIN
|
c*****d 发帖数: 6045 | 9 原因真是启动时TNS_ADMIN与当前的TNS_ADMIN不同!!!
ps -ef | grep tns | awk '{print $2}' | xargs pargs -e | grep TNS
TNS_ADMIN=$ORACLE_HOME/network/admin/$ORACLE_SID
SQL> CONN user/password@tns_laptop_to_a
SQL> var tmp varchar2(255)
SQL> exec dbms_system.GET_ENV('ORACLE_SID',:tmp);
SQL> print tmp
return NULL,这样就是在缺省的目录/var/opt/oracle下找
组里有ID在我前面troubleshooting的时候建议过把$ORACLE_HOME/network/admin/$
ORACLE_SID下的tnsnames.ora拷贝到$ORACLE_HOME/network/admin下试试
没有解决问题
其实我应该想到拷贝到/var/opt/oracle下试试的,晕
TNS
【在 m****d 的大作中提到】 : 如果db_a没有设置shared server,那应该是TNS_ADMIN的设置问题.listner启动时的TNS : _ADMIN与当前不同。 : 登陆到db_a server, : sqlplus user/pwd : select * from dual@db_link -> OK : sqlplus user/pwd@db_a : select * from dual@db_link -> get error. : 你可以用下面的方法验证一下上面两种情况下TNS_ADMIN返回值是否一样。 : SQL> var tmp_str varchar2(255); : SQL> exec dbms_system.get_env('TNS_ADMIN',:tmp_str);
|