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

news2024/9/21 18:33:39

 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.coloradmin.cn/o/2057919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NLP】注意力机制:规则、作用、原理、实现方式

文章目录 1、本章目标2、注意力机制介绍2.1、注意力概念2.2、注意力机制2.3、翻译举例 3、注意力计算规则3.1、打个比喻3.2、公式3.2.1、线性变换 点积注意力3.2.2、加性注意力3.2.3、点积注意力3.2.4、对比与总结3.2.5、bmm运算 4、注意力机制的作用5、注意力机制原理⭐5.1、…

基于java的美食信息推荐系统的设计与实现论文

摘 要 使用旧方法对美食信息推荐系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在美食信息推荐系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的美…

Linux系统-vi/vim编辑器权限管理文档处理三剑客

1.vi/vim文本编辑器 vim是vi的增强版,vi是系统自带的。以下命令在vi/vim中通用: 刚打开的默认模式 快捷键:gg 跳到文件开头,G 跳到文件最后一行。 快捷键:0 跳到行首,$ 跳到行尾。 快捷键:…

C++ | Leetcode C++题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; class Twitter {struct Node {// 哈希表存储关注人的 Idunordered_set<int> followee;// 用链表存储 tweetIdlist<int> tweet;};// getNewsFeed 检索的推文的上限以及 tweetId 的时间戳int recentMax, time;// tweetId 对应发送…

vue3--定时任务cron表达式组件比较

## 背景&#xff1a; 之前使用vue2开发项目时&#xff0c;使用了cron组件&#xff0c;比较了两种组件的使用效果。现在需要把原有的vue2项目升级为vue3&#xff0c;需要对应的cron组件。 方案一&#xff0c;vue3-cron-plus 具体实现&#xff1a; 安装插件 npm install vue3-…

浅谈shell中的while true

目录 shell实现死循环你了解while true中的true吗重新认识true和falsewhile true存在的问题实现shell死循环的另一种方法 在shell中实现死循环&#xff0c;一般都会用 while true&#xff0c;那你知道执行while true时&#xff0c;进程都在做些什么吗&#xff1f; shell实现死…

云计算实训32——安装nginx(修改端口为8080)、roles基本用法、使用剧本安装nginx、使用roles实现lnmp

一、安装nginx并更改其端口 编辑hosts配置文件 [rootmo ~]# vim /etc/ansible/hosts 创建目录 [rootmo ~]# mkdir /etc/ansible/playbook 编辑配置文件 [rootmo ~]# vim /etc/ansible/playbook/nginx.yml 执行测试 [rootmo ~]# ansible-playbook /etc/ansible/playbook/n…

【案例49】ORA-01000:超出打开游标的最大数

问题现象 在登录系统时提示报错&#xff1a;ORA-01000 超出打开游标的最大数。 问题分析 游标就是看成是指向结果集的指针。可以把它看成一种资源&#xff0c;或者一种数据结构。 ORA-01000是开发中常见的异常。这个异常表示程序中打开的游标数目> 数据库中设定的可以打开…

OpenCV几何图像变换(2)计算仿射变换矩阵的函数getAffineTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算三对对应点之间的仿射变换。 该函数计算 23 的仿射变换矩阵&#xff0c;使得&#xff1a; [ x i ′ y i ′ ] map_matrix ⋅ [ x i y i 1 …

Datawhale AI 平台 证书 存个档

&#xff01;证书不怕多 &#x1f508; 大模型开发 工程师 欢迎参与 Datawhale 大模型开发 工程师 计划 联合浪潮信息 面向在校学生、社会在职人士 可获官方颁发的 大模型开发工程师 证书 认证地址&#xff1a;大模型开发工程师考试入口&#xff08;电脑端打开&#xff09;评…

C++笔记---类和对象(下)

1. 初始化列表 1.1 初始化列表的使用 在构造函数中&#xff0c;对成员变量进行初始化可以说是公式化的步骤&#xff0c;而初始化列表就将这一步骤进行了标准化。 初始化列表紧跟在构造函数的参数列表后面&#xff0c;使用方式是以一个冒号开始&#xff0c;接着是一个以逗号分…

今日总结:解决了三个小问题

问题01 1.在Bootstrap5中&#xff0c;offcanvas失去焦点后会自动回到顶端&#xff0c;用了一个非常简单的方法&#xff0c;将触发侧边栏的按钮代码由 <button type"button">换成 <a type"button">更多解决方法详见&#xff1a;更多方法 注…

杰发科技AC7801——GPIO通过寄存器地址控制高低电平

通过这个寄存器来查看控制的是哪个ODR值&#xff0c;使用sample&#xff0c;发现是0x20080068的第7和第9位 使用51控制寄存器的代码来置高置低代码&#xff0c;注意变量需要用unsigned int来声明 unsigned int ledBit 0;mdelay(100);ledBit | (1 << 9); ledBit & ~…

【第五节】Win32汇编程序设计

目录 一、汇编的第一个“helloworld” 二、汇编中的标号 三、的使用 四、数据定义 五、全局变量 六、局部变量 七、结构体 八、结构体的访问 九、获取变量地址 十、函数 十一、分支与循环 十二、内联汇编 十三、裸函数的使用 一、汇编的第一个“helloworld” .38…

从桌面到云端,2024年智能录屏解决方案全攻略

从教学演示到游戏直播&#xff0c;从软件教程到会议记录&#xff0c;录屏软件已经逐渐成为不可或缺的工具。那么面对这众多录屏软件我们要怎么选择呢&#xff1f;有没有和win10录屏快捷键一样可以快捷操控的工具呢&#xff1f;这次我们一起来探讨吧。 1.福昕录屏大师 链接&am…

Windows下线程的创建与使用(win32-API)

一、前言 线程是比进程更轻量级的执行单元&#xff0c;允许在一个进程中并发执行多个控制流。每一个线程都有自己的程序计数器、寄存器集和栈空间&#xff0c;但它们共享所属进程的全局数据和资源。这种共享内存模型使线程间的通信比进程间通信更为高效&#xff0c;同时也带来…

2-71 基于matlab的小波分析在心电信号去噪中的应用

基于matlab的小波分析在心电信号去噪中的应用&#xff0c;主要针对心电信号中的肌电干扰/基线漂移/工频干扰进行的算法研究&#xff0c;输出了三类去噪结果。程序已调通&#xff0c;可直接运行。 2-71 基线漂移去噪 工频干扰去噪 - 小红书 (xiaohongshu.com)

android apk 加固后的地图加载异常及重新签名

1.首先根据需求将打包生成后的APK进行加固&#xff0c;可以使用360、阿里、腾讯加固等。 2.加固后的APK无法直接安装&#xff0c;需要重新进行签名。 3.首先找到sdk的位置&#xff0c;进入build-tools目录。 4.根据gradle文件选择版本目录。 5.将加固后的APK放至该目录下。在…

QT-小游戏翻金币

QT-小游戏翻金币 一、演示效果二、使用步骤三、下载链接 一、演示效果 二、使用步骤 #include "chooselevelscene.h" #include <QMenuBar> #include <QPainter> #include "mypushbutton.h" #include <QDebug> #include <QTimer> …

Ajax-3

一.图片上传 1.获取图片文件对象 2.使用FormData携带图片文件 const fd new FormData() fd.append(参数名, 值) 3.提交表单数据到服务器&#xff0c;使用图片url网址 二.AJAX原理—XMLHttpRequest 定义&#xff1a;XMLHttpReques&#xff08;XHR&#xff09;对象用于与服务器…