“LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程

 1. 背景及问题

今天在Oracle BCV技术[1]做数据同步,建立生产库的测试库,需要DBA配合同步前后的停库和起库。在同步完起库后,有部门反应同步好的测试库连接不上去

2. 问题排查

以我当前的知识储备,能想到的可能就是以下几点进行检查:

  1. 数据库实例状态,是不是没有open ---> select status from v$instance;

  2. 监听器状态,是不是监听没起来 ---> lsnrctl status|start

  3. Oralce黑白名单配置问题 ---> $ORACLE_HOME/network/admin/sqlnet.ora

  4. 客户端 tnsnames.ora 配置问题,连接符写错了 ---> tnsping

  5. 网络连接问题,端口是否开放 ---> ping IP 、 telnet IP 1521

这些都不是,由于情况紧急,测试环境等着用,部门同事再三提示下,我还是不知道他们说的那个参数---LOCAL_LISTENER,这个就是引起这次数据库连接不上的罪魁祸首,导师一下就解决了👍!

我把生产的服务名拿到测试库注册了,导致测试库没有对外提供网络连接,只能通过本地访问数据库,通过将LOCAL_LISTENER该参数重置成默认参数、置空或者修改测试库的服务名就解决了,总之就是使测试库对外提供网络连接,但上面的问题还存在一个非常大的安全隐患,下面细说

3. 事后回顾

今天这个任务的流程是这样的:停库 ---> BCV同步测试数据 ---> 起库,1、3步骤是需要DBA配合来做的,因为是从其他库同步过来的数据,再数据库启动阶段Oracle会做一个数据库启动验证,其实就是对比各个文件数据是否一致,是否需要恢复,首先Oracle启动时会检查数据文件头中的checkpoint cnt是否与对应控制文件中的checkpoint cnt一致,如果一致,进行第二次检查,数据文件头的开始scn和对应控制文件中的结束scn是否一致,如果结束scn等于开始scn,则不需要要对那个文件进行恢复,没问题启动数据库。

我拿其中一部分操作步骤来说今天这次事故发生的原因:

刚刚从生产同步过来的测试库,需要经历启动验证这个阶段,回过来,数据库起库三阶段,

  1. 加载参数文件 --》startup nomount

  2. 加载控制文件 --》startup mount

  3. 加载数据文件等所有文件--》startup (打开到open)

同步过来的测试库可能有日志文件不一致,先以RESETLOGS方式起库

扩展一:Resetlogs  NoResetlogs 的区别

alter database open RESETLOGS;

找到测试库控制文件位置,在后面的参数文件修改成本库的

show parameter control_files

重点来了,关库,去同步的生产库创建一份参数文件:

create pfile='/home/oracle/inittxxxx.ora' from spfile;

用生产库的参数文件起测试库,这份参数文件我只修改了两个参数

*.cluster_database=FALSE
control_files

其中有关参数文件参数的介绍和管理部分,可参考我之前发的一篇文章:

Oracle 文件管理-参数文件、控制文件、归档 - 墨天轮

其中忽略了一个参数也就是本文的主角 local_listener-本地监听服务的名称。

测试库起库:

shutdown immediate;
startup mount pfile='/home/oracle/inittxxxx.ora'; ---用pfile文件起库
alter database noarchivelog;
alter database open;

先介绍一下LOCAL_LISTENER参数,该参数指定了数据库PMON进程需要将数据库实例注册到哪个端口,参数文件是这样配置的 local_listener

*.local_listener='LISTENER_1523','LISTENER_TUX','LISTENER_1529','LISTENER'

扩展二:local_listener 与 remote_listener 设置监听

如果没有设置这个参数,PMON进程默认将数据库的服务注册到本地节点的1521端口,这还好说,我偏偏就指定了这个参数,这个参数是用于本地监听的服务名,也就是说,我把生产的服务名拿到测试库注册了。有什么影响呢?他可能会把当前的服务名按照连接符去生产在注册一遍。

所以问题解决了,为什么连不上库,因为没有该库没有对外提供测试库的监听,业务想要连接数据库需要通过网络连接,即Listener连接到服务器,但是测试库参数指定的监听服务的名称是生产库的,外面肯定连接不上来。

扩展三:连接(访问)数据库的两种方式:LOCAL=NO 和 LOCAL=YES

Oracle的监听就类似与开发中的封装思想, 将对象的属性和方法隐藏起来,通过公开的接口提供对这些属性和方法的访问。 而Oracle监听器(Listener)责管理客户端与数据库实例之间的连接,当客户端发起连接请求时,监听器接收该请求,并将其引导至适当的数据库服务。监听器隐藏了数据库实例的复杂性,只对外提供统一的接口——服务名和连接字符串,让客户端不需要了解数据库实例的具体配置和位置,也可提供服务。

