Oracle-DG备库应用查询不到数据问题处理

news2024/11/25 12:39:46

背景:

        一套准备上线的Oracle 11G RAC主备集群,应用报告说部分模块测试发现在备库查不到新插入的数据,而且问题发生的频率很高,需确认主备之间同步是否存在问题,此套主备之间同步采用SYNC+AFFIRM模式

问题分析:

        接到问题之后,首先分析的是主备之间的同步链路是否有问题,同步采用的是SYNC+AFFIRM模式,主库每次提交都需要确认同步日志在备库落盘之后才返回应用,所以正常主备之间同步的数据不会出现丢失,并且主备两端的存储都是NVME SSD盘,同步的时间<1秒

d24934e2c76e564b918eecf839c54719.png

        检查主库LGWR的trc文件,确认LGWR进程同步是否为sync模式或者是否出现过模式切换的情况

        从日志可以看到当前LGWR进程当前为sync模式,通过NSS2进程与备库进行日志同步,没有出现报错或者模式切换,报错的情况

90e07fee62bdb7acb49971eb9c84298a.png

        检查NSS2进程的trc文件,进程连接备库正常,没有出现报错

c04d7a220c2a5005d24f7a8bcd1b8cfe.png

        查询备库的同步,没有看到存在传输或者应用延迟,但由于V$DATAGUARD_STATS视图只能精确到秒,无法确认是否存在<1秒的延迟

09f90e070462e1f88b2710a2a1e8f158.png

        查看备库的历史延迟,可以看到有0秒-1秒的应用延迟出现

SELECT name, time, unit, count, TO_DATE(last_time_updated, 'MM/DD/YYYY HH24:MI:SS') 
FROM v$standby_event_histogram 
ORDER BY unit DESC, time;

        分析到这里,我们可以基本确认以下信息

        1 主备之间的链路同步没有问题,SYNC模式正常运转,每次提交日志都要在备库落盘才能完成,也就是主备之间是传输延迟不是问题的所在

        2 可能出现的瓶颈在于备库端的日志应用,因为存在<1秒的日志应用延迟,应用日志慢的可能原因,MRP进程和其并行进程的自身消耗,数据库的IO磁盘性能以及数据库的内存配置太低,这里可以暂时排除IO磁盘性能导致的问题,一方面是磁盘采用了高性能的存储,在目前备库几乎没有任何写压力的情况下,延迟<1ms,另一方面通过检查OSW基本可以排除存储存在IO等待的问题,数据库的内存配置太低也可以排除,数据库的SGA配置达到150G

        所以,接下来我们需要继续分析以下问题

        1 应用所说的部分模块测试发现在备库查不到新插入的数据,在数据库层面是否可以得到确认,因为需要定性是否是数据库层的原因或者其他方面,比如应用自身的读写中间件有问题导致

        2 数据库的MRP进程应用消耗

        接下来,我们将测试的应用同事拉过来,让他们在旁边点击该问题模块进行测试,而我们在数据库层进行查询,确认具体的执行会话以及sql,但由于执行速度太快,人为几乎无法进行跟踪,我们需要采取其他的方式进行确认

        我们首先想到的是对整个数据库开启10046,但由于生产的进程trc文件太多,对问题的分析非常的不方便,因为我们需要实时的确认应用的每一次点击,在数据库是否有查到数据

alter system set events '10046 trace name context forever,level 12'; (开启跟踪)
alter system set events '10046 trace name context off'; (关闭跟踪)

        最后,我们采用了通过查看gv$sql里面记录的sql统计信息来确认应用的每一次点击,在数据库是否有查到数据,需要注意的是由于是在备库,所以能查询的信息要比主库的少,只能通过内存里面的数据字典视图v$来获取

        通过应用提供的表名,我们在gv$sql里面捞到了具体的执行sql_id,再根据sql_id查看每次执行访问的行数ROWS_PROCESSED来确认是否查到数据

        先刷新shared pool里面的sql_id信息,再让应用点击该问题模块进行测试,这样可以更好的确认语句的执行情况

        应用测试点了两次都出现查询不到数据的问题,从数据库层查看gv$sql该语句的统计信息,语句最新执行的时间以及执行次数都匹配了应用的测试时间以及点击次数,可以发现两次执行的ROWS_PROCESSED都返回0,而在主库我们可以确认到数据已经成功插入进去,那么到这里我们可以确认该问题是在数据库层所发生的,由于备库的日志应用慢所导致

--EXECUTIONS:执行的次数
--FETCHES:结果集的返回客户端次数
--ROWS_PROCESSED:结果的返回行数
--LAST_ACTIVE_TIME:最新执行的时间
select sql_id,last_active_time,FETCHES,EXECUTIONS,ROWS_PROCESSED
from gv$sql
where upper(sql_fulltext) like '%TB_PD_JOINT_MARKETING_PROJECT%' and  sql_id='9645ubx603cdn'
order by 3

