REMOTE_LISTENER引发的血案

server/2024/12/23 16:50:56/

作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师

内容介绍

ORACLE数据库是一个庞大的软件,各个部件协同工作,有时候一个环节出现问题,往往会导致重大的问题,特别是有时候外部环境因素造成的问题,会直接影响数据库的正常运行,比如存储,比如网络,再比如主机。本次案例要分析的就是一次数据库连接异常的问题,而引起数据连接异常的问题,多种多样,不胜枚举,而具体问题具体分析,本能的反应应该是网络造成的连接问题。最终,我们还是通过ORACLE的网络跟踪技术及数据库信息的查看解决了故障。
故障的起因主要由于利用rman异地恢复数据库,remote_listener参数设置问题导致连接异常。

概念普及

sqlnet是oracle提供的与网络层面交互的一个工具,比如如何解析客户端发起的连接,如何对客户端发起的连接进行辨别,如何对客户端连接进行阻隔限制,或者启用日志及跟踪(log and trace)功能等等一系列的功能,sqlnet通过写入文件参数来进行分析并产生作用, sqlnet配置文件的存放位置一般在:$ORACLE_HOME/network/admin目录下,本次处理网络故障我们就是使用了sqlnet的启用日志及跟踪功能。
sqlnet网络连接跟踪具体设置如下:

TRACE_LEVEL_CLIENT=16
TRACE_FILE_CLIENT=CLIENT
TRACE_TIMESTAMP_CLIENT=ON
trace_directory_client=D:\oracle\product\10.2.0\db_1\network\ADMIN

详细解释一下以上参数值: TRACE_LEVEL_CLIENT –开启客户端跟踪级别
TRACE_LEVEL_LISTENER的取值范围为0~16,当然级别越高,收集的信息就相对越全面,系统默认是0,即不生成trace信息

off or 0 for no trace output
user or 4 for user trace information
admin or 10 for administration trace information
support or 16 for Oracle Support Services trace information
TRACE_FILE_CLIENT --设置客户端和服务器端的trace文件的名称
TRACE_TIMESTAMP_CLIENT --是否在trace中写入每条trace信息的dd-mon-yyyy hh:mi:ss:mi时间戳
TRACE_DIRECTORY_CLIENT --设置客户端和服务器端的trace文件的目录

故障排查

一、客户端操作如下:

1.客户端连接异常

C:\Documents and Settings\Administrator>sqlplus system/abc123@orcl
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 2 13:21:16 2014
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
ERROR:
ORA-12545: 因目标主机或对象不存在, 连接失败
请输入用户名:

从报错来看似乎是监听的问题

2.tnsping检查连接串配置及服务器监听状态

C:\Documents and Settings\Administrator>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 02-12月-2014 13:22:17
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
已使用的参数文件:
F:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.0.94)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0
.93)(PORT = 1521)) (LOAD_BALANCE = yes)) (CONNECT_DATA = (SERVER = SHARED) (SERV
ICE_NAME = orcl) (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC))))
OK (30 毫秒)

从tnsping的测试来看,连接串监听都正常

3.由于是生产库是rac环境的尝试单节点登入

C:\Documents and Settings\Administrator>sqlplus system/abc123@orcl1
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 2 13:26:17 2014
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing optionsSQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options 断开
C:\Documents and Settings\Administrator>sqlplus system/abc123@orcl2
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 2 13:26:24 2014
Copyright (c) 1982, 2005, Oracle.  All rights reserved.连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

从单节点的登入来看配置都正常而且可以正常连接,问题很奇怪为了进一步排查开启开启客户端跟踪
在客户端的sqlnet.ora文件中添加如下内容:

TRACE_LEVEL_CLIENT=16
TRACE_FILE_CLIENT=CLIENT
TRACE_TIMESTAMP_CLIENT=ON
trace_directory_client=D:\oracle\product\10.2.0\db_1\network\ADMIN

4. 重新用客户端登入收集跟踪信息

跟踪信息如下:

