Oracle数据库故障处理-单块读hang存储异常导致hang死,数据库大量的db file seq read等待(p1 p2无反映)

news2024/11/24 14:49:47

1 故障描述

2023年1月27日下午接到业务反馈数据库存在大量的锁表阻塞信息,并且业务的页面以及数据库的一些查询均处于阻塞状态,简单的查询sql也需要查询很长时间且未返回结果,数据库hang状态。

问题现象2 

1 数据库进程无法杀除。

2 操作系统进程使用kill -9命令也无法进行删除,数据库无法进行重启,即使使用shutdown abort命令 也无法进行关闭数据库 。

3 ipcs -ma查看数据库共享内存段,发现状态为D但是无法杀除。

2 故障原因分析

2.1 数据库层面分析

   接到业务反馈后,第一时间登录数据库使用如下语句查询数据库正在进行的事物以及会话select count(1) ,event from v$session group by event,发现大部分会话处于TX-INDEX CONTENTION,db file sequential read,read by Other session 等待状态,数据库处于hang状态无法进行事务处理,查询数据库alert日志未发现明显错误信息。

以下为对数据库等待的分析认知:

  1. TX-INDEX CONTENTION

enq: TX - index contention 常出现在高并发场景下,由于索引分裂产生的竞争等待。最常见的索引竞争一般发生在主键索引上,主键值从序列(sequence)中获取,每个事务都会生成一条新的记录,每条记录都要获得一个新的序列号,基于b tree 索引的右倾原则,操作基本都在最右边的叶节点上,都希望能够维护同一个内存内存,最典型的竞争形式。

索引 split 会导致 enq:TX-index contention 事件,经常性伴有 enq: TX - allocate ITL 等待,通过buffer busy waits 可确定是做 split 导致,因为在做 index split 时,会写 index 数据到 new buffer 里。

(数据库确实存在以sequence为主键的列作为主键的持续插入,但是将其调整为alter index  index_name rebuild online reverse;也无法进行解决 )

常规的解决方案:

1)Hash(散列)分区索引,优先考虑这种方式。

2)将索引重新创建为反向索引,缺点是无法 RANGE SCAN。

3) 如果索引关键字是从序列(sequence)生成的,则增加序列的高速缓存大小,默认是20,一般都要设置为 1W。

4) 定期 rebuild 索引来减轻这样现象,表特别大时做 rebuild 要慎重,对空间要求比较多。

参考:Troubleshooting ‘enq: TX - index contention’ Waits (Doc ID 873243.1)

从上述分析中可以知道对于sequence的主键索引容易右边倾斜,导致索引叶节点繁忙出现大量的enq: TX - index contention。

  1. db file sequential read

db file sequential read 事件有三个参数:file#,first block#, block count, 在oracle 10g里,此等待事件在归于 User I/O wait class 下面的. 处理db file sequential read 事件要牢牢把握下面三个主要思想:

1)oracle 进程需要访问的block不能从SGA 中获取,因此oracle 进程会等待block从I/O读到SGA

2)两个重要参数TIME_WAITED,AVERAGE_WAIT,是以单个session获取的

3)影响较大的db file sequential read 一般很像应用程序问题

Common Causes, Diagnosis, and Actions

db file sequential read 等待事件被SQL 语句初始化,主要从index,rollback(or undo) segments, tables(通过rowid访问表),control files 和data file headers中进行single-block read.

访问数据对象(table,index)总是会产生Physical I/o需求,当出现db file sequential read等待事件时,并不意味着数据库产生系统问题,基至它大量出现都不是一件坏事.真正要引起注意的是像enqueue 和latch free等待事件,它们总是引起系统性题的根源.并且它们使single-block(单块读取)变得因难了.

初步分析数据库hang死原因为数据库出现TX-INDEX CONTENTION等待,主键索引分裂导致数据库出现大量的hang

数据库大量出现 TX-INDEX CONTENTION等待从上述分析得知主键分裂索引导致,于是想将主键索引进行重建,将主键索引重建为反向键索引。

Alter index user.pk_gis_position rebuild reverse online;

 由于需要在线重建而且存在大量的inert语句导致锁死,于是希望将所有的insert语句进行kill,但是在进行kill数据库session的过程中发现进程无法被删除并且使用操作系统命令kill -9也无法进行数据库进程清除。

