ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
错误描述:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务。
也就是oracle实例进程和监听器进程没有关联起来。
oracle 10.1.0.2.0 安装后D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\listener.ora有如下内容:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.1.0\Db_1)
(PROGRAM = extproc)
)
)
SID_LIST_LISTENER中没有指定那个实例的信息,那就需要先启动监听器,然后启动实例进程,然后由实例进程自己把自己注册到监听器进程里去。
如果启动的时候先启动了实例进程,后启动的监听器进程,就是出现上述错误。
如果想先启动实例进程,然后启动监听器进程,那就需要给监听器指定实例信息,如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.1.0\Db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = erp)
(ORACLE_HOME = D:\oracle\product\10.1.0\Db_1)
(SID_NAME = erp)
)
)
试验一下发现,如果按照上述配置给监听器指明了实例信息后,即使先启动监听器进程,后启动实例进程,也可以连接上数据库。
这说明按照上述配置给监听器指明实例信息后,无论监听器和实例进程的启动顺序如何,监听器和实例进程都是关联上的,很明显,
因为已经给监听器指明实例信息了。
所以结论是:
如果没有给监听器指明实例信息,就需要先启动监听器,然后启动实例进程。
如果给监听器指明了实例信息,则启动顺序就无所谓了。
如果有个数据库的话,再添加相应的实例信息描述就行了,如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.1.0\Db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = erp)
(ORACLE_HOME = D:\oracle\product\10.1.0\Db_1)
(SID_NAME = erp)
)
(SID_DESC =
(GLOBAL_DBNAME = ceepwgh)
(ORACLE_HOME = D:\oracle\product\10.1.0\Db_1)
(SID_NAME = pwghsid)
)
)