[02-12月-2014 14:10:32:968] nsmfr: normal exit
[02-12月-2014 14:10:32:968] nsmfr: entry
[02-12月-2014 14:10:32:968] nsmfr: 736 bytes at 0xe4b9d8
[02-12月-2014 14:10:32:968] nsmfr: normal exit
[02-12月-2014 14:10:32:968] nsclose: normal exit
[02-12月-2014 14:10:32:968] nscall: connecting...
[02-12月-2014 14:10:32:968] nsc2addr: entry
[02-12月-2014 14:10:32:968] nsc2addr: (ADDRESS=(PROTOCOL=tcp)(HOST=hp)(PORT=3554))
[02-12月-2014 14:10:32:968] nttbnd2addr: entry
[02-12月-2014 14:10:32:968] snlinGetAddrInfo: entry
[02-12月-2014 14:10:32:968] snlinGetAddrInfo: Invalid IP address string hp
[02-12月-2014 14:10:32:968] snlinFreeAddrInfo: entry
[02-12月-2014 14:10:32:968] snlinFreeAddrInfo: exit
[02-12月-2014 14:10:32:968] snlinGetAddrInfo: exit
[02-12月-2014 14:10:32:968] nttbnd2addr: looking up IP addr for host: hp
[02-12月-2014 14:10:32:968] snlinGetAddrInfo: entry
[02-12月-2014 14:10:35:218] snlinGetAddrInfo: Name resolution failed for hp
[02-12月-2014 14:10:35:218] snlinFreeAddrInfo: entry
[02-12月-2014 14:10:35:218] snlinFreeAddrInfo: exit
[02-12月-2014 14:10:35:218] snlinGetAddrInfo: exit
[02-12月-2014 14:10:35:218] nttbnd2addr:  *** hostname lookup failure! ***
[02-12月-2014 14:10:35:218] nttbnd2addr: exit
[02-12月-2014 14:10:35:218] nserror: entry
[02-12月-2014 14:10:35:218] nserror: nsres: id=0, op=77, ns=12545, ns2=12560; nt[0]=515, nt[1]=1001, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0
[02-12月-2014 14:10:35:218] nsc2addr: error exit

从以上跟踪信息,当我们尝试使用orcl连接串连接时被路由到了HP这个主机,可是tnsnames.ora连接串里面根本没有配置相关的信息,那怎么会呢从客户端的配置似乎查不出什么原因,尝试从生产库查找。

二、服务器端配置查看

1.查看生产库的local_listener和remote_listener配置

SQL> show parameter local    
NAME                          TYPE    VALUE
---------------------------  ---------------------------------------
local_listener                string  (address=(protocol=tcp)(host=192.168.0.93)(port=1521))
SQL> show parameter remote   
NAME                          TYPE    VALUE
---------------------------  ---------------------------------------
remote_listener               string  LISTENERS_ORCL

从配置上来看都没有任何异常

2.查看生产库的监听状态

C:\Documents and Settings\Administrator>lsnrctl status
LSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 02-12月-2014 14:15:29
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 64-bit Windows: Version 10.2.0.4.0 - Production
启动日期                  24-11月-2014 20:52:17
正常运行时间              7 天 17 小时 23 分 13 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:\oracle\product\10g\network\admin\listener.ora
监听程序日志文件          D:\oracle\product\10g\network\log\listener.log
监听端点概要...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=svr01)(PORT=1521)))
服务摘要..
服务 "+ASM" 包含 1 个例程。例程 "+asm2", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "+ASM_XPT" 包含 1 个例程。例程 "+asm2", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 3 个例程。例程 "orcl1", 状态 READY, 包含此服务的 31 个处理程序...例程 "orcl2", 状态 READY, 包含此服务的 32 个处理程序...例程 "orclstd", 状态 READY, 包含此服务的 2 个处理程序...
服务 "orcl_XPT" 包含 3 个例程。例程 "orcl1", 状态 READY, 包含此服务的 31 个处理程序...例程 "orcl2", 状态 READY, 包含此服务的 32 个处理程序...例程 "orclstd", 状态 READY, 
包含此服务的 2 个处理程序...
命令执行成功

从监听来看似乎也看不出什么端倪

