【问题标题】:Cannot access table in oracle after creating dblink创建dblink后无法访问oracle中的表
【发布时间】:2020-01-30 15:44:03
【问题描述】:

我正在尝试在 oracle 中创建一个 dblink,但它显示错误。

我有一个数据库 orcl1,我想连接到另一个数据库 etlsr,它是我创建的下一个数据库。

在这个 etlsr 数据库中,我在 sys 中创建了一个简单的表名 person 并插入了一个数据。

现在,我再次连接到 orcl1 并想连接到 etlsr 数据库,但在我尝试时没有发生

select * from person@ETLSR;

但它给我带来了错误:

                  *
Error at line 1
ORA-02019: connection description for remote database not found

所以,我想创建一个 db 链接,所以我尝试了:(我从 orcl1 尝试了这些)

CREATE DATABASE LINK sales 
    CONNECT TO sys IDENTIFIED BY ashwin
    USING 'SALES';

我在 tnsname 文件中添加为:

SALES =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = SALES_PRD)
    )
  ) 

所以,当我尝试时:

 select * from person@SALES;

我收到错误:

ORA-12154: TNS:could not resolve the connect identifier specified

为什么会出现这个错误?这个 dblink 创建有什么解决方案吗?不使用 dblinks 也可以访问其他数据库的表吗?

Tnsnames.ora

# tnsnames.ora Network Configuration File: E:\oracle\app\AshwinPC\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

TEST=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.6)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

sqlnet.ora

# sqlnet.ora Network Configuration File: E:\oracle\app\AshwinPC\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.

# This file is actually generated by netca. But if customers choose to 
# install "Software Only", this file wont exist and without the native 
# authentication, they will not be able to connect to the database on NT.

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

【问题讨论】:

  • 是您显示的 tnsnames,它是否位于托管“orcl1”的数据库服务器上?请记住,使用 db 链接时,使用该链接的数据库充当另一个数据库的客户端,因此与客户端相关的配置(如 sqnet.ora 和 tnsnames.ora)必须在该计算机上,而不是您的工作站上。跨度>
  • 我在同一台 PC 上使用这两个数据库。是不是可以在同一台电脑上创建fblink?
  • 是的,在同一台机器上拥有多个数据库,它们之间有数据库链接是完全可能的。我只是想确保您了解在 tnsnames 中进行查找的“客户端”实际上是 orcl1 数据库本身,因此您需要在定位 tnsnames 时考虑到这一点。向我们展示 sqlnet.ora 的内容,以及参数 'db_domain' 的值。这些会影响在 tnsnames.ora 中查找内容的方式。
  • 好的,我已经添加了 tnsnames.ora 和 slqnet.ora
  • @Randomguy - 您包含的tnsnames.ora 没有SALES 的条目?您单独显示的条目似乎也有错误的服务名称(不是etlsr),但如果这是唯一的问题,那将给出不同的错误。

标签: database oracle oracle11g dblink


【解决方案1】:

假设您在同一台计算机上有多个数据库(可能还有其他一些 Oracle 软件),请注意它们中的大多数都有自己的 TNSNAMES.ORA 文件。如果你不注意你在做什么,你可能实际上使用了 wrong 文件。为了使一切正常,您必须维护所有这些 TNSNAMES.ORA 文件,这是一项乏味的工作。

因此,创建一个 TNS_ADMIN 环境变量,它将指向某个目录(甚至不必是 \oracle\ 目录的一部分,但是,例如 c:\my_ora_lib)。将TNSNAMES.ORA 文件的一份副本放在那里,并确保它包含对您使用的所有数据库的引用。

这样做,您将使每个 Oracle 软件产品都使用这个 TNSNAMES.ORA 文件。


“正确”创建数据库链接并没有多大意义。您可以对任何不存在的数据库执行此操作,但您将无法使用它:

SQL> create database link dbl_wrong
  2  connect to asfasdfj
  3  identified by asldfkj234l
  4  using 'laskjfoiwe';

Database link created.

SQL> select * from dual@dbl_wrong
  2  /
select * from dual@dbl_wrong
                   *
ERROR at line 1:
ORA-12154: TNS:could not resolve the connect identifier specified


SQL>

因此,请确保您使用了真实存在的用户名、密码和数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多