Oracle Listener 可以视为数据库的“前门”,它通过监听网络上的连接请求,封装了数据库的物理细节,比如IP地址、端口号、实例名等,Oracle 将客户端和服务器彻底隔离开来,客户端通过配置的连接字符串、服务名就可以连接到数据库,而不需要知道数据库的内部结构和配置细节,对于客户端来说,它不用关心数据库的名字、实例名到底是什么,它只需要知道数据库对外提供服务。

关于数据库的访问,这里引用一下盖总《深入解析Oracle》一书中的介绍,

数据库启动之后,要想提供网络服务,通过远程连接访问,我们还需要启动数据库的监听器(配置文件通常为 listener.ora),监听器用于在特定的端口上(缺省的端口是 1521)提供监听,接收来自客户端的访问请求(客户端请求通过 tmnsnames.ora 文件定义发送)。在专用服务器模式下(Dedicated Server),监听器会为每个请求衍生一个服务器进程相对应,通过这个服务器进程将客户端与数据库联系起来。下图描述了建立网络连接时客户端以及服务器端的相关文件及关系:

该书虽然出版的早,但是文章对Oracle数据库的讲解非常全面,通俗易懂,很适合当学习教材。

常用的配置文件介绍

以下是Oracle网络配置文件的简洁描述:

  1. ldap.ora

  • 配置LDAP目录名称解析,允许通过LDAP查询数据库服务信息。

  1. cman.ora

  • 配置Oracle连接管理器参数,用于管理和路由客户端连接。

  1. tnsnames.ora

  • 配置本地或远程客户端的本地名称解析,定义数据库服务的网络地址映射。

  1. listener.ora

  • 配置监听器的注册信息,指定监听的数据库服务和网络参数。

  1. sqlnet.ora

  • 配置服务器或客户端的网络协议支持、解析方式、安全、认证等设置。

上面提到测试库注册了生产库的服务名,但是因为是是别名,在测试库的tnsname.ora里并没有识别到,还有一种写法,可以直接写连接符,如下

SQL> alter system set local_listener='ADDRESS=(PROTOCOL=TCP)(HOST=192.168.60.101)(PORT=1521)'; 
SQL> show parameter local_listener;
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
local_listener			     string	  (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.60.101)(PORT=1521))

但如果测试库的tnsname.ora配置了一样的名字,成功识别到了这些信息,将信息注册到生产库上会造成什么影响呢?可能有两种可能

1、服务名一样,IP一样

2、服务名一样,IP不一样

4. 测试和验证- Oracle测试库与生产库使用相同服务名的影响分析及验证

后面单独写一篇文章来测试吧!

5. 总结 — Oracle 客户端无法连接之监听的分析流程

还有什么情况连接不上数据库,欢迎大家在评论区补充!

6. 参考文章

架构师深入解析Oracle BCV技术(oracle bcv)

Oracle 文件管理-参数文件、控制文件、归档 - 墨天轮

扩展一:控制文件中关于 Resetlogs 和 NoResetlogs 的区别

RESETLOGS 会重置在线重做日志文件,并重新开始日志序列号。通常在不完全恢复或数据库克隆时用。RESETLOGS之后,之前的日志和备份将不再有效,因此必须重新创建全备份。通常用在:不完全恢复、 数据库复制或克隆 、 备份丢失或不全的场景下。

NORESETLOGS 则保持现有的日志序列号,不会创建新的日志文件。通常在完全恢复时使用,能够继续使用现有的备份和日志文件,不需要立即重新备份数据库。

通常在不使用备份控制文件恢复的情况下,是可以使用 noresetlog 方式打开数据库的。 前提是不能丢失日志文件。假若丢失了控制文件和数据文件但还是想以 noresetlog打开的话,就必须手动以noresetlogs方式重建控制文件,而且redolog 的状态都必须正常

其他恢复情况:失控制文件及各种日志REDOLOG、所有的不完全恢复包括SCN,TIME,跨越 REDO,都必须使用 resetlogs,重置日志,肯定会丢数据,只能恢复到日志当前的数据。

在同步完测试库后,控制文件会去读数据文件头中与 CHECKPOINT SCN 对应的 RBA 信息来确定从那个序列的归档日志开始恢复,一直推进恢复到 NEXT SCN 是无穷大的那个 REDOLOG,此时恢复是完全恢复的,但打开的时候还要以 resetlogs 方式打开。

