Oracle监听器是驻留在Oracle实例所在服务器上的独立进程。作为客户端进程连接实例的重要沟通组件,Oracle监听器扮演着重要的地位。本篇将从监听器日志入手,分析阅读监听器日志和日常监听器常见行为。 1、Oracle监听器功能 在笔者《说说Oracle监听器》(http://space.itpub.net/17203031/viewspace-682627)系列中,已经比较清楚的介绍过Oracle监听器的工作方式和体系地位。这里简要加以累述。 ü Oracle监听器是一个独立的操作系统进程,运行在操作系统进程列表中。拥有独立于数据库实例的启动、终止命令控制台(lsnrctl); ü Oracle监听器进程伺候在服务器一个特定端口上(默认为1521),等待通过Oracle Net Service连入到服务器的客户端请求; ü 另一方面,Oracle监听器根据系统设置情况(各种环境变量)接受数据库实例的服务列表。服务Service是对外提供的服务名称,供本地命名服务依据Service名称连入到其中。Service是对应数据库SID,也就是指定的Oracle实例数据库位置。建立和维护服务列表的过程叫做注册register; ü 注册register过程分为两种,静态注册和动态注册。静态注册就是通过直接将服务名写死在listener.ora文件中。动态注册是通过pmon后台进程周期性的到监听器来注册; ü 当一个client请求通过TCP协议访问到特定端口的监听程序,Oracle监听器会对比请求中的Service名称和掌握的注册Service列表。如果不匹配,就拒绝。如果匹配,就定位到了特定的实例,包括Oracle_home地址; ü 监听程序不负责进行用户名密码的验证,此时会向Oracle实例请求一个Server Process与client Process进行你个交互; 2、Oracle监听器状态信息 在大部分平台下,我们可以通过lsnrctl监听器控制程序与监听器进行交互和控制操作。其中,使用status命令,可以获取到当前监听器状态信息。 C:\Documents and Settings\Administrator>lsnrctl status LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 29-6月 -2011 13:41:27 Copyright (c) 1991, 2005, Oracle. All rights reserved. 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=acca-119hs63yxc)(PORT=1521) )) LISTENER 的 STATUS ------------------------ 别名 LISTENER 版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ ction 启动日期 29-6月 -2011 10:51:26 正常运行时间 0 天 2 小时 50 分 3 秒 跟踪级别 off 安全性 ON: Local OS Authentication SNMP OFF 监听程序参数文件 C:\tool\oracle\oracle\product\10.2.0\db_1\network\admi n\listener.ora 监听程序日志文件 C:\tool\oracle\oracle\product\10.2.0\db_1\network\log\listener.log 监听端点概要... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=acca-119hs63yxc)(PORT=1521))) 服务摘要.. 服务 "OTSXDB" 包含 1 个例程。 例程 "ots", 状态 READY, 包含此服务的 1 个处理程序... 服务 "OTS_XPT" 包含 1 个例程。 例程 "ots", 状态 READY, 包含此服务的 1 个处理程序... 服务 "ots" 包含 1 个例程。 例程 "ots", 状态 READY, 包含此服务的 1 个处理程序... 命令执行成功 命令status可以查看当前监听器的所有信息。当前监听器对应的服务包括三个,分别为otsxdb、otx_xpt和ots。三个服务名是对外使用的,本质上对应的Oracle实例都是ots。 监听器进程工作都有对应的日志信息,在状态显示中,我们也可以看到日志文件位置(C:\tool\oracle\oracle\product\10.2.0\db_1\network\log\listener.log)。下面我们从一个新的日志文件,看监听器工作。 3、Oracle监听器日志解析 下面是我们截取的监听器片段,篇幅原因,有省略。 以 pid=2736 开始 监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=acca-119hs63yxc)(PORT=1521))) Listener completed notification to CRS on start TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT [* SID] * RETURN CODE 29-6月 -2011 10:51:27 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=Administrator))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0 29-6月 -2011 10:51:39 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=Administrator))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0 29-6月 -2011 10:52:00 * (CONNECT_DATA=(SID=OTS)(CID=(PROGRAM=C:\tool\oracle\oracle\product\10.2.0\db_1\perl\5.8.3\bin\MSWin32-x86-multi-thread\perl.exe)(HOST=ACCA-119HS63YXC)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.93)(PORT=3126)) * establish * OTS * 12505 TNS-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID 29-6月 -2011 10:52:00 * service_register * ots * 0 29-6月 -2011 10:52:11 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=Administrator))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0 29-6月 -2011 10:52:48 * service_update * ots * 0 29-6月 -2011 10:53:00 * service_update * ots * 0 (有省略。。。) 29-6月 -2011 10:53:17 * ping * 0 29-6月 -2011 10:53:18 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=SYSTEM))(COMMAND=status)(ARGUMENTS=64)(SERVICE=(ADDRESS=(PROTOCOL=TCP)(HOST=acca-119hs63yxc)(PORT=1521)))(VERSION=169869568)) * status * 0 29-6月 -2011 10:53:29 * (CONNECT_DATA=(SID=OTS)(CID=(PROGRAM=C:\tool\oracle\oracle\product\10.2.0\db_1\perl\5.8.3\bin\MSWin32-x86-multi-thread\perl.exe)(HOST=ACCA-119HS63YXC)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.93)(PORT=3141)) * establish * OTS * 0 29-6月 -2011 10:53:57 * (CONNECT_DATA=(SERVICE_NAME=ots)(CID=(PROGRAM=D:\PLSQL Developer\plsqldev.exe)(HOST=LIUZIYU-PC)(USER=Liuziyu))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.40)(PORT=1760)) * establish * ots * 0 29-6月 -2011 10:54:00 * (CONNECT_DATA=(SERVICE_NAME=ots)(CID=(PROGRAM=D:\PLSQL Developer\plsqldev.exe)(HOST=LIUZIYU-PC)(USER=Liuziyu))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.40)(PORT=1761)) * establish * ots * 0 29-6月 -2011 10:54:00 * (CONNECT_DATA=(SERVICE_NAME=ots)(CID=(PROGRAM=D:\PLSQL Developer\plsqldev.exe)(HOST=LIUZIYU-PC)(USER=Liuziyu))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.40)(PORT=1762)) * establish * ots * 0 29-6月 -2011 10:54:03 * service_update * ots * 0 29-6月 -2011 10:54:09 * service_update * ots * 0 日志内容很多,我们分为重点的几个部分。 在日志头,Oracle告知了我们日志格式,使用*进行内容分割。 TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT [* SID] * RETURN CODE 其中包括连接时间时间,请求数据Data和其他相关事件信息。这些可以帮助我们分析日志内容。 ü 监听器无法找到指定服务 对应片段: 29-6月 -2011 10:52:00 * (CONNECT_DATA=(SID=OTS)(CID=(PROGRAM=C:\tool\oracle\oracle\product\10.2.0\db_1\perl\5.8.3\bin\MSWin32-x86-multi-thread\perl.exe)(HOST=ACCA-119HS63YXC)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.93)(PORT=3126)) * establish * OTS * 12505 TNS-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID 分析日志格式后,可以发现在这个时间(10:52),Oracle监听器接受到程序的访问,程序来自主机(ACCA-119HS63YXC),使用system用户登录,程序名称是perl.exe。由于当前系统没有注册Service信息,也没有注册SID信息,所以不能够连接识别对SID=OTS请求。 报错无法识别SID。 ü 实例主动进行动态注册 此时,数据库服务器先于监听程序启动,默认要等待很长的时间才会发生动态注册。我们使用alter system register;命令手动启动动态注册过程。监听程序上发现pmon进程的注册进程,并且记录在日志中。 29-6月 -2011 10:52:00 * service_register * ots * 0 将数据库sid=ots对应的三个实例进行注册。 ü 用户Client连接进程 当出现连接请求的时候,日志记录。 29-6月 -2011 10:55:19 * (CONNECT_DATA=(SERVICE_NAME=ots)(CID=(PROGRAM=D:\PLSQL Developer\plsqldev.exe)(HOST=LIUZIYU-PC)(USER=Liuziyu))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.1.39.40)(PORT=1782)) * establish * ots * 0 根据日志格式,可以理解为从远程(HOST=LIUZIYU-PC,IP=10.1.39.40)主机通过TCP协议访问到监听程序,要求连接到ots服务上。使用的程序是pl/sql developer。 ü 周期性pmon注册 动态注册是一种经常性的注册行为,pmon每隔几分钟的时间就会向监听器进行一次注册动作。 29-6月 -2011 10:55:33 * service_update * ots * 0 4、结论 监听器是我们经常打交道的数据库组件之一。同数据库的alert_log一样,监听器日志能够帮助我们解决很多日常故障问题。 (责任编辑:IT) |