连接到同一台计算机上通过同一端口侦听的数据库时出现 ORA-12505 错误

ORA-12505 error when connecting to databases on the same machine that listen through the same port

我有一个数据库,它在同一台名为 DB1 和 DB2 的机器上有副本。

我正在尝试通过 SQL Developer 连接到这两个数据库。我的 windows.

上没有安装 Oracle 客户端

tnsnames.ORA 看起来像这样:

DB1 =
 (DESCRIPTION = 
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = myserver.com)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = DB1)
 )
)

DB2 =
 (DESCRIPTION = 
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = myserver.com)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = DB2)
 )
)

listener.ora 如下所示:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtPROC)
      (ORACLE_HOME = /product/11.2.0.4/)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
      (ADDRESS = (PROTOCOL = TCP)(HOST = myserver.com)(PORT = 1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = DB1)
      (SID_NAME = DB1)
      (ORACLE_HOME = /product/11.2.0.4/)
      (PRESPAWN_MAX = 50)
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = DB2)
      (SID_NAME = DB2)
      (ORACLE_HOME = /product/11.2.0.4/)
      (PRESPAWN_MAX = 50)
    )
  )

我可以连接到 DB2 但不能连接到 DB1。当我从 SQL Developer 连接到 DB1 时,出现 ORA-12505 错误。

当我 运行 $ ps -ef | grep pmon 时,我得到 2 个进程 - ora_DB1 和 ora_DB2

当我 运行 $ ps -ef | grep tns 时,我得到 1 个进程 - LISTENER

当我 运行 $ lsnrctl status LISTENER 时,我得到输出

服务摘要

服务 "DB2" 有 1 个实例。 实例 "DB2",状态未知,此服务有 1 个处理程序...

为什么我无法连接到 "DB1"?

为 DB2 创建另一个侦听器并在 listener.ora 文件中将端口更改为 1522 然后您就可以连接了。您的 SID_LIST_LISTENER 名称也相同。您有 2 个 SID_LIST_LISTENER,它们寻找 DB1 和 DB2,但它们的名称相同。更改他们的名字,例如 SID_LIST_LISTENER1 和 SID_LIST_LISTENER2.

别忘了重启监听器

(可选)您不需要添加另一个 SID_LIST_LISTENER。如果你愿意,你可以在默认 SID_LIST_LISTENER 中添加一个 SID_DESC ;

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = DB1)
      (SID_NAME = DB1)
      (ORACLE_HOME = /product/11.2.0.4/)
      (PRESPAWN_MAX = 50)
    )
     (SID_DESC =
      (GLOBAL_DBNAME = DB2)
      (SID_NAME = DB2)
      (ORACLE_HOME = /product/11.2.0.4/)
      (PRESPAWN_MAX = 50)
    )
  )

感谢大家的帮助!

跟动态注册有关系。它在 listener.ora 文件的第一行被设置为 OFF。注释掉之后就好了。端口保持不变,无需通过其他端口监听。

此外,显然当我 运行 $ lsnrctl status LISTENER 时,我得到了状态 UKNOWN 的输出,因为动态注册已关闭。

Service "DB2" has 1 instance(s). Instance "DB2", status UNKNOWN, has 1 handler(s) for this service...

所以,同一台机器上的2个数据库可以配置为通过同一个端口监听。