记一次离奇的TNS-12545 TNS-12560 TNS-00515

      最近reportDB监听无法随系统自启动,现象比较怪异。因为该服务器上的另一个实例的监听可以正常启动,这个不能自启动实例的监听手动启动又是正常的。因此记下这次离奇暂未找到原因的故障。

 

1、故障现象

Starting CRON daemondone
Oracle 10g auto start/stop
Startup "USMTHLY" listener.

LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 08-JUL-2014 17:05:49

Copyright (c) 1991, 2006, Oracle.  All rights reserved.

Starting /users/oracle/OraHome10g/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.3.0 - Production
System parameter file is /users/oracle/OraHome10g/network/admin/listener.ora
Log messages written to /users/oracle/OraHome10g/network/log/listener_usmthly.log
Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.101.1.106)(PORT=1520)))
TNS-12545: Connect failed because target host or object does not exist
 TNS-12560: TNS:protocol adapter error
  TNS-00515: Connect failed because target host or object does not exist
   Linux Error: 99: Cannot assign requested address

#上面的错误信息了来自系统启动日志,同样出现在该实例的监听器日志里。   

#故障环境
oracle@sysreportDB:/users/oracle> cat /etc/issue

Welcome to SUSE Linux Enterprise Server 10 SP4  (x86_64) - Kernel \r (\l).

oracle@sysreportDB:/users/oracle> sqlplus -v

SQL*Plus: Release 10.2.0.3.0 - Production

#服务器启动后,检查数据库实例,2个实例都已成功启动
oracle@sysreportDB:~> ps -ef | grep pmon | grep -v grep
oracle    4916     1  0 Jul08 ?        00:00:00 ora_pmon_USMTHLY
oracle    5605     1  0 Jul08 ?        00:00:00 ora_pmon_USBO2

oracle@sysreportDB:~> ps -ef | grep lsnr| grep -v grep      #仅仅只有usbo2的监听被启动
oracle    5597     1  0 Jul09 ?        00:00:00 /users/oracle/OraHome10g/bin/tnslsnr listener_USBO2 -inherit

2、故障分析

oracle@sysreportDB:~> oerr tns 12545
12545, 00000, "Connect failed because target host or object does not exist"
// *Cause: The address specified is not valid, or the program being 
// connected to does not exist.
// *Action: Ensure the ADDRESS parameters have been entered correctly; the
// most likely incorrect parameter is the node name.  Ensure that the 
// executable for the server exists (perhaps "oracle" is missing.)
// If the protocol is TCP/IP, edit the TNSNAMES.ORA file to change the
// host name to a numeric IP address and try again.
oracle@sysreportDB:~> oerr tns 12560
12560, 00000, "TNS:protocol adapter error"
// *Cause: A generic protocol adapter error occurred.
// *Action: Check addresses used for proper protocol specification. Before
// reporting this error, look at the error stack and check for lower level
// transport errors. For further details, turn on tracing and reexecute the
// operation. Turn off tracing when the operation is complete.
oracle@sysreportDB:~> oerr tns 00515
00515, 00000, "Connect failed because target host or object does not exist"
// *Cause: The address specified is not valid, or the program being 
// connected to does not exist.
// *Action: Ensure the ADDRESS parameters have been entered correctly; the
// most likely incorrect parameter is the node name.  Ensure that the 
// executable for the server exists (perhaps "oracle" is missing.)

#上面的三个错误号描述信息表明该故障与主机名或IP地址有关,需要检查是否为有效的IP或主机名
#下面查看监听器及TNSNAMES的配置
oracle@sysreportDB:/users/oracle/OraHome10g/network/admin> more listener.ora
SID_LIST_LISTENER_USMTHLY =
   (SID_LIST =
    (SID_DESC =
        (sid_name=USMTHLY)
        (oracle_home = /users/oracle/OraHome10g)
    )
  )

LISTENER_USMTHLY =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 10.101.1.106)(PORT = 1520))
      )
    )
  )

SID_LIST_LISTENER_USBO2 =
   (SID_LIST =
    (SID_DESC =
        (sid_name=USBO2)
        (oracle_home = /users/oracle/OraHome10g)
    )
  )

LISTENER_USBO2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 10.101.1.106)(PORT = 1504))
      )
    )
  )

oracle@sysreportDB:/users/oracle/OraHome10g/network/admin> more tnsnames.ora
USMTHLY=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=10.101.1.106)
      (PORT=1520)
    )
    (CONNECT_DATA=
      (SERVICE_NAME=USMTHLY)
    )
  )

USBO2=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=10.101.1.106)
      (PORT=1504)
    )
    (CONNECT_DATA=
      (SERVICE_NAME=USBO2)
    )
  )
#从上面的配置来看,配置无异常。
#下面查看本机host及IP信息,从下面的描述来看,主机host配置无异常
oracle@sysreportDB:~> more /etc/hosts
127.0.0.1       localhost

