我有一个数据库,它在同一台名为DB1和DB2的机器中复制。
我正在尝试通过SQL Developer连接到这两个数据库。我的窗口上没有安装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
时,我得到两个进程-ora_DB1和ora_DB2
当我运行$ps -ef | grep tns
时,我得到1个进程-LISTENER
当我运行$lsnrctl status LISTENER
时,我得到输出
服务摘要
服务"DB2"有1个实例。实例"DB2",状态为UNKNOWN,有1个用于此服务的处理程序。。。
为什么我无法连接到"DB1"?
为DB2创建另一个侦听器,并在listener.ora文件中用1522更改端口,然后就可以连接了。此外,您的SID_LIST_LISTNER名称也是相同的。您有2个SID_LIST_LISTENER,它们查找DB1和DB2,但名称相同。更改它们的名称,如SID_LIST_LISTENER1和SID_LIST-LISTENER2。
不要忘记重新启动侦听器
(可选(您不需要添加另一个SID_LIST_LISTNER。如果你愿意,你可以像那样在默认的SID_LIST_LISTNER中添加一个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状态LISTENER时,由于动态注册被关闭,我得到了状态为UKNOWN的输出
Service "DB2" has 1 instance(s). Instance "DB2", status UNKNOWN, has 1 handler(s) for this service...
因此,同一台机器上的2个数据库可以配置为通过同一端口侦听。