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 DB系统的重要信息,但仍然可以使用SQL Developer连接到数据库。不应该也可以在两个Oracle DB之间建立连接吗?请帮助我设置和创建数据库链接。

-----编辑:--------

亚历克斯·普尔的提示帮助我得到它的工作。我用

show parameters service_names; 

得到完整的服务名称。它的格式为abc.def,其中def为域。因此,我在tnsnames中将域名添加到TNS别名中。ORA

MYTNSENTRY = 
(DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521)) 
    ) 
(CONNECT_DATA = 
    (SERVICE_NAME = abc.def) 
) 
) 

的连接可以与在目标DB服务器的命令提示TNSPING MYTNSENTRY进行测试。 tnsnames.ora是本地的。但是,我删除了对“本地”listener.ora,的所有更改,因为侦听程序确实驻留在CRM服务器上。

的SQL命令大多是不变的,但现在可以进行连接:

+0

TNSNames文件中包含来自“其他”(非CRM)oracle数据库上的TNSNames文件的那个条目,对不对? 我不确定您必须对目标数据库上的侦听器执行任何操作。至少,我从来不需要。据我所知,目标数据库像处理任何其他连接一样处理传入的数据库链接(但我可能错了) – moleboy 2012-04-18 20:43:16

+0

我也确实不希望以sys用户身份创建数据库链接(或者,至少,我不会......如果只是为了安全起见) – moleboy 2012-04-18 20:45:31

+0

同意。 'SYS'在Oracle中非常特别,应该谨慎小心。 – 2012-04-18 20:46:36

回答

1

不仅应该对你不连接为SYS除非必要,您无法连接作为SYS通过数据库链接。

+0

我最初的想法是在测试时不会因缺乏特权而产生额外的问题。但是由于它甚至有限制,我想我会改变它,即使是测试。 – user748261 2012-04-18 23:48:31

6

你说SIDabc,但在你的tnsnames.ora你有在CONNECT_DATA部分SERVICE_NAME。它们并不总是相同的东西 - 参见this questionAsk Tom entry。你实际上并没有说你得到了什么错误,但只是将其改为SID =可能会有所作为。

listener.ora,确实听众,是托管CRM数据库,而不是承载您的“目标”数据库中的一个服务器上。正如你可以从SQL Developer连接,显然已经配置好了。 tnsnames.ora确实需要是本地的。

但是,如果你知道service_name的CRM数据库,你可以跳过,并使用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,则数据库链接名称必须与远程服务名称匹配。

+0

你建议使用**'// 172.1.2.3:1521/abc.domain'**。如何查看我的案例中的.domain信息?我必须检查是否有任何非管理员用户可以查看我们需要的所有表格。尽管如此,我不愿意在我不完全了解的系统上修改用户权限。 – user748261 2012-04-18 23:21:40

+0

@ user748261 - 我真的是说服务名称,我猜的是格式。我已经通过一些链接和更多信息更新了答案。尽管如此,请将您所看到的实际错误添加到您的问题中,因为我在黑暗中拍摄了一下! – 2012-04-19 07:53:40

+0

我编辑了我的原始文章。你可能在黑暗中射击,但你是对的:-)。我希望我的编辑能够明确解决方案的工作方式。 – user748261 2012-04-19 09:01:15