情景:不同服务器之间的数据库中的数据需要通信(想用触发器)。然后就考虑新建dblink来完成这个需求
类似的这种方式在MySQL中是用FEDERATED引擎,而oracle中是dblink。
##########################################################################################
create public database link 自定义的连接名字 connect to 连接远程服务器的用户 identified by 连接远程服务器的密码
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 目标服务器的ip)(PORT = 目标服务器的端口))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = 目标服务器的服务名)
)
)';
windows上的oracle服务名可以去服务里看。oracleservicexxx xxx就是服务名
或者用这个 select name,value from v$parameter where name='service_names'
也能查出来服务名
-----------------------------------------
然后我遇到的最恶心的问题就是测试的时候 报这个错:TNS:Connect timeout occurred
连接超时 ,然后我一直测啊测,防火墙啥的都关了,ping 目标ip,telnet 目标ip 端口 也都通
后来发现时网络质量问题,贼恶心。
测试方法
select * from 远程服务器的表@你建的连接名字
能查出结果就是没问题。
上边创建的时候
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 目标服务器的ip)(PORT = 目标服务器的端口))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = 目标服务器的服务名)
)
)
这个东西,可以在using后边直接写,也可以在配置文件里边写。。就是在tnsnames.ora文件中配置的目标数据库的连接信息,就是定义一个这样的:
aaa= (DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 目标服务器的ip)(PORT = 目标服务器的端口))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = 目标服务器的服务名)
)
)
这样的话,创建的时候using后边直接写aaa就好了。