# special IPv6 addresses
::1             localhost ipv6-localhost ipv6-loopback

fe00::0         ipv6-localnet
ff00::0         ipv6-mcastprefix
ff02::1         ipv6-allnodes
ff02::2         ipv6-allrouters
ff02::3         ipv6-allhosts
10.101.1.106    sysreportDB.2goasp.com sysreportDB  

oracle@sysreportDB:~> hostname
sysreportDB
# Author : Leshami
# Blog   : http://blog.csdn.net/leshami

#下面是其IP信息
oracle@sysreportDB:/var/log> ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:70:82:63
          inet addr:10.101.1.106  Bcast:10.201.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5763651 errors:0 dropped:0 overruns:0 frame:0
          TX packets:802254 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:8102327746 (7726.9 Mb)  TX bytes:88597013 (84.4 Mb)

lo        Link encap:Local Loopback      #有环路能正常TX,RX
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:92972 errors:0 dropped:0 overruns:0 frame:0
          TX packets:92972 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4993723 (4.7 Mb)  TX bytes:4993723 (4.7 Mb)

#尝试手动启动监听,手动启动监听无异常    
oracle@sysreportDB:/var/log> lsnrctl start listener_USMTHLY

LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 08-JUL-2014 17:10:49

Copyright (c) 1991, 2006, Oracle.  All rights reserved.

Starting /users/oracle/OraHome10g/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.3.0 - Production
System parameter file is /users/oracle/OraHome10g/network/admin/listener.ora
Log messages written to /users/oracle/OraHome10g/network/log/listener_usmthly.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sysreportDB.2goasp.com)(PORT=1520)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=sysreportDB.2goasp.com)(PORT=1520)))
STATUS of the LISTENER
------------------------
Alias                     listener_USMTHLY
Version                   TNSLSNR for Linux: Version 10.2.0.3.0 - Production
Start Date                08-JUL-2014 17:10:50
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /users/oracle/OraHome10g/network/admin/listener.ora
Listener Log File         /users/oracle/OraHome10g/network/log/listener_usmthly.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sysreportDB.2goasp.com)(PORT=1520)))
Services Summary...
Service "USMTHLY" has 1 instance(s).
  Instance "USMTHLY", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

#通过上面的测试可以看出,监听器能够正常启动也就是说监听器的配置应该是OK的。

#另外一点发现,系统启动日志里边有127.0.0.2的环路,不知道怎么会有127.0.0.2
Setting up network interfaces:
    lo
    lo        IP address: 127.0.0.1/8
              IP address: 127.0.0.2/8

oracle@sysreportDB:/var/log> ping 127.0.0.2  #环路127.0.0.2 OK
PING 127.0.0.2 (127.0.0.2) 56(84) bytes of data.
64 bytes from 127.0.0.2: icmp_seq=1 ttl=64 time=0.034 ms

3、故障解决

#对于上面的问题实在是百思不得其解,就差使用sqlnet trace。
#下面尝试将监听器配置文件内IP地址使用主机名来代替,竟然成功鸟。
#如下2种方式都可以将监听随系统启动而启动,一个是主机名,一个是full主机名

#LISTENER_USMTHLY =
#  (DESCRIPTION_LIST =
#    (DESCRIPTION =
#      (ADDRESS_LIST =
#        (ADDRESS = (PROTOCOL = TCP)(HOST = sysreportDB)(PORT = 1520))
#      )
#    )
#  )

LISTENER_USMTHLY =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = sysreportDB.2goasp.com)(PORT = 1520))
      )
    )
  )

#高兴之余,查看系统日志,汗,还是有错误,这次的错误是TNS-12543,目标主机不可达。 
#怀疑是否hosts文件中是否存在异常字符,于是尝试重建Hosts文件,重建后错误消息依旧如下。
Starting CRON daemondone
Oracle 10g auto start/stop
Starting Oracle10g: Startup "USMTHLY" listener.

LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 09-JUL-2014 17:15:47

Copyright (c) 1991, 2006, Oracle.  All rights reserved.

Starting /users/oracle/OraHome10g/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.3.0 - Production
System parameter file is /users/oracle/OraHome10g/network/admin/listener.ora
Log messages written to /users/oracle/OraHome10g/network/log/listener_usmthly.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sysreportDB.2goasp.com)(PORT=1520)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=sysreportDB)(PORT=1520)))
TNS-12543: TNS:destination host unreachable
 TNS-12560: TNS:protocol adapter error
  TNS-00513: Destination host unreachable
   Linux Error: 101: Network is unreachable

#最终,此题暂时无解,没有找到原因,不影响自启动而已。


