这其实是个小问题,创建dblink的语法语句随处可见,可我着实为了这个连接远程数据库的事情折腾了几天。
需求是这样的,在本地利用Oracle SQL Developer工具创建一个远程数据库A的连接,然后在该连接上建立另一个远程数据库B的连接,以便于两个数据库同步数据。
我以往在win系统上用PL/SQL的时候习惯了直接去配置oracle的tnsnames.ora文件,直接配置link然后在PL/SQL里执行@linkName就行了。
后来因为改用ubuntu系统所以使用了sqldeveloper,免安装且exe、sh同时支持很方便。
后来又换回win7系统还是用了这个,但是我配置远程连接的习惯还是没变,我依然会去tnsnames.ora里面直接配置link信息。
这次的配置原本在本地和服务器A上都是可以用的,后来客户服务器A上的jdk被客户重装了(这导致我在远程服务器上使用sqldeveloper时启动报错:无法启动Java虚拟机,这个问题我网上找了各种解决方案均未成功,客户装的jdk是1.6的,我使用的sqldeveloper工具大概是3.0?我也忘了);
然后我本地的oracle被我卸载了,为了这个问题又给装回来了,结果却行不通了,每次执行sql语句@linkName都会报错:ORA-12154: TNS: 无法解析指定的连接标识符,这个问题我也在网上找了各种解决方案均未成功,后来我重新下载了最新版本的sqldeveloper4.1.3和匹配的最新版本的jdk-8,安装配置完执行sql发现还是同样的错误,在我一筹莫展求助朋友时,一个朋友说他从来都是用sql语句创建的databaselink,让我恍然大悟,我为啥要执着于配置tnsnames.ora呢?(心里在流泪,好受伤T^T)
然后我直接执行了这个create语句,创建成功。然后执行sql@linkName结果出来了。就这样我琢磨了两天的问题解决了。
创建dblink语句如下:
create database link linkName
connect to linkUser identified by linkPwd
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = linkIP)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = linkServiceName)
)
)';
使用dblink例如:select * from tableName@linkName;
这里linkName自己定,linkUser和linkPwd就是我这里的数据库B的用户名、密码,linkIP是B所在服务器的ip,1521是默认端口不一样的直接改,然后是linkServiceName是服务名,这里如果是SID名,就换成SID_NAME=linkSIDName。
1.简单创建SQL如下
CREATE PUBLIC DATABASE LINK dblink_test CONNECT TO 当前登陆用户名 IDENTIFIED BY 用户密码 using 'IP:PORT/SID';
2.查询数据表
select * from 数据表@dblink_test
3.对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用:
CREATE OR REPLACE SYNONYM 数据表名 FOR 数据表名@zrhs_test;