我们公司有一个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'
我的 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'
答案 0 :(得分:6)
您已说SID
为abc
,但在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身份连接。