我们公司有一个 CRM 系统,它使用Oracle 11g 数据库。它由第三方供应商开发。
我们无权访问运行 CRM 系统的服务器。但是,我们有可用的 DBA 登录数据(SYS 用户)。它包括:
- 服务器IP:172.1.2.3
- 端口:1521
- SID: abc
- 用户:sys
- 密码:*
我们可以使用它通过Oracle SQL Developer 3.1访问数据库(连接 >> 属性)
现在必须将部分数据从 CRM 数据库复制到另一个Oracle 数据库中,该数据库驻留在另一台服务器上。
据我了解,我需要在我的目标数据库中创建一个数据库链接。我试过这样的事情:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO sys IDENTIFIED BY ***** USING 'MYTNSENTRY'
我的tnsnames.ora如下:
MYTNSENTRY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abc)
)
)
....我的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)))
PROGRAM=extproc 是正确的选择吗?还有其他几个程序可供选择。我什至无法使用lsnrctl启动侦听器,因为它无法“验证用户”之类的。具有讽刺意味的是,到MS SQL 服务器的侦听器设置和数据库链接工作顺利。
现在,尽管缺少有关 CRM 数据库系统的一些重要信息,但仍然可以在 SQL Developer 中连接到数据库。难道不是也可以在两个 Oracle DB 之间建立连接吗?请帮助我设置和创建数据库链接。
- - - 编辑: - - - -
Alex Poole 的提示帮助我让它发挥作用。我用了
show parameters service_names;
获取完整的服务名称。它的格式为 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)
)
)
可以在目标数据库服务器的命令提示符下使用tnsping MYTNSENTRY测试连接。tnsnames.ora 是本地的。但是,我删除了对“本地” listener.ora的所有更改,因为该监听器确实驻留在 CRM 服务器上。
SQL 命令几乎没有变化,但现在连接正常:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO some_user IDENTIFIED BY ***** USING 'MYTNSENTRY'