3.生产库尝试用orcl连接串连接

C:\Documents and Settings\Administrator>sqlplus  system/abc123@orcl
SQL*Plus: Release 10.2.0.4.0 - Production on 星期二 12月 2 13:45:51 2014
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
连接到:
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orclstd
SQL> show parameter remote
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_listener                      string      LISTENERS_ORCL
C:\Documents and Settings\Administrator>tnsping listeners_orcl
TNS Ping Utility for 64-bit Windows: Version 10.2.0.4.0 - Production on 02-12月-2014 14:01:53
Copyright (c) 1997,  2007, Oracle.  All rights reserved.
已使用的参数文件:
D:\oracle\product\10g\network\admin\sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
Attempting to contact (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = svr02-vip)(PORT = 1521)) (ADDRESS = (
PROTOCOL = TCP)(HOST = svr01-vip)(PORT = 1521)))
OK (20 毫秒)
C:\Documents and Settings\Administrator>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on 星期二 12月 2 14:01:02 2014
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> select instance_name from gv$instance;
INSTANCE_NAME
----------------
orcl2
orcl1

从以上的连接来看其实已经很明显了,当时用orcl连接串连接时连接到orclstd,由于orclstd库remote_listener参数所引起,orclstd库在远程注册实例状态了,然后路由到备机了,导致生产使用orcl报错。
注:(orclstd这个库是利用生产的rman备份恢复回来的数据库)

4.查看生产监听状态正式以上判断

C:\Documents and Settings\Administrator>lsnrctl statusLSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 02-12月-2014 14:15:29Copyright (c) 1991, 2007, Oracle.  All rights reserved.正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 64-bit Windows: Version 10.2.0.4.0 - Production
启动日期                  24-11月-2014 20:52:17
正常运行时间              7 天 17 小时 23 分 13 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:\oracle\product\10g\network\admin\listener.ora
监听程序日志文件          D:\oracle\product\10g\network\log\listener.log
监听端点概要...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=svr01)(PORT=1521)))
服务摘要..
服务 "+ASM" 包含 1 个例程。例程 "+asm2", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "+ASM_XPT" 包含 1 个例程。例程 "+asm2", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 3 个例程。例程 "orcl1", 状态 READY, 包含此服务的 31 个处理程序...例程 "orcl2", 状态 READY, 包含此服务的 32 个处理程序...例程 "orclstd", 状态 READY, 包含此服务的 2 个处理程序...
服务 "orcl_XPT" 包含 3 个例程。例程 "orcl1", 状态 READY, 包含此服务的 31 个处理程序...例程 "orcl2", 状态 READY, 包含此服务的 32 个处理程序...例程 "orclstd", 状态 READY, 包含此服务的 2 个处理程序...   --确实证实了之前的判断,罪魁祸首水落石出
命令执行成功

5.证实备机是否主机名为hp

C:\Documents and Settings\Administrator>hostname
hpC:\Documents and Settings\Administrator>ping hp
Pinging hp [192.168.0.80] with 32 bytes of data:
Reply from 192.168.0.80: bytes=32 time<1ms TTL=128

故障后期处理

1.注销备机的remote_listener

alter system set remote_listener='' scope=both;

2.生产库重新加载监听

C:\Documents and Settings\Administrator>lsnrctl reload
LSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 02-12月-2014 14:18:51
Copyright (c) 1991, 2007, Oracle.  All rights reserved.正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
命令执行成功C:\Documents and Settings\Administrator>lsnrctl status
LSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 02-12月-2014 14:18:57
Copyright (c) 1991, 2007, Oracle.  All rights reserved.正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 64-bit Windows: Version 10.2.0.4.0 - Production
启动日期                  24-11月-2014 20:52:17
正常运行时间              7 天 17 小时 26 分 40 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:\oracle\product\10g\network\admin\listener.ora
监听程序日志文件          D:\oracle\product\10g\network\log\listener.log
监听端点概要...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=svr01)(PORT=1521)))
服务摘要..
服务 "+ASM" 包含 1 个例程。例程 "+asm2", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "+ASM_XPT" 包含 1 个例程。例程 "+asm2", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 2 个例程。例程 "orcl1", 状态 READY, 包含此服务的 31 个处理程序...例程 "orcl2", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl_XPT" 包含 2 个例程。例程 "orcl1", 状态 READY, 包含此服务的 31 个处理程序...例程 "orcl2", 状态 READY, 包含此服务的 1 个处理程序...  

