在使用oracle时,经常会遇到ora-12154问题,但一直没总结,解决办法过段时间就忘,再遇到问题只能再去找解决办法。今天,把目前了解到的内容汇总记录,方便以后查找。
一、监听器介绍
1、概念监听器直接面向用户,也就是客户端程序。监听器启动时,负责打开监听端口,等待客户端连接。当有客户端连接时,在专用服务器连接模式下,创建专用服务器进程,用来处理和响应用户请求;而在共享服务器连接模式下,将监听到的用户请求转发调度器,再由调试器调度共享服务器进程处理。以前一直以为oracle服务器中一个实例对应一个监听器,最近才刚知道oracle服务器可以创建多个数据库实例,这多个实例可以使用同一个监听器。这样一来,数据库实例进程只负责维护管理数据库,并不参与和客户端的通信。
2、listener.ora文件
监听器在服务器中对应的配置文件叫listener.ora,在...\dbhome\network\admin\目录下,格式如下。SID_LIST_LISTENER表示名为LISTENER的监听器内注册的实例列表,里面包含所注册的实例信息,全局名称和sid名称;LISTENER表示监听器,里面包含该监听器所支持的协议及地址。监听器创建可以直接修改listener.ora文件,也可以通过oracle自带的配置工具创建。给监听器注册实例可以通过修改该文件静态注册,也可以动态注册(可查看相关资料)。
SID_LIST_LISTENER = #监听器LISTENER服务的实例列表
(SID_LIST =
(SID_DESC = #实例1
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\root\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\root\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC = #实例2
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = C:\app\root\product\11.2.0\dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER = #监听器LISTENER
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST = # 监听器协议及地址
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
)
)
SID_LIST_LISTENER2 = #监听器LISTENER2服务的实例列表
(SID_LIST =
(SID_DESC = #实例1
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\root\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\root\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC = #实例2
(GLOBAL_DBNAME = orcl2)
(ORACLE_HOME = C:\app\root\product\11.2.0\dbhome_1)
(SID_NAME = orcl2)
)
)
LISTENER2 = #监听器LISTENER2
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST = # 监听器协议及地址
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1522))
)
)
)
3、监听器常用命令
在命令行中输入lsnrctl命令,进入lsnrctl命令行,输入help可以查看支持的命令。常用的包括status,start <xxx>和stop <xxx>等。其中,status可以查看当前服务器中监听器的状态,start可以启动特定监听器,stop可以关闭特定监听器,不加参数指启动或关闭所有监听器。
二、问题原因
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100 )(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)