数据库完全hang死且通过sqlplus /as sysdba的方式也无法进入数据库进行管理,于是和管理员商定将数据库进行重启。

 sqlplus  -prelim  / as sysdba  

shutdown abort

 但是等待好久数据库值的local=no以及数据库的dbw0和dbw1进程均无法正常退出,使用kill -9命令也无法进行清除,使用ipcs –ma查询共享信息并且使用ipcrm 删除则提示共享内存已经不存在。重启数据库失败数据库根本无法进行停止 。

联系管理员只能在将主机进行重启,杀掉hang死的数据库进程,将主机重启后,使用HA命令手动进行挂在并启动数据库 ,发现 没过一会数据库继续hang死并进入了死循环,于是在启动数据库时未开启监听,将主键索引进行反向化,程序启动时TX等待消失,但是数据库还是存在大量的db file sequential read read by other session等待。

 于是通过如下命令查询数据库等待的p1和p2参数,发现P1和P2参数一致未变化。表现在39号文件和33号文件对应的数据库目录为/oracle/oradata2/,此时数据库文件的单块读取一直hang死。

2.2 主机层面分析

  在数据库层面已经无法进行处理问题,查询主机的相关信息errpt信息如下:

 

发现在hdisk3的盘出现了大量的 PH和IH错误,且通过分析HDISK3大部分都存在于oradata2.

且通过IOSTAT查询发现数据库的IO停滞 。

 

1 hdisk2磁盘使用率接近100%,但是不存在kb_read.

2 数据库大部分的io等待时间集中在39号文件和33号文件,而文件都集中存储在oradata2,正是hdisk3的主要分区。

3 数据库大部分等待均在IO,但是iostat确看不到IO流动 ,而且涉及到数据文件的进程全部hang死无法进行删除等操作。

数据库的读写io一直为0。很诧异。初步判断HDISK3对应的盘出现问题导致数据库数据文件39和33号文件单块读hang死。

验证判断:

在数据库关闭的条件下将39号数据文件cp到其他目录发现也是hang死。

3 故障处理过程

从上述分析原因可知存储单块读hang死,于是和管理员分析决定,建立新的存储避开hdisk3,并使用rman方式进行数据库应急恢复。

使用RMAN进行数据库恢复。并将数据文件更换到新的存储避开hdisk3

bplist -C appp2 -t 4 -l -R /|more

bplist -C appp2 -t 4 -l -R /|more

-rw-rw---- oracle      oinstall      8388608 Jan 27 09:03 /cntrl_54244_1_1127206988

-rw-rw---- oracle      oinstall     7002880K Jan 27 09:00 /al_54242_1_1127206828

-rw-rw---- oracle      oinstall     6853632K Jan 27 09:00 /al_54243_1_1127206828

-rw-rw---- oracle      oinstall      8388608 Jan 27 03:03 /cntrl_54241_1_1127185398

-rw-rw---- oracle      oinstall     5498880K Jan 27 03:00 /al_54239_1_1127185227

-rw-rw---- oracle      oinstall     4637440K Jan 27 03:00 /al_54240_1_1127185227

-rw-rw---- oracle      oinstall      8388608 Jan 26 22:00 /cntrl_54238_1_1127167227--------------------1111

-rw-rw---- oracle      oinstall   1018429440 Jan 26 21:59 /al_54236_1_1127167169

-rw-rw---- oracle      oinstall   1009778688 Jan 26 21:59 /al_54237_1_1127167169

-rw-rw---- oracle      oinstall      8388608 Jan 26 17:03 /cntrl_54235_1_1127149386

-rw-rw---- oracle      oinstall   1018429440 Jan 26 17:02 /al_54233_1_1127149344

-rw-rw---- oracle      oinstall    101187584 Jan 26 17:02 /al_54234_1_1127149344

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RESTORE CONTROLFILE FROM 'cntrl_54109_1_1126602188';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

RMAN> RUN {

2> ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

3> ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

4> SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

5> RESTORE CONTROLFILE FROM 'cntrl_54109_1_1126602188';

6> RELEASE CHANNEL ch00;

7> RELEASE CHANNEL ch01;

8> }