–orclstd 已经消失了
命令执行成功

3.客户端再次利用orcl连接数据库正常

D:\>sqlplus system/abc123@orclSQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 2 14:21:01 2014Copyright (c) 1982, 2005, Oracle.  All rights reserved.连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing optionsSQL> show parameter nameNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert                 string
db_name                              string      orcl
db_unique_name                       string      orcl
global_names                         boolean     FALSE
instance_name                        string      orcl2
lock_name_space                      string
log_file_name_convert                string
service_names                        string      orcl

到此处问题已经解决

技术结论

通过以上一步步的推敲,终于发现了问题的根本原因,由于利用rman异机恢复时remote_listener参数所引起。orclstd库在远程注册实例状态了,然后路由到80备机了,导致生产使用orcl报错。
在这里插入图片描述


http://www.ppmy.cn/server/152538.html

相关文章

防止私接小路由器

电脑获取到IP地址不是DHCP服务器的IP地址段&#xff0c;导致整个公司网络瘫痪&#xff0c;这些故障现象通常80%原因是私接小路由器导致的&#xff0c;以下防止私接小路由器措施。 一、交换机配置DHCP Sooping DHCP snooping是一种DHCP安全特性&#xff0c;用于防止非法设备获…

分布式光伏电站气象站

分布式光伏电站气象站是一种集成了光伏发电与气象观测功能的高科技设备&#xff0c;其主要功能体现在以下几个方面&#xff1a; 一、实时监测与记录气象数据 分布式光伏电站气象站能够实时监测和记录光伏电站所在区域的关键气象数据&#xff0c;包括但不限于温度、湿度、风速…

【落羽的落羽 C语言篇】数据存储简介

文章目录 一、整型提升1. 概念2. 规则 二、大小端字节序1. 概念2. 练习练习1练习2 三、浮点数在内存中的存储1. 规则2. 练习 一、整型提升 1. 概念 C语言中&#xff0c;整型算术运算至少是以“缺省整型类型”&#xff08;int&#xff09;的精度来进行的。为了达到这个精度&am…

游戏AI实现-寻路算法(Dijkstra)

戴克斯特拉算法&#xff08;英语&#xff1a;Dijkstras algorithm&#xff09;&#xff0c;又称迪杰斯特拉算法、Dijkstra算法&#xff0c;是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程&#xff1a; 1.首先设置开始节点的成本值为0&#xff0c;并将…

JavaScript事件循环案例深入理解

事件循环的主要步骤&#xff1a; 执行栈&#xff08;Call Stack&#xff09;&#xff1a; 同步代码直接进入栈中依次执行。 任务队列&#xff08;Task Queue&#xff09;&#xff1a; 异步任务&#xff08;如 setTimeout、DOM 事件、Ajax 回调&#xff09;完成后将其回调函数放…

VSCode 插件开发实战(三):插件配置项自定义设置

前言 作为一名前端开发者&#xff0c;您可能已经在 VSCode 中体验过各种强大的插件。那么&#xff0c;如果您希望创建一个属于自己的插件&#xff0c;并且希望用户能够通过自定义配置进行灵活调整&#xff0c;该如何实现呢&#xff1f;本文将详细介绍如何在 VSCode 插件中实现…

jmeter怎么调用python

jmeter中使用python脚本 在jmeter中使用python脚本&#xff0c;搜了下&#xff0c;找到三种方式&#xff1a; 1、使用Jython包 下载 Download Jython 2.7.0 - Standalone Jar 包&#xff0c;放到jmeter/lib/目录下&#xff0c;重启jmeter&#xff0c;就能在sampler中找到JSR…

【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记

文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中&#xff0c;浏览器首先会发送一个请求到服务器&#xff0c;服务器…