4、小结
a、对于TNS-12545,TNS-00515应首先考虑是否使用了合适的IP,主机名,应检查服务器host文件,网络配置等
b、Step a检查完后应考虑是否正确的配置了监听以及tnsnames
c、对于上述该类错误,应同时检查及分析监听器日志   
d、对于客户端出现TNS-12545,TNS-00515等,考虑客户端能否将主机转换成对应的IP(客户端tnsnames.ora使用主机名的情形时)
e、有关Oracle网络配置相关可以参考:
http://blog.csdn.net/leshami/article/category/828434

TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序 文章转自:http://www.luocs.com/archives/464.html 此文版权归作者 – yaogang所有,转载请注明yaogang©www.luocs.com。 Luocs说:这是我一个朋友的一个监听器问题解决案例,这是昨天发生的事情,我一直跟朋友一起Troubleshooting,折腾了半天最后是BUG所致。再次汗颜,Windows平台惹不起啊!好,那么下面开始分享我朋友的案例! 环境描述: OS : Windows Server 2008 64Bit (做了HA) DB : 11.1.0.7.0 排错过程: 前天应用不能访问数据库了 (后台应用能访问数据库),故障发生。 马上登录到服务器里查看监听状态,发现有TNS-12541 ,TNS-12560等错误 Luocs补充:我跟朋友要了错误代码,但他没有保存,就直接贴图。 从计算器的管理 –> 服务选项 –> 检查oracle 监听服务程序,发现该服务已经停止。 手动把监听服务启动,这时候服务状态上显示为已启动,但在CMD窗口执行lsnrctl status的时候依然返回错误信息: C:\>lsnrctl status LSNRCTL for 64-bit Windows: Version 11.1.0.7.0 - Production on 12-11月-2012 18:1 8:32 Copyright (c) 1991, 2008, Oracle. All rights reserved. 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.203.218)(PORT=1521))) TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序 64-bit Windows Error: 61: Unknown error 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) 过段时间回显非常慢。 然后我检查了下告警日志,大量的ora错误 Fatal NI connect error 12170. VERSION INFORMATION: TNS for 64-bit Windows: Version 11.1.0.7.0 - Production Oracle Bequeath NT Protocol Adapter for 64-bit Windows: Version 11.1.0.7.0 - Production Windows NT TCP/IP NT Protocol Adapter for 64-bit Windows: Version 11.1.0.7.0 - Production Time: 12-11月-2012 15:23:33 Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS: 操作超时 ns secondary err code: 12560 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: ORA-609 : opiodr aborting process unknown ospid (4116_6104) 这时候朋友怀疑是不是监听器配置问题,就把原先的监听器删除重建了下,问题依然。 网上有个解决TNS-12535错误的案例,平台和版本都很类似,如下: 1、在 sqlnet.ora文件中 增加如下行: DIAG_ADR_ENABLED = OFF 2、在listener.ora文件中增加如下行: DIAG_ADR_ENABLED_ = OFF 如何监听是listener时,则前面的名称为:DIAG_ADR_ENABLED_LISTENER = OFF 3、重新启动windows服务管理中的监听程序.先停止,然后再重新启动. 4、检查结果.发现可以了,返回的值在10毫秒.有时为0毫秒.成功!! 但这并不是问题发生原因,在继续排查过程中偶然发现监听日志大小居然为4G。然后把这现象告诉了Luocs。 过了一会儿,Luocs回应是Oracle一个BUG,BUG号为9879101 : THE CONNECT THROUGH LISTENER WAS SLOW WHEN LISTNER LOG GROWED 4GB。 Luocs还提供了MOS上一篇文章,ID 1319797.1 : WINDOWS: Listener Hangs & Lsnrctl Commands Are Slow or Hang,里面给出了解决方法: You can solve this problem by deleting the large listener in $ORACLE_BASE\diag\tnslsnr\\listener\trace\.log 1) Stop the listener process using the command line or Control Panel Service. 2) Delete the log file(s) that are at or approaching the 4G size limit at this location: $ORACLE_BASE\diag\tnslsnr\\listener\trace\.log 3) Issue any lsnrctl command and you will see a new listener.log in its place under: $ORACLE_BASE\diag\tnslsnr\\listener\trace\ Since ADR Diagnostics are enabled for this listener these steps cannot be done dynamically using the lsnrctl utility. e.g. LSNRCTL>set log_file mylog Will yield: TNS-01251: Cannot set trace/log directory under ADR. However, it is possible to disable the flat file listener logging using the following commands: LSNRCTL>set current_listener LSNRCTL>set log_status OFF LSNRCTL>save_config 我就按照以上说明如下进行: 1)LSNRCTL进入交互模式 2)执行set current_listener LISTENER 3)set log_status off 4)stop 停止监听器 5)手工删除ADR指定的监听日志路径下的listener.log文件 6)start重启监听器 7)status查看状态 到此问题解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值