来源: Transcendent
文章作者: Gavin Wang
文章链接: Oracle案例之监听 | Transcendent
本文章著作权归作者所有,任何形式的转载都请注明出处。
概述
listener,主要用来监听客户端向数据库服务器端提出的连接请求,是基于服务器端的服务,那么它也只存在于数据库服务器端,进行监听器的设置也是在数据库服务器端完成的。
要排除客户端与服务器端的连接问题,首先检查客户端配置是否正确(客户端配置必须与数据库服务器端监听配置一致),再根据错误提示解决。本文主要介绍在使用oracle过程中,碰到的一些监听故障/问题的记录/汇总。
ORA-12541: TNS: 没有监听器
显而易见,服务器端的监听器没有启动,另外检查客户端IP地址或端口填写是否正确。启动监听器:
shell
$ lsnrctl start
ORA-12500: TNS: 监听程序无法启动专用服务器进程
没有启动Oracle实例服务。启动实例服务。
ORA-12535: TNS: 操作超时
shell
TNS-12154 (ORA-12154):TNS:could not resolve service name
检查输入的服务名与配置的服务名是否一致。另外注意生成的本地服务名文件(Linux/Unix下$ORACLE_HOME/network/admin/tnsnames.ora)里每项服务的首行服务名称前不能有空格。
ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME
检查tnsnames.ora里的服务名输入是否正确。该服务名必须与服务器端监听器配置的全局数据库名一致。
ORA-12514:TNS::监听程序当前无法识别连接描述符中请求的服务
现象:
(1)在服务端和客户端使用sqlplus user/password@SID均无法连接
(2)在服务端使用sqlplus user/password@SID可以建立连接,客户端使用使用sqlplus user/password@SID无法建立连接。
解决:
(方法1)检查listener.ora以及tnsnames.ora文件。主要是检查文件中的HOST是否为
当前主机名(hostname),如果不是,修改成当前主机名(hostname)或IP地址;
(方法2)在listener.ora文件中添加SID_LIST_LISTENER信息。
创建监听错误
这个问题的解决方法如下:
在ORACLE_HOME/network/admin/listener.ora文件中增加"SID_LIST_LISTENER = "这部分内容。
shell
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST=10.164.75.167)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_DESC =
(GLOBAL_DBNAME = ora11g) //ora11g是数据库实例名
(ORACLE_HOME = /opt/oracle/app/product/11.1.0/db_1) //oracle家目录
(SID_NAME = ora11g)
)
)
注:
Oracle System Identifier (SID)
shell
A name that identifies a specific instance of a running pre-release 8.1 Oracle
database. For any database, there is at least one instance referencing the database.
For pre-release 8.1 databases, SID is used to identify the database. The SID is
included in the connect descriptor of a tnsnames.ora file and in the definition of the
listener in the listener.ora file.
如果SID值不作人为的修改,该值默认为PLSExtProc,且完全可以正常运行(目前141 上的数据库该值就是PLSExtProc)。因此我觉得可能是如果不指定SID值的话,oracle会自动地去搜索运行的实例,然后找出一个匹配的,但是如果直接指定SID,则省去了搜索的步骤,也就加快了连接速度。不过这种猜想目前尚未得到证实,如果大家对这方面了解的话,希望不吝赐教。
启动监听时出错 – 12514
正确创建监听后,启动监听时监听启动异常,报12514错误。
shell
oerr ora 12514
12514, 00000, "TNS:listener does not currently know of service requested in connect descriptor"
// *Cause: The listener received a request to establish a connection to a
// database or other service. The connect descriptor received by