天天看点

Oracle 11g监听的故障排查Generated by Oracle configuration tools.

虚机数据库服务器oracle11G的监听意外中止,报错如下

Oracle 11g监听的故障排查Generated by Oracle configuration tools.

在虚机上执行lsnrctl start,问题解决。

1、当连接异常时,可以通过分析监听日志来查找线索

〜[test]$ find $ORACLE_HOME -name listener.log

/opt/64bit/oracle/11.2.0/log/diag/tnslsnr/sinrndvud062/listener/trace/listener .log

〜[DBCHC] $ vim /opt/64bit/oracle/11.2.0/log/diag/tnslsnr/sinrndvud062/listener/trace/listener.log

110856 Fri Oct 21 17:00:31 2018

110857 21-OCT-2018 17:00:31 (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = DBCHC)(CID =(PROGRAM = sqlplus)(HOST = sinrndvud062)(USER = ora112)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160.164.131)(PORT = 47405)) 建立 DBCHC 12514

110858 TNS-12514:TNS:监听器当前不知道连接中请求的服务描述符

110859 Fri Oct 21 17:02:47 2018

110860 21-OCT-2018 17:02:47 service_update OSMSRDB 0

110861 21-OCT-2018 17:02:53 service_update OSMSRDB 0

110862 21-OCT- 2018 17:02:54 (CONNECT_DATA =(SID = OSMSRDB)(CID =(PROGRAM = JDBC瘦客户端)(HOST = jdbc )(USER = linqus)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160) .164.132)(PORT = 32823))建立 OSMSRDB 0

110863 21-OCT-2018 17:02:56 service_update OSMSRDB 0

110864 Fri Oct 21 17:03:07 2018

110865 21-OCT-2018 17:03:07 service_update XSONGDB 0

110866 21-OCT-2018 17:03:08 (CONNECT_DATA =(SID = OSMSRDB)(CID =(PROGRAM = JDBC瘦客户端)(HOST = jdbc )(USER = linqus)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160。 164.132)(PORT = 32835))建立 OSMSRDB 0

110867 21-OCT-2018 17:03:08 service_update OSMSRDB 0

110868 Fri Oct 21 17:06:19 2018

110869 21-OCT-2018 17:06 :19 service_update XSONGDB 0

110870 21-OCT-2018 17:06:21 (CONNECT_DATA =(SID = XSONGDB)(CID =(PROGRAM = JDBC瘦客户端)(HOST = jdbc )(USER = linqus))) (ADDRESS =(PROTOCOL = tcp)(HOST = 10.160.164.200)(PORT = 60498))建立 XSONGDB 0

110871 21-OCT-2018 17:06:22 service_update XSONGDB 0

110872 21-OCT-2018 17:06:24 (CONNECT_DATA =(SID = XSONGDB)(CID =(PROGRAM = JDBC瘦客户端)(HOST = jdbc )(USER = linqus)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160.164.200)(PORT = 60502))建立 XSONGDB 0

110873 21-OCT-2018 17:06:25 service_update XSONGDB * 0

在RAC环境中,需要切换到网格用户来查询监听日志

test #su - grid

/ home / ora11grid [FRWK]:找到$ find ORACLE_HOME -name listener.log

查找:<code>/ opt / ora11grid / crf / admin / run / crflogd':权限被拒绝&lt;br/&gt;查找:</code>/ opt / ora11grid / crf / admin / run / crfmond':权限被拒绝

/opt/ora11grid/log/diag/tnslsnr/vgerndpud852/listener/trace/listener.log

/ home / ora11grid [ FRWK]:lsnrctl

LSNRCTL for Linux:版本11.2.0.3.0 - 生产于17-NOV-2018 04:28:53

版权所有(c)1991,2011 ,Oracle。版权所有。

欢迎来到LSNRCTL,输入“帮助”获取信息。

LSNRCTL&gt; show

show

asterisk(*)表示修饰符或扩展命令后可以使用以下操作:

rawmode displaymode

rules trc_file

trc_directory trc_level

log_file log_directory

log_status current_listener

inbound_connect_timeout startup_waittime

snmp_visible save_config_on_stop

dynamic_registration enable_global_dynamic_endpoint

oracle_home pid

connection_rate_limit

LSNRCTL&gt; show log_status

连接到(DESCRIPTION =(ADDRESS =(PROTOCOL = IPC)(KEY = LISTENER)))

LISTENER参数“log_status”设置为ON

命令已成功完成。

