无法在Oracle-DB中创建到远程数据库的数据库链接

时间:2012-04-18 20:37:09

标签: oracle database-connection database-link heterogeneous-services

我们公司有一个CRM系统,它使用 Oracle 11g数据库。它由第三方供应商开发。

我们无法访问运行CRM系统的服务器。但是,我们有可用的DBA登录数据(SYS用户)。它包括:

  • 服务器IP:172.1.2.3
  • port:1521
  • SID:abc
  • user: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是本地的。但是,我删除了对“local” listener.ora,的所有更改,因为侦听器确实驻留在CRM服务器上。

SQL命令基本没有变化,但现在连接有效:

CREATE PUBLIC DATABASE LINK xxx CONNECT TO some_user IDENTIFIED BY ***** USING 'MYTNSENTRY'

2 个答案:

答案 0 :(得分:6)

您已说SIDabc,但在tnsnames.ora SERVICE_NAME部分,CONNECT_DATA部分中有SID =。它们并不总是相同的 - 请参阅this question或此Ask Tom entry。您实际上没有说过您遇到的错误,但只是将其更改为listener.ora可能会有所不同。

tnsnames.ora,实际上是侦听器,位于托管CRM数据库的服务器上,而不是承载“目标”数据库的服务器上。您可以从显然已配置的SQL Developer进行连接。 service_name确实需要是本地的。

但是,如果你确实知道CRM数据库的CREATE PUBLIC DATABASE LINK xxx CONNECT TO non-sys IDENTIFIED BY ***** USING '//172.1.2.3:1521/service_name'; ,你可以跳过它并使用EZCONNECT语法来定义链接中的所有内容:

lsnrctl

检查您的SQL Developer配置,看看它是否已经使用了服务名称,而不是SID,如果没有,您需要发现它。如果您有权访问CRM服务器,则可以使用show parameters service_names查找已注册的服务名称,但由于您似乎不需要连接到数据库并运行select value from v$parameter where name = 'service_names';或{ {1}}。

您需要更多权限来创建公共链接而不是私有链接,并且公共可能不太安全,因为它将您的CRM数据库公开给目标网站上的任何人。因此,如果真的需要,我只会将其公开,并且如果您能够创建一个帐户,则可以连接到只读帐户。

另请注意,如果目标数据库的global_names设置为true,则数据库链接名称必须与远程服务名称匹配。

答案 1 :(得分:1)

除非必要,否则不应以SYS身份连接,也不能通过数据库链接以SYS身份连接。