using target database control file instead of recovery catalog

allocated channel: ch00

channel ch00: sid=525 devtype=SBT_TAPE

channel ch00: Veritas NetBackup for Oracle - Release 7.5 (2012020807)

allocated channel: ch01

channel ch01: sid=524 devtype=SBT_TAPE

channel ch01: Veritas NetBackup for Oracle - Release 7.5 (2012020807)

sent command to channel: ch00

sent command to channel: ch01

Starting restore at 28-JAN-23

channel ch01: skipped, autobackup already found

channel ch00: restoring control file

channel ch00: restore complete, elapsed time: 00:00:44

output filename=/oracle/oradatadb/control01.ctl

output filename=/oracle/oradatadb/control02.ctl

output filename=/oracle/oradatadb/control03.ctl

Finished restore at 28-JAN-23

released channel: ch00

released channel: ch01

RMAN> mount database;

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RESTORE DATABASE;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RESTORE CONTROLFILE FROM 'cntrl_54238_1_1127167227';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

214723

2023/01/28 19:50恢复到20号

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RECOVER DATABASE UNTIL SEQUENCE 214723;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

2023/1/22 23:28:00       2023/1/22 23:42:18  214837

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RECOVER DATABASE UNTIL SEQUENCE 214838;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

2023/1/24 23:35:42         2023/1/24 23:51:54         214963

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RECOVER DATABASE UNTIL SEQUENCE 214964;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

2023/1/27 8:04:52  2023/1/27 9:00:25  215121

-rw-rw---- oracle      oinstall      8388608 Jan 27 09:03 /cntrl_54244_1_1127206988

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RESTORE CONTROLFILE FROM 'cntrl_54244_1_1127206988';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=NBU01,NB_ORA_CLIENT=appp2';

RECOVER DATABASE UNTIL SEQUENCE 215122;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

alter database open resetlogs;

lsnrctl start listener_nmmpdb

将数据库使用rman恢复完成后,数据库运行正常。

4 故障解决建议

通过上述对故障的分析,问题主要出现在hdisk3存储在进行数据库单块读时hang住,数据库进行随之hang死,建议对数据库存储进行检查分析。

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

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

相关文章

也许你应该学学 postman了

使用 最简单的方法就是直接在浏览器中复制 Copy as cURL ,然后把数据导入 postman,然后 send ,收工。 我们这里拿 知乎首页 举例 在对应的请求下复制 cURL 打开 postman , 点击左上角的 Import , 选择Paste Raw Tex…

如何使用逻辑分析仪,解析通信数据

如何使用逻辑分析仪,解析通信数据使用工具:逻辑分析仪(几十块买的裸板),软件是:PulseView一、在开发或者移植某一个模块时,你可能遇到这样的问题:二、逻辑分析仪的使用使用工具&…

二级C语言操作例题(四十)

一、程序填空题 在此程序中,函数fun的功能是:在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,若找不到相同的字符则不做任何处理。 例如,若s所指字符串”baacda”,中c的字符为…

JavaWeb-JavaScript API

目录DOM获取元素事务操作操作元素获取/修改元素属性获取/修改表单元素属性实现一个全选效果,主要是操作input的checked属性获取/修改元素样式点击放大字体夜间模式(关灯开灯)操作节点新增节点删除节点案例-猜数字案例-表白墙DOM DOM 全称为 Document Object Model.…

【Spring6源码・MVC】请求处理流程源码解析

上一篇《【Spring6源码・MVC】初始化registry,完成url和controller的映射关系》我们知道,在IOC容器加载的同时,初始化了registry这个HashMap,这个HashMap中存放了请求路径和对应的方法。当我们请求进来,会通过这个regi…

合并两个有序链表-力扣21-java双百方案