并且有些情况Oracle是允许以不一致的状态打开数据库,可以创建一份参数文件指定数据库的DBID,allow_resetlogs_corruption参数,手工起库,但这可能导致数据库进一步损坏。因此,此参数应仅在没有其他恢复选项且需要立即访问数据库时使用。

扩展二:local_listener 与 remote_listener 设置监听

1、LOCAL_LISTENER 参数配置

首先将监听的信息添加到 tnsnames.ora 文件中。 动态注册监听时要从 tnsnames.ora 中读取相关信息。

LISTENER_PRODFS = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.101)(PORT = 1521)))

然后以 sys 用戶修改 local_listener 参数:

SQL> alter system set local_listener='LISTENER_PRODFS';

也可以不使用别名直接指定连接符(加服务器模式):

QL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.101)(PORT = 1521))';

这样,在 DB 启动的时候,就会自动的把 instence_name 和 service_name 注册到监听。 如果在这期间,监听重启了,监听里的信息也会丢失,这时就需要手动的把信息注册到监听:

SQL> alter system register;

2. REMOTE_LISTENER 参数配置

REMOTE_LISTENER 参数指定了远程监听器的地址,用于支持远程连接。配置远程监听器时,需要在 tnsnames.ora 文件中添加相应的监听器信息:

LISTENERS_DB01 = (DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.101)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.102)(PORT = 1522))))

测试配置是否正确,可以使用 tnsping 命令:

$ tnsping LISTENERS_DB01

在所有节点上设置远程监听器:

SQL> ALTER SYSTEM SET REMOTE_LISTENER='LISTENERS_DB01' SCOPE=BOTH;

⭐此外还有还有一个参数`listener_networks`,用来增加一个监听用来使用专门的网络传输归档日志到DG库,这样不会影响业务。

参考MOS[ID 1063571.1]How to Configure A Second Listener on a Separate Network in 11.2 Grid Infrastructure

扩展三:连接(访问)数据库的两种方式:LOCAL=NO 和 LOCAL=YES

在Oracle数据库中,连接到数据库可以通过两种主要方式:本地连接(LOCAL=YES)和非本地连接(LOCAL=NO)。

  1. 非本地连接(LOCAL=NO)
    非本地连接,也称为网络连接,通过监听器(Listener)与数据库服务器进行通信。在这种方式下,客户端应用程序通过本地监听器将请求发送到服务器端监听器。服务器端监听器接收请求后,将其转发到数据库实例,数据库实例执行操作并将结果返回给客户端。因此,客户端需要配置监听器信息,通常在tnsnames.ora文件中进行设置。

  2. 本地连接(LOCAL=YES)
    本地连接直接在数据库服务器上进行,不经过网络监听器。在这种模式下,即使服务器上的监听器未启动, 通过本地的 sqlplus 还是可以连上数据库的 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405408.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…

国内智能车零部件头号玩家引望:年出货300万套,估值1150亿

作者 |德新 编辑 |王博 8月19日,长安汽车发布公告,其联营企业阿维塔科技在当日的董事会上,通过了对引望公司的投资方案议案。 阿维塔将在8月20日与华为签约,阿维塔将出资115亿元,对引望公司持股10%,华为持…

用Maven开发Spring Boot 项目

一、初识 Spring Boot Spring Boot框架是一 套开源的后台开发框架, 继承了Spring MVC框架的前辈SSM框架的优秀特性,通过注解大幅减少程序员写配置的工作量。从企业开发角度来看,它提供了自动化配置,内嵌容器和兼容Maven等核心功…