e379bff9a8193fead4fdd9be4b2feaec.png

        接下来,我们开始分析备库日志应用慢的原因,首先排除了IO磁盘性能以及数据库的内存配置所导致的,分析MRP进程和其并行进程的自身消耗

        对MRP进程设置10046进行跟踪

SQL> select process,pid from v$managed_standby where process like '%MRP%';
​
PROCESS    PID
--------- ----------
MRP0         38697
​
SQL> 
SQL> 
SQL> oradebug setospid 38697
oradebug unlimit
oradebug Event 10046 trace name context forever,level 12Oracle pid: 79, Unix process pid: 38697, image: oracle@drdb1 (MRP0)
SQL> Statement processed.

         可以看到MRP进程出现了很多'parallel recovery control message reply'并行进程通信回复的等待,很有可能是跟并行进程过多导致的通信损耗有关,当前MRP进程按照参数数量CPU_COUNT开了96个进程

87ddaa2dd3101b5a23f53c7a21941d8b.png

        在Oracle mos官方上也可以看到类似MRP Slow or apply lag on Active Data Guard (ADG) (Doc ID 2347080.1)的由于高并行的MRP进程导致日志应用慢的问题

a9018a6be5d64aca5e70f8691563869d.png

        按照官方建议的方法,采用串行的mrp日常应用或者降低mrp进程的并行度

8e8ab26938f56ce8dcf4efd2474c034e.png

        调整了mrp进程的并行之后,让应用重新测试,终于可以正常查到数据,并且反复测试了几次,只要采用高并行的mrp进程复制应用就出现查询不到数据的问题

总结:

        分析下来,一方面的原因是由于备库的mrp高并行导致的日志应用慢,但另一方面,我们也需要确认这种对于备库应用延迟要求这么高(延迟要小于1秒)的业务放在备库是否合理,跟应用沟通当前的业务模块是先在主库插入数据,然后立马通过备库查询数据是否插入成功,所以才会对备库的延迟要求这么高,我想说的是,这么一个实时的业务查询放在备库其实是非常不合理的,因为主备之间同步,即使现在的网络,存储性能已经发展到很高的水平,但依然很难做到主备之间完全实时的同步,所以我们建议对于这种时间要求极高的实时查询,还是要通过主库进行访问

 

问题解决:

        1 降低MRP进程的并行度,减少并行进程过多导致的通信损耗,提高备库的日志应用速度

        2 应用层面对于这种时间要求极高的实时查询,要通过主库进行获取,不应该通过备库进行获取

 

 

 

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

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

相关文章

2022(二等奖)C2464植物保护管理系统

作品介绍 一、需求分析 1. 应用背景 森林是陆地生态系统的主体&#xff0c;是人类生存与发展的物质基础。以森林为主要经营对象的林业&#xff0c;不仅承担着生态建设的主要任务&#xff0c;而且承担着提供多种林产品的重大使命。进入21世纪&#xff0c;人类正在继农业文明和…

libevent(12)bufferevent的基础知识

一、bufferevent的基本概念 bufferevent 是 libevent 中的一个事件缓冲 IO&#xff0c;内部实现了基本 socket recv/send 操作 &#xff0c;用户只需要调用 bufferevent 的 API 即可实现数据的读写。 &#xff08;1&#xff09;缓冲区&#xff1a;每个 bufferevent 都有一个读…

Effective第三版 中英 | 避免使用终结方法和清理方法

文章目录 Effective第三版前言避免使用终结方法和清理方法&#xff08;Avoid finalizers and cleaners&#xff09;总结 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。…

基于SpringBoot+vue的家乡特色推荐系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【C语言督学训练营 第十五天】常用的查找算法----顺序查找、二分查找、二叉排序树

文章目录 前言一、顺序查找1,思想2.代码实战 二、二分查找1.思想2.代码实战 三、二叉排序树1.建树思想2.删除节点思想3.代码实战 考研真题实战 前言 本篇博客会介绍到数据结构中常用到的查找算法&#xff0c;合理的使用查找算法可以让我们很轻松找到自己想要的答案。本小节必须…

Java异常面试题

什么是Java异常机制 Java异常机制是java语言为我们提供一种异常处理机制&#xff0c;在java语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出这个异常对象&#xff0c;程序发生异常情况之后程序会抛出封装了错误信息的异常对象&#xff0c;程序…

python-线性规划

线性规划&#xff1a;定义&#xff1a;1 线性规划&#xff08;Linear programming,简称LP&#xff09;&#xff0c;是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支&#xff0c;是辅助人们进行科学管理的一种数学方法&#xff0c;是研究线性约束条件下线性…

WPF 零基础入门笔记(2):控件模板+数据模版

文章目录 文章合集地址WPF控价模版解决重复嵌套标签书写的问题实战 WPF数据绑定解决界面和业务数据沟通的问题 WPF数据模版数据模板解决数据的样式设置&#xff08;以CellTemplate为例&#xff09;数据模板和控件模板的区别ItemTemplate 元素模板ItemTemplate是用于绝大部分控件…