2、监听异常中止解决方案

可以将以下参数添加到listener.ora中

SUBSCRIBE_FOR_NODE_DOWNEVENT= OFF

如下:

SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER = OFF

编辑监听监控脚本,当监听异常中止后自动启动监听(每分钟侦测一次)

脚本如下:

$ cat listener.sh

#!/bin/bash

ORACLE_HOME = / u01 / product / oracle / 11.2.0 / db_1; export ORACLE_HOME

pid =<code>ps -ef | grep tnslsnr | grep -v grep | awk'{print $ 2}'</code>

if [<code>echo $ pid | awk -v bi = 1'{print($ 1&amp;gt; bi)?“1”:“0”}'</code>-eq“1”]

else

echo“监听器运行正常”

echo“监听器已经停止”

$ ORACLE_HOME / bin / lsnrctl start

exit

$ crontab -l

/ 1 sh /data/run/listener.sh 1 &gt;&gt; / data / run / log / listener.log 2 &gt;&gt; / data / run / log / listener.bad

3、监听日志的定期清理

要对监听日志文件(listener.log)进行定期清理,如果不定期清理,会遇到下面一些麻烦:

1)监听日志文件(listener.log)变得越来越大,占用额外的存储空间。(当然现在存储白菜价,不差那几G的空间。但是我们还是要本着工匠情怀,精益求精)

2)监听日志文件(listener.log)变得太大会带来一些问题:LISTENER.LOG日志大小不能超过2GB,超过会导致LISTENER监听器无法处理新的连接。

3)监听日志文件(listener.log)变得太大,给写入、查看带来的一些性能问题、麻烦。

另:监听日志listener.log日志放在了$ORACLE_BASE/diag/tnslsnr/机器名/listener/trace目录下

4、三种文件的解析

1) sqlnet.ora-----通过这个文件来决定怎么样找一个连接中出现的连接字符串。

例如我们客户端输入

sqlplus sys/oracle@ora

假如我的sqlnet.ora是下面这个样子

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME,EZCONNECT)

那么,客户端就会首先在tnsnames.ora文件中找ora的记录.如果没有相应的记录则尝试把ora当作一个主机名,通过网络的途径去解析它的 ip地址然后去连接这个ip上GLOBAL_DBNAME=ora这个实例,当然我这里ora并不是一个主机名

EZCONNECT表示:可以使用简单的方式连接Oracle例如:

1 CONNECT username/password@host[:port][/service_name][/instance_name]

2 CONNECT username/password@host[:port][/service_name]

3 sqlplus / as sysdba

4 sqlplus sys as sysdba/[email protected]:1521

如果我是这个样子

NAMES.DIRECTORY_PATH= (TNSNAMES)

那么客户端就只会从tnsnames.ora查找ora的记录,括号中还有其他选项,如LDAP等并不常用。

2) tnsnames.ora------这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应。

只有当sqlnet.ora中类似NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。

例子:

ORA_TEST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = LXL)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = ora)

ORA_TEST:客户端连接服务器端使用的服务别名。注意一定要顶行书写,否则会无法识别服务别名。

PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。

HOST:ORACLE服务器端IP地址或者hostname。确保服务器端的监听启动正常。

PORT:数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。

SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus&gt; show parameter service_name命令查看。

3) listener.ora------listener监听器进程的配置文件

关于listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。

#listener.ora Network Configuration File: #E:/oracle/product/10.1.0/Db_2/NETWORK/ADMIN/listener.ora

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = ora)

(ORACLE_HOME = E:/oracle/product/10.1.0/Db_2)

(SID_NAME = ora)

LISTENER =

(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))

LISTENER :监听名称,可以配置多个监听,多个监听的端口号要区分开来。

GLOBAL_DBNAME :全局数据库名。通过select * from global_name; 查询得出

ORACLE_HOME :oracle软件的跟目录

SID_NAME :服务器端(本机)的SID

PROTOCOL:监听协议,一般都使用TCP

HOST:本机IP地址,双机时候使用浮动IP (用IP地址较好解析)

PORT:监听的端口号,使用netstat –an 检查该端口不被占用。

当你输入sqlplus sys/oracle@orcl的时候

1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME

2. 则查询tnsnames.ora文件,从里边找orcl的记录,并且找到主机名,端口和service_name

3. 如果listener进程没有问题的话,建立与listener进程的连接。

4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。

5. 这时候网络连接已经建立,listener进程的历史使命也就完成了。

继续阅读