设计模式六大原则(一)–单一职责原则(C#)

文章目录 1. 什么是单一职责原则?2. 单一职责原则的定义3. 单一职责原则的重要性4. 单一职责原则的示例(C#)5.如何判断是否违反单一职责原则6. 单一职责原则的应用场景7. 总结 在软件开发领域,设计模式是解决常见问题的经典解决方…

RK3588J正式发布Ubuntu桌面系统,丝滑又便捷!

本文主要介绍瑞芯微RK3588J的Ubuntu系统桌面演示,开发环境如下: U-Boot:U-Boot-2017.09 Kernel:Linux-5.10.160 Ubuntu:Ubuntu20.04.6 LinuxSDK: rk3588-linux5.10-sdk-[版本号] (基于rk3…

如何使用mmdetection训练实例分割模型?

安装 anoconda 从官方网站下载并安装。 配置环境 conda create --name openmmlab python3.8 -y conda activate mmdet 安装 PyTorch 注意:这个步骤很关键,否则后面会出问题。一定要确保自己电脑当前安装和配置的cuda版本。 使用命令:nvcc …

做数据采集,你真的了解PLC插槽号吗?

有很多PLC可以在系统里配置多个独立CPU,各自有自己的任务。也有一些PLC,虽然只有一个CPU,但是,其位置是可变的。外部进行数据采集时,首先要搞明白采集目标是哪个CPU,否则,就会张冠李戴&#xff…

【运维】从一个git库迁移到另一个库

工作目录: /home/java/hosts 10.60.100.194 脚本 hosts / hostsShell GitLab (gbcom.com.cn) 核心代码

FFmpeg的入门实践系列一

欢迎诸位来阅读在下的博文~ 在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力! 江山如画,客心如若,欢迎到访,一展风采 文章目录 参考环境本系列的适用人群FFmpeg的简介FFmpeg…

win11安装python及pycharm与webots联合仿真

1、查看Windows系统 是否已安装Python及版本 【冰糖Python】Windows系统 查看已安装的Python版本_怎么确定windows上成功安装python-CSDN博客 好,确认没装下面装python37 2、安装python3.7.9 参考教程Python 3.82安装教程(Windows11、超详细版&#x…

C语言基础(六)

一维数组: C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。 数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。 数组的大小在声明时确定,并且之后不能改…

ansible搭建+ansible常用模块

ansible搭建 管理机安装ansible,被管理节点必须打开ssh服务 1.管理机安装ansible yum -y install ansible 2.查看版本 ansible --version ansible 2.9.27 3.查找配置文件 find /etc/ -name "*ansible*" /etc/ansible /etc/ansible/ansible.cfg 4.三台被管理机…

【中项第三版】系统集成项目管理工程师 | 第 15 章 组织保障

前言 本章的知识点预计上午会考1-2分,下午可能会考,一般与其他管理领域进行结合考查。学习要以教材为主。 目录 15.1 信息和文档管理 15.1.1 信息和文档 15.1.2 信息(文档)管理规则和方法 15.2 配置管理 15.2.1 基本概念 …

背包问题有前提

前言&#xff1a;这个有大前提的背包感觉不能用二进制拆分&#xff0c;不然搞不清楚 注意三维的顺便&#xff0c;第一维度是枚举物品&#xff0c;第二维度是倒序枚举空间&#xff0c;第三维度是枚举数量 题目地址 #include<bits/stdc.h> using namespace std;#define …

数据库:数据更新和视图

1 实验目的 &#xff08;1&#xff09;掌握SQL语言的数据更新功能&#xff1a; update 语句用于对表进行更新 delete 语句用于对表进行删除 insert 语句用于对表进行插入 &#xff08;2&#xff09;掌握对视图的操作&#xff1a; 视图的定义 视图的更新 基于视图的查询 …

基于推荐算法的景点攻略网站的设计与实现---附源码130855

摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游景点分享也是十分常见的。过去使用传统广告方式对旅游景点进行推荐分享&#xff0c;造成了流程繁琐、难以维护&#xff0c;难于进准推荐给适合需求的人群等问题&#xff0…

详细扒一扒css的背景渐变(通俗易懂)

前言&#xff1a; CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。 CSS 定义了两种渐变类型&#xff1a; 线性渐变&#xff08;向下/向上/向左/向右/对角线&#xff09;径向渐变&#xff08;由其中心定义&#xff09; 下面来详细看看吧~ &#x1f308;&#x1f308;文…

qdma IP内部对于GT位置的约束

https://support.xilinx.com/s/question/0D52E00006hpphySAA/%E6%80%8E%E6%A0%B7%E7%AE%A1%E7%90%86pcie%E7%AD%89ip%E7%94%9F%E6%88%90%E7%9A%84xdc%E6%96%87%E4%BB%B6%E6%AF%94%E8%BE%83%E5%A5%BD?languageen_US GT约束的建议 qdma ip 对于GT的约束 # qdma ip 对于GT的约…

Gadmin极速开发平台,几分钟给你整一个OA系统出来

Gadmin极速开发平台 在企业信息化的大潮中&#xff0c;Gadmin极速开发平台以其独特的低代码开发模式&#xff0c;为企业提供了一套高效、灵活的解决方案。本文将介绍Gadmin平台的基本信息、核心特点&#xff0c;以及它如何帮助企业快速实现信息化建设。 软件简介 Gadmin是一个…

《黑神话·悟空》提高了多少游戏人的热情

《黑神话&#xff1a;悟空》的发布极大地提振了游戏人的热情&#xff0c;不管是国内游戏的带动&#xff0c;还是全球国产游戏的崛起&#xff0c;开启了国产3A游戏元年&#xff0c;下面我从主要两个大点来分析下。 玩家层面&#xff1a; 高度热情加强力追捧&#xff1a;从 202…