一、题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 [1,2,4], l2 [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 [], l2 []输出&#xff1…

C++中编译静态库与动态库

1.库的理解库就是写好的现有的,成熟的,可复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,是预编译代码的集…

【Vue3】element-plus中el-tree的递归处理赋值回显问题

目录一:先获取所有权限tree二:在获取所有该角色能有的权限tree三:递归处理勾选tree节点由于项目是从0-1开始构建的 rbac都需要重新构建对接 所以涉及到了权限管理和菜单管理 一级菜单包含多个二级菜单 若二级不全选,则一级显示 半…

scipy超几何函数

文章目录hyp2f1广义超几何函数其他超几何函数hyp2f1 当c不是0,−1,⋯0,-1,\cdots0,−1,⋯时&#xff0c;对于∣z∣<1|z|<1∣z∣<1&#xff0c;超几何函数可表示为 2F1(a;b;c;z)∑n0∞a(n)b(n)c(n)znn!_2F_1(a;b;c;z)\sum^\infty_{n0}\frac{a^{(n)}b^{(n)}}{c^{(n)}}\…

TOOM告诉你企业舆情监测的重要性,企业舆情监测的意义

企业舆情监测是一种有效的企业管理手段&#xff0c;能够帮助企业了解舆情信息&#xff0c;从而更好地管理企业、保护企业利益&#xff0c;TOOM告诉你企业舆情监测的重要性&#xff0c;企业舆情监测的意义。 一、企业舆情监测的重要性 声誉管理&#xff1a;通过对企业在线和离…

pixhawk2.4.8使用调试记录—APM固件

目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查&#xff08;每一项都非常重要&#xff09;12 飞行经验四、遇到的问…

ESP8266_Linux环境搭建

工具链设置 适用于 Linux 的 ESP8266 工具链可从 Espressif 网站下载&#xff1a; 对于 64 位 Linux&#xff1a; https://dl.espressif.com/dl/xtensa-lx106-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz 对于 32 位 Linux&#xff1a; https://dl.espressif.com/dl/xten…

web自动化使用xpath轴定位

目录 XPath 轴&#xff08;Axes&#xff09; 一、定义&#xff1a;轴可定义相对于当前节点的节点集。 二、语法&#xff1a; 一、ancestor 选取当前节点的所有先辈(父&#xff0c;祖父等) 二、ancestor-or-self&#xff1a; 选取当前节点的所有先辈&#xff08;父、祖父等…

QT(11)- QThread

1 简介 QThread&#xff1a;具有可选事件循环的低级 API QThread是 Qt 中所有线程控制的基础。每个QThread实例表示并控制一个线程。 QThread可以直接实例化&#xff0c;也可以子类化。实例化QThread提供了一个并行事件循环&#xff0c;允许在辅助线程中调用QObject插槽。对 …

Leetcode力扣秋招刷题路-0037

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字…

React hooks之useEffect《类比Vue来记忆》(二)

系列文章目录 下面是正文 文章目录系列文章目录前言一、useEffect的三种形态1.useEffect不传第二个参数代码如下&#xff1a;效果图如下&#xff1a;2.useEffect第二个参数传 []代码如下&#xff1a;效果图如下&#xff1a;3.useEffect第二个参数传 [num]代码如下&#xff1a;效…

java图

1 图基本介 1.1 为什么要有图 前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时&#xff0c; 这里我们就用到了图。 1.2 图的举例说明 图是一种数据结构&#xff0c;其中结点可以具有零…

VL10 使用函数实现数据大小端转换

一、function和task都是为了模块化、结构化设计&#xff0c;主要还是将重复性的功能封装起来方便调用。可以对返回值类型和范围不进行定义&#xff0c;默认值为reg型并且位宽为1变量类型说明 比如integer ifunction(其功能同之前的module模块类似)通常是用来描述组合逻辑&#…

Hi3861编译烧录更快捷

HUAWEI DevEco Device Tool是华为面向智能设备开发者提供的一站式集成开发环境。划重点&#xff0c;DevEco Device Tool 3.1 Beta2又上新技能啦——支持纯Windows环境开发Hi3861&#xff0c;显著提升编译、烧录效率&#xff0c;同时还带来了更多实用的功能及模板&#xff0c;为…

介绍项目前期调研、需求分析阶段的工作

title: 介绍项目前期调研、需求分析阶段的工作 date: 2019-07-07 16:06:00 tags: 需求分析前期调研 categories:架构 立项阶段 所谓立项就是公司内部进行研究、讨论决定要不要做这个事情&#xff0c;通常立项分成两个大类&#xff1a; 项目立项 相对比较简单&#xff0c;需…