3

我们公司有一个 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'
4

2 回答 2

6

您已经说过SIDis abc,但是在您的部分中tnsnames.ora有the 。它们并不总是相同的 - 请参阅此问题或此Ask Tom 条目。您实际上并没有说出您遇到了什么错误,但只是将其更改为可能会有所作为。SERVICE_NAMECONNECT_DATASID =

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';

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

创建公共链接需要比私人链接更多的权限,而公共链接的安全性可能较低,因为它会将您的 CRM 数据库暴露给目标链接上的任何人。因此,我只会在真正需要时将其公开,如果您能够创建一个,则无论哪种方式都可以连接到只读帐户。

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

于 2012-04-18T22:14:07.640 回答
1

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

于 2012-04-18T21:45:32.223 回答