gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:06:17 24 4
gpt4 key购买 nike

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

我们无法访问运行 CRM 系统的服务器。但是,尽管如此,我们仍然可以使用工作的 DBA 登录数据(SYS 用户)。它包括:

  • 服务器IP:172.1.2.3
  • 端口:1521
  • SID:abc
  • 用户:系统
  • 密码:*

我们可以使用它通过 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 数据库之间建立连接吗?请帮助我设置和创建数据库链接。

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

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'

最佳答案

您说过 SIDabc,但是在您的 tnsnames.ora 中您有 SERVICE_NAME CONNECT_DATA 部分中的。它们并不总是相同的东西 - 参见 this question ,或者这个 Ask Tom entry .你实际上并没有说出你遇到了什么错误,但只是将其更改为 SID = 可能会有所作为。

listener.ora,实际上是监听器,在托管 CRM 数据库的服务器上,而不是在托管“目标”数据库的服务器上。因为您可以从显然已经配置好的 SQL Developer 进行连接。 tnsnames.ora 确实需要是本地的。

但是如果您确实知道 CRM 数据库的 service_name,您可以跳过它并使用 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';

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

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

关于oracle - 无法在 Oracle-DB 中创建到远程数据库的数据库链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com