CAT1模块 EC800M HTTP使用总结记录

分享记录一下 CAT1 模块EC800 HTTP 协议使用流程 ...... by 矜辰所致目录 前言一、基础说明1.1 CAT1 与 4G1.2 EC800M 模块1.3 HTTP 二、开始使用2.1 硬件设计部分2.2 模块上电流程2.3 PDP 上下文2.3.1 什么是 SGSN 和 GGSN &#xff1f; 三、 HTTP 流程3.1 客户端3.1.1 PDP 上…

UFS 13 - Logical Unit Management

UFS 13 - Logical Unit Management 1 Introduction2 Logical Unit features3 Logical Unit Configuration 基于UFS 3.1 标准文档阐述 UFS 1-UFS架构简介1 UFS 2 -UFS架构简介2 UFS 3 - UFS RPMB UFS 4 - UFS Boot UFS 5 - UFS UIC Layer: MIPI M-PHY UFS 6 - UAP – SCSI Comma…

机器人工程创新类课程补充说明-2023-2

仅供参考 之前一篇&#xff1a;机器人工程创新类课程补充说明-2023- 自主学习→自主研究→自主创新&#xff0c;这是一个循序渐进的过程&#xff0c;着急没用的&#xff0c;大部分学生&#xff0c;都卡在第一个阶段&#xff0c;自主学习的效率比较低&#xff0c;并且成果不突出…

【C++ 程序设计】第 6 章:多态与虚函数

目录 一、多态的基本概念 &#xff08;1&#xff09;多态 &#xff08;2&#xff09;虚函数 &#xff08;3&#xff09;通过基类指针实现多态 &#xff08;4&#xff09;通过基类引用实现多态 &#xff08;5&#xff09;* 多态的实现原理 二、多态实例 三、多态的使用 …

docker启动的jenkins拉取gitee项目构建并部署

docker启动的jenkins拉取gitee项目构建并部署 docker 拉取jenkins https://hub.docker.com/r可以search不同的jenkins版本docker pull jenkins/jenkins创建挂载目录 /home/jenkins_home加权限chmod 777 /home/jenkins_homedocker run -di --namejenkins -p 9999:8080 -v /hom…

【json-server】centos线上环境搭建全攻略

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 安装json-server安装nvm安装node安装json-server 2️⃣ json-server 使用创建json数据踩坑&#xff1a;指定host关闭防火墙云后台修改安全组规则最终命令行 &#x1f6ec; 结论&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 开…

【虚拟机搭建-VMware设置固定IP】VMWare中CentOS如何设置固定IP【不成功手把手教学】

背景 在日常工作学习中&#xff08;比如博主在之前学习k8s过程中&#xff0c;windows本地搭建虚拟机&#xff0c;重启windows后&#xff09;虚拟机的IP会发生变化&#xff0c;所以该篇文章详细记录VMWare中CentOS如何设置固定IP 虚拟机安装 参考&#xff1a; https://rundr…

尚硅谷Docker2022版学习笔记(基础篇 上)

目录 一、Docker简介 1.1、是什么&#xff1f; 问题&#xff1a;为什么会有Docker出现&#xff1f; Docker理念 一句话 1.2、容器与虚拟机比较 传统虚拟机技术 容器虚拟机技术 容器虚拟机技术 1.3、去哪下&#xff1f; 二、Docker安装 2.1、前提说明 2.2、Docker的…

Rust语言从入门到入坑——(8)Rust泛型与特性

文章目录 0、引入1、泛型1.1、在函数中使用1.2、在结构体中使用 2、特性2.1 默认特性2.2 特性做参数2.3 特性做返回值2.4 有条件实现方法 3、总结 0、引入 泛型是一个编程语言不可或缺的机制。 C 语言中用"模板"来实现泛型&#xff0c;而 C 语言中没有泛型的机制&am…

MySQL数据库——备份与恢复

MySQL数据库——备份与恢复 一、数据备份的重要性二 、数据库备份的分类和备份策略1 数据库备份的分类2 数据库的备份策略3常见的备份方法 三、MySQL完全备份1 什么是完全备份2 完全备份的优缺点3 完全备份的方法 四、完全备份的操作1.物理冷备份与恢复2.mysqldump 备份与恢复3…

Arduino IDE 2.1.0 下安装ESP32

很久没玩Arduino了。新装了一台电脑&#xff0c;想重新捡起ESP32-WROOM-32开发板玩玩。官网上下了Arduino IDE 2.1.0&#xff0c;然后配置ESP32开发环境。 下载及安装Arduino IDE略过不谈。装完后还是老规矩&#xff0c;文件 -> 首选项&#xff0c;先把自定义板管理地址填入…

如何与西门子200 PLC建立连接

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲 与西门子200 PLC建立连接很简单&#xff0c;分为以下几步&#xff1a; 1.给S7-200PLC通电 按下图1-1所示连接PLC端口&#xff0c;然后给PLC供电&#xff0c;有直流24V和交流220V两种供电方式&am…