最近有项目使用了Oracle g11进行操作,项目一开始部署运行正常,但是跑了几天就挂了,查看了原因是Oracle的监听服务没有启动。于是用工具连接了以下数据库,发现链接报错。错误具体如下:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务。
于是根据了网上大多数人的方法,查看了自己的监听文件:
文件内容如下:
#listener.oraNetworkConfigurationFile: D:\app\Administrator\product\11.1.0\db_1\network\admin\listener.ora # Generated by Oracle configuration tools.
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME =D:\app\Administrator\product\11.1.0\db_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.1.0\db_1\bin\oraclr11.dll") ) )
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = LLL)) (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) )
|
修改以后文件如下
# listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\network\admin\listener.ora # Generated by Oracle configuration tools.
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME =D:\app\Administrator\product\11.1.0\db_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.1.0\db_1\bin\oraclr11.dll") ) (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = D:\app\Administrator\product\11.1.0\db_1) (SID_NAME = ORCL) ) )
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) )
|
修改以后,重启以下监听器就可以了。
一波未平,一波又起。隔天又有同事遇到相同问题,本以为按照同样的方法进行解决应该就可以。可是却修改了多次配置文件,却依旧不行。后来询问以下,才知道这货自己进行了环境变量的配置,所有导致我修改错了配置文件文件。。。
该环境变量就是:TNS_ADMIN
具体作用如下:很多oracle产品都有自己的TNS文件,如果你的系统里装了多个Oracle的产品的话,那么客户端连instance的时候,到底是使用那个tnsnames.ora呢?这个时候就需要看TNS_ADMIN这个参数了。——也就是所,如果你不配置这个参数的话,系统自动读取的是你安装目录下的listener.ora文件,就如我第一次遇到的配置文件是再这个路劲:D:\app\Administrator\product\11.1.0\db_1\network\admin\listener.ora
但是如果你一旦配置了这个参数的话,系统就会根据你这个配置的路径去读取该路径下的配置文件了,所以就导致我原来修改的那个文件就算我怎么修改也不起作用
下面补充以下这个文件的相关知识点:
- 什么是数据库的SID
SID
是一个数据库的唯一标识符!是建立一个数据库时系统自动赋予的一个初始ID,
SID主要用于在一些DBA操作以及与操作系统交互,从操作系统的角度访问实例名,必 须通过ORACLE_SID,且它在注册表中也是存在的.
2.listener.ora------listener监听器进程的配置文件,对于listener进程其作用是接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接
LISTENER :监听名称,可以配置多个监听,多个监听的端口号要区分开来。
GLOBAL_DBNAME :全局数据库名。通过select * from global_name; 查询得出
ORACLE_HOME :oracle软件的跟目录
SID_NAME :服务器端(本机)的SID
PROTOCOL:监听协议,一般都使用TCP
HOST:本机IP地址,双机时候使用浮动IP
PORT:监听的端口号,使用netstat –an 检查该端口不被占用。
3.
Oracle Database Extensions for .NET uses CLRExtProc as the SID |
即Oracle 的.net扩展使用CLRExtProc作为SID, Program=extproc 说明是 外部调用 例程 |
这个SID的监听使用了IPC。
4.对于配置文件,SID_LIST_LISTENER中的SID和LISTENER中的ADDRESS均一一搭配 。