use*_*261 3 oracle database-connection database-link heterogeneous-services
我们公司有一个CRM系统,它使用Oracle 11g数据库.它由第三方供应商开发.
我们无权访问运行CRM系统的服务器.但是,我们有可用的DBA登录数据(SYS用户).它包括:
我们可以使用它来使用Oracle SQL Developer 3.1(连接>>属性)访问数据库
现在,部分数据必须从CRM数据库复制到另一个 Oracle数据库中,该数据库驻留在另一台服务器上.
据我了解,我需要在目标数据库中创建一个数据库链接.我试过这样的事情:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO sys IDENTIFIED BY ***** USING 'MYTNSENTRY'
Run Code Online (Sandbox Code Playgroud)
我的tnsnames.ora如下:
MYTNSENTRY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abc)
)
)
Run Code Online (Sandbox Code Playgroud)
....而我的listener.ora看起来像这样:
MYLISTENER=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=172.1.2.3)(PORT=1521))
))
SID_LIST_MYLISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=MYTNSENTRY)
(ORACLE_HOME=C:\somepath) # path to Oracle home of target DB
(PROGRAM=extproc)))
Run Code Online (Sandbox Code Playgroud)
PROGRAM = extproc是正确的选择吗?还有其他一些程序可供选择.我甚至无法用lsnrctl启动监听器,因为它无法"验证用户"或其他东西.具有讽刺意味的是,到MS SQL服务器的侦听器设置和数据库链接可以顺利运行.
现在尽管缺少关于CRM DB系统的一些重要信息,但仍可以在SQL Developer中连接到数据库.是不是也可以在两个Oracle DB之间建立连接?请帮我设置和创建数据库链接.
-----编辑:--------
Alex Poole的暗示帮助我开始工作.我用了
show parameters service_names;
Run Code Online (Sandbox Code Playgroud)
获取完整的服务名称.它的格式为abc.def,def为域.因此,我将域名添加到tnsnames.ora中的TNS别名:
MYTNSENTRY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abc.def)
)
)
Run Code Online (Sandbox Code Playgroud)
可以在目标DB服务器的命令提示符下使用tnsping MYTNSENTRY测试连接.tnsnames.ora是本地的.但是,我删除了对"local" listener.ora的所有更改,因为侦听器确实驻留在CRM服务器上.
SQL命令基本没有变化,但现在连接有效:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO some_user IDENTIFIED BY ***** USING 'MYTNSENTRY'
Run Code Online (Sandbox Code Playgroud)
你说的SID就是abc,但在你的tnsnames.ora,你已经得到了SERVICE_NAME在CONNECT_DATA部分.它们并不总是相同的 - 看到这个问题,或者这个问问汤姆的条目.你实际上没有说过你会得到什么错误,但只是改变它SID =可能会有所作为.
的listener.ora,而事实上听众,是托管CRM数据库,而不是承载您的"目标"数据库中的一个服务器上.您可以从显然已配置的SQL Developer进行连接.在tnsnames.ora确实需要地方.
但是,如果你确实知道service_nameCRM数据库,你可以跳过它并使用EZCONNECT语法来定义链接中的所有内容:
CREATE PUBLIC DATABASE LINK xxx
CONNECT TO non-sys IDENTIFIED BY *****
USING '//172.1.2.3:1521/service_name';
Run Code Online (Sandbox Code Playgroud)
检查您的SQL Developer配置,看看它是否已经使用了服务名称,而不是SID,如果没有,您需要发现它.如果您可以访问CRM服务器,则可以使用它lsnrctl来查找已注册的服务名称,但由于您似乎不需要连接到数据库并运行show parameters service_names或select value from v$parameter where name = 'service_names';.
您需要更多权限来创建公共链接而不是私有链接,并且公共可能不太安全,因为它将您的CRM数据库暴露给目标网站上的任何人.因此,如果真的需要,我只会将其公开,并且如果您能够创建一个帐户连接到只读帐户.
另请注意,如果目标数据库已global_names设置为true数据库,则链接名称必须与远程服务名称匹配.