当前位置: 首页 > news >正文

“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 还是可以连上数据库的 。

相关文章:

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

1. 背景及问题 今天在Oracle BCV技术[1]做数据同步,建立生产库的测试库,需要DBA配合同步前后的停库和起库。在同步完起库后,有部门反应同步好的测试库连接不上去。 2. 问题排查 以我当前的知识储备,能想到的可能就是以下几点进…...

Vmware虚拟机接入物理机路由器网络

网络适配器增加至两个,一个选NAT, 另一个选host-only,再加一个桥接,不勾选使用物理网卡,然后重启即可!...

yolov8旋转框+关键点检测

一、Yolov8obb_kpt -----------------------------------现已在v8官方库上更新旋转框分割算法和旋转框关键点检测算法-------------------------- ------------------------------------------- https://github.com/yzqxy/ultralytics-obb_segment---------------------------…...

Qt-QWidget的windowTitle属性(13)

目录 描述 相关API 使用观察 描述 这个我们之前用过很多次了,就不再赘述了,简单说就是可以给那个边框设置标题,但是这里有一个小细节需要我们注意,就是谁的窗口谁设置 相关API 使用观察 我们这样写的话会发现一个问题&#x…...

RCE编码绕过--php://filter妙用

目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;&#xff0c;代码没有办法执行下去&#xff0c;所以…...

FactoryBean 与 BeanFactory

首先从字面理解: FactoryBean -->工厂Bean&#xff1b; BeanFactory -->Bean工厂。 即&#xff1a; FacttoryBean 是一个bean&#xff0c; BeanFactory 是bean的工厂。 使用&#xff1a; 1、BeanFactory&#xff1a; 提供获取bean的API。 2、FactoryBean&#xff1a; p…...

【迅为RK3568开发板】OpenHarmony学习开发系列教程(第2期 南向基础篇一)

P1P1_搭建Ubuntu开发环境-8:23 P2P2_获取OpenHarmony源码-10:21 P3P3_初次编译OpenHarmony源码-7:11 P4P4_OpenHarmony镜像简介以及烧写工具配置-9:18 P5P5_优化开发流程-搭建windows开发环境-5:34 P6P6_优化开发流程-搭建ubuntu开发环境-2:09 P7P7_优化开发流程-配置远程访问环…...

编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度

文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码&#xff1a; SessionFactoryImpl 的初始化里做了非常多的事情&#xff0c;初始化各种资源&#xff0c;并调用 SchemaManagementToolCoordinat…...

TOMCAT入门到精通

目录 一 WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表 1.2.3 JavaScript 二 WEB框架 2.2后台应用架构 2.2.1单体架构 2.2.2微服务 2.2.3单体架构和微服务比较 三 tomcat的…...

Android笔试面试题AI答之Kotlin(18)

文章目录 86. 阐述Kotlin中性能优化之局部函数 &#xff1f;局部函数的优点间接的性能优化注意事项 87. 简述Kotlin中性能优化之数组使用 &#xff1f;1. 选择合适的数组类型2. 避免不必要的数组创建3. 优化数组访问4. 合理使用数组遍历方式5. 利用Kotlin的集合操作API6. 注意数…...

Linux基础知识学习(五)

1. 用户组管理 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理&#xff08;开发、测试、运维、root&#xff09;。不同Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户…...

股票买卖的思路与代码

题目 1302&#xff1a;股票买卖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:8660 通过数: 4290 【题目描述】 最近越来越多的人都投身股市&#xff0c;阿福也有点心动了。谨记着“股市有风险&#xff0c;入市需谨慎”&#xff0c;阿福决定先来研究一下简化版的股…...

Eureka Server与Eureka Client详解:服务注册与发现的交互机制

Eureka Server与Eureka Client详解&#xff1a;服务注册与发现的交互机制 Eureka 是 Netflix 开源的一个服务发现框架&#xff0c;它是 Spring Cloud 微服务架构中的核心组件之一。Eureka 主要由两个关键组件构成&#xff1a;Eureka Server 和 Eureka Client。它们之间通过一定…...

php-fpm 如何查看哪个正在执行死循环 并终止

php-fpm 如何查看哪个正在执行死循环 并终止 1. 检查 PHP-FPM 进程的 CPU 使用情况 首先&#xff0c;使用 top 或 htop 命令检查哪个 PHP-FPM 进程占用了大量的 CPU 资源。这个进程很可能是在死循环中。 top -c在 top 命令输出中&#xff0c;按 P 键可以按 CPU 使用率排序。…...

电脑硬盘坏了怎么恢复数据?

在数字化时代&#xff0c;电脑硬盘作为存储核心&#xff0c;承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而&#xff0c;硬盘作为机械设备&#xff0c;也有其寿命和脆弱性&#xff0c;一旦出现故障&#xff0c;数据恢复便成为了一个紧迫而棘手的问题。本文…...

cdga|某大型企业数据治理的成功转型:构建数据驱动的竞争力新引擎

在当今这个数据爆炸的时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其有效管理和利用直接关系到企业的核心竞争力。某大型企业&#xff0c;作为行业内的领军企业&#xff0c;面对海量数据带来的机遇与挑战&#xff0c;果断启动了一项全面而深入的数据治理项目&a…...

C#使用 ModeBusTCP读取汇川Easy521PLC

Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种&#xff0c;它允许Modbus协议在以太网网络上运行&#xff0c;使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发&#xff0c;是一种工业现场总线协议标准&#xff0c;广泛应用于工业自动化领域。 #regio…...

PostgreSQL的postgres主进程

PostgreSQL的postgres主进程 在PostgreSQL数据库系统中&#xff0c;主要的后台进程各司其职&#xff0c;保证数据库的高效运行。其中&#xff0c;主进程postgres&#xff08;也称为Postmaster&#xff09;是整个数据库的核心&#xff0c;它负责管理和协调所有其他后台进程&…...

Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解

Java实现K个排序链表的高效合并&#xff1a;逐一合并、分治法与优先队列详解 在算法和数据结构的学习中&#xff0c;链表是一个非常基础但又极具挑战的数据结构。尤其是当面对合并多个排序链表的问题时&#xff0c;如何在保证效率的前提下实现代码的简洁与高效&#xff0c;往往…...

Xinstall揭秘:高效App推广背后的黑科技

在移动互联网时代&#xff0c;App的运营推广成为了开发者们最为关注的话题之一。然而&#xff0c;随着市场竞争的加剧&#xff0c;推广难度也越来越大。这时候&#xff0c;一款名为Xinstall的品牌走进了我们的视线&#xff0c;它以其独特的技术和解决方案&#xff0c;为App推广…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...