【Oracle生产运维】数据库服务器负载过高异常排查处理

说明

在Oracle数据库运维工作中,经常会遇到Oracle数据库服务器平均负载(load average)突然异常升高,如果放任不管,严重的情况下会出现数据库宕机、服务器重启等重大故障。因此,当发现数据库服务器平均负载异常高的时候,必须予以重视,并立即开展处理工作。

很多刚工作或者是没这方面处理经验的同学可能遇到这种情况就会开始慌张,不知从何下手,无法快速定位出引起负载异常的原因。

下面介绍我在工作中常用的排查思路供大家参考。截图的结果皆在实验环境中截取,与实际生产环境有较大出入,只作为操作演示。

1 负载过高现象

巡检发现、监控平台或者在操作系统中执行命令,显示load average值异常过高。

Linux常用的load average监控命令:

[oracle@oracle11g ~]# sar -q 1 5

此命令可以查看当前的平均负载,以及一分钟以来、五分钟以来和十五分钟以来的平均负载。

引起Oracle数据库服务器负载异常增高的原因有很多不同情况,以下是比较常见的情况:

  • 大量排序、SQL解析、慢SQL引起CPU过高;
  • 大量直接路径读、全表扫描、并发读写引起IO繁忙。

2 确认高负载类型

需要确认负载突然异常增高是CPU还是IO或者共同引起的,缩小问题范围,为下一步定位具体原因做准备。

登录数据库服务器,切换到orace用户。

2.1 检查平均负载

[oracle@oracle11g ~]$ sar -q 1 5
Linux 2.6.32-642.el6.x86_64 (oracle11g)         06/09/2024      _x86_64_        (1 CPU)

05:34:11 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
05:34:12 AM         0       382      0.49      0.43      0.47
05:34:13 AM         0       382      0.49      0.43      0.47
05:34:14 AM         0       382      0.49      0.43      0.47
05:34:15 AM         0       382      0.49      0.43      0.47
05:34:16 AM         0       382      0.49      0.43      0.47
Average:            0       382      0.49      0.43      0.47

说明:

  • runq-sz:运行队列,也就是等待运行的进程数;
  • plist-sz:进程创建的总数,包括线程;
  • ldavg-1:最后1分钟的平均负载;
  • ldavg-5:最后5分钟的平均负载;
  • ldavg-15:最后15分钟的平均负载。

如果runq-sz值很高,表明可能是CPU资源使用率过高引起的,若值低可能是IO过高引起的。

这里只是一个初步判断,需要执行下面的命令确认猜测。

2.2 检查CPU使用率

1)执行top命令查看所有进程的cpu和内存使用情况

[oracle@oracle11g ~]$ top -c

image.png

主要观察排在前几位的进程的%CPU,一般当负载异常时,前面两三个进程的%CPU会在100%。

top命令也可以看到平均负载load average的情况。

2)执行iostat命令查看CPU平均利用率

image.png

说明:

  • %user:用户空间的cpu使用率;
  • %idle:空闲的cpu。

如果%idle过高,说明CPU使用率过高。

2.3 检查I/O传送速率

1)查看IO等待

%iowait为CPU等待IO的百分比,如果非常高,则说明IO有瓶颈。

[oracle@oracle11g ~]$ iostat -c 1 5
Linux 2.6.32-642.el6.x86_64 (oracle11g)         06/09/2024      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.05    0.00    0.16    0.10    0.00   99.70

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    1.01    0.00    0.00   98.99

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    1.00    1.00    0.00   98.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    1.02    0.00   98.98

2)查看IO速率

[oracle@oracle11g ~]$ sar -b 1 5
Linux 2.6.32-642.el6.x86_64 (oracle11g)         06/09/2024      _x86_64_        (1 CPU)

05:42:33 AM       tps      rtps      wtps   bread/s   bwrtn/s
05:42:34 AM     12.12      4.04      8.08    129.29     97.98
05:42:35 AM     12.12      0.00     12.12      0.00    114.14
05:42:36 AM      8.08      0.00      8.08      0.00     97.98
05:42:37 AM     15.15      4.04     11.11    129.29    130.30
05:42:38 AM     43.43      7.07     36.36    226.26    502.02
Average:        18.18      3.03     15.15     96.97    188.48

说明:

  • tps:每秒钟的I/O操作总数。这个值如果持续很高,可能表明磁盘I/O非常繁忙;
  • rtps:每秒钟的读操作数。高读操作数可能表明有大量的数据被读取;
  • wtps:每秒钟的写操作数。高写操作数可能表明有大量的数据被写入;
  • bread/s:每秒钟从物理设备读入的数据量,单位为 块/s。块的大小通常为512字节;
  • bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s;
  • rb/c 和 wb/c:分别是每次读取和写入操作的平均块数。如果这个值很低,可能表明有许多小的I/O请求,这可能导致磁盘性能问题。

3 定位问题,找出引起高负载的SQL语句

Oracle数据库问题的大部分原因基础都是由SQL语句引起的。

假设经过上面的排查,确定为CPU使用率高引起的高负载,下面通过几个脚本定位到引起CPU使用率过高的SQL语句。

3.1 直接找到引起高负载的TOP SQL

登录数据库,检查近xx分钟的资源使用率(CPU、IO)TOP5的SQL:

SQL>
select ash.sql_id,
       sum(decode(ash.session_state,'on cpu',1,0)) "cpu",
       sum(decode(ash.session_state,'waiting',1,0)) -
       sum(decode(ash.session_state,'waiting',decode(en.wait_class,'user i/o',1,0),0)) "wait",
       sum(decode(ash.session_state,'waiting',decode(en.wait_class,'user i/o',1,0),0)) "io",
       sum(decode(ash.session_state,'on cpu',1,1)) "total"
  from v$active_session_history ash,v$event_name en
 where sql_id is not null and en.event#=ash.event# and ash.sample_time > sysdate -&min/(24*60)
 group by ash.sql_id
 order by sum(decode(ash.session_state,'on cpu',1,1)) desc;

根据sql_id找到对应的sql_text:

SQL> select SQL_TEXT from v$sqltext where sql_id = '&sql_id' order by piece;

3.2 根据进程号找出SQL

前面查看cpu负载的时候使用了top命令,输出的信息中就包含有进程号PID,根据这个PID可以定位到具体是哪条SQL语句。

image.png

将异常的PID代入Oracle的几个常用的性能视图:

SQL>
set long 999999999999999999
set pages 200
select st.sql_id,st.sql_test
  from v$sqltext st,v$session se,v$process p
 where st.sql_id = se.sql_id
   and se.paddr = p.addr
   and p.spid = '&PID'
 order by st.piece;

得到的sql_test即为引起CPU高负载的SQL语句。

3.3 根据等待事件判断找出SQL

此方法需要对常见的等待事件比较熟悉。

查看当前正在执行的会话和相应等待事件:

SQL>
set lines 300
col machine for a20
col username for a20
col event for a30
col program for a25
col state for a10
select inst_id,
	   sid,
	   serial#,
	   sql_id,
	   sql_hash_value shv,
	   event,
	   username,
	   program,
	   machine,
	   blocking_instance bi,
	   blocking_session bs,
	   seconds_in_wait wait_m
  from gv$session
 where (event not like '%dbms%' and event not like '%gcs remote%' and event not like '%mon timer%'
   and event not like '%SQL Net%' and event not like '%Streams AQ%' and event not like '%jobq slave wait%'
   and event not like '%ASM background timer%' and event not like '%DIAG idle wait%'
   and event not like '%VKTM logical idle Wait%' and event not like '%ges remote message%' 
   and event not like '%Space Manager slave idle wait%' and event not like '%class slave wait%' 
   and event not like '%wait for unread  message on broadcast channel%' and event not like '%pmon timer%')
   and status = 'ACTIVE' and wait_class != 'idle'
   and sql_id is not null   
 order by event,sql_id desc; 

主要看出现大量重复的sql_id和event。

注意,当同时存在大量与CPU和IO相关的等待事件时,应根据前面排查的结果侧重分析。即,当明确了是CPU问题时,就应带看CPU相关的等待事件对应的sql_id。

3.4 查看ASH或AWR报告

生成ASH报告或AWR报告需要将快照时间段设置在高负载期间。

当负载异常持续事件是短时间(10-20分钟)时,生成ASH报告。当负载异常持续事件是长时间(1小时以上)时,生成AWR报告。

分析报告也是需要对等待事件比较熟悉,此处就不对ASH报告和AWR报告的分析方法做说明,请自行查阅资料。

报告生成方法:

------ASH
# su - oracle
$ cd
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/ashrpt.sql

------AWR
# su - oracle
$ cd
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/awrrpt.sql

报告生成的目录在oracle用户家目录下。

4 问题处理

找出引起高负载的问题SQL语句后,反馈给业务或应用或开发进行检查处理,同时也需要配合他们进行分析。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell编程(三)—— 控制语句

程序的运行除了顺序运行外,还可以通过控制语句来改变执行顺序。本文介绍bash的控制语句用法。 一、条件语句 Bash 中的条件语句让我们可以决定一个操作是否被执行。结果取决于一个包在[[ ]]里的表达式。 bash中的检测命令由[[]]包起来,用于检测一个条…

「网络原理」三次握手四次挥手

🎇个人主页:Ice_Sugar_7 🎇所属专栏:计网 🎇欢迎点赞收藏加关注哦! 三次握手&四次挥手 🍉连接管理🍌三次握手🍌意义🍌四次挥手🍌TCP 状态转换…

目标检测算法YOLOv9简介

YOLOv9由Chien-Yao Wang等人于2024年提出,论文名为:《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》,论文见:https://arxiv.org/pdf/2402.13616 ;源码见: https://github.com/W…

Hexo+Github搭建个人博客教程

hexo官网:https://hexo.io/zh-cn/ butterfly 主题设置:https://butterfly.js.org/ GitHub地址:https://github.com/jerryc127/hexo-theme-butterfly 基础命令 初始化博客命令:hexo init “文件名” 开启本地服务(本…

linux centos consul1.15.2一键安装部署

consul原理、作用、安装相关内容 一、理论部分二、安装下载版本地址三、安装consul服务 一、理论部分 1、consul的原理 Consul的原理及作用可以归纳为以下几点: ①、基于Gossip协议的通信:Consul使用了基于Gossip协议的Serf实现来进行通信。 Gossip协议…

C语言 | Leetcode C语言题解之第143题重排链表

题目: 题解: struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow head;struct ListNode* fast head;while (fast->next ! NULL && fast->next->next ! NULL) {slow slow->next;fast fast->next-&g…

Python酷库之旅-开启库房之门

目录 一、库的定义 二、库的组成 三、库的分类 四、如何学好Python库? 五、注意事项 六、推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、Python魔法之旅 5、 博客个人主页 一、库的定义 在Python中,库(Library)是一个封…

两台电脑通过网线直连共享数据(超详细)- 我的实践记录

原文链接 按照原文的操作,成功通过直连网线连接了两台windows电脑并共享传输数据。 ping不通可能是防火墙没关闭导致的,但是完全关闭防火墙又不安全。 那么有没有不关闭防火墙,能够上网,又能直连另一台电脑呢? 我们…

javaweb请求响应+@ResponseBody注解

这里用了一款接口测试软件postman 简单参数 SpringBoot方式 简单参数:参数名与形参变量名相同,定义形参即可接收参数。 请求参数名与方法形参变量名相同 会自动进行类型转换 package com.example.springbootwebreqresp.Controller;import org.springframework.w…

SSM框架超详细讲解

介绍SSM框架 一、什么是SSM框架? SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spr…

下拉框数据被遮挡 且 后续数据无法下拉的 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法3.1 添加空白版2.2 调整z-index2.3 父容器的溢出属性2.4 调整样式属性4. 效果图前言 小程序使用的是Uniapp,原理都差不多,索性标题就不标注Uniapp(小程序) 对于该问题调试了一个晚上,最终解决,对此记录下来 1. 问题所示 执…

Python中的数据可视化:分组柱状图

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化: 分组柱状图 选择题 关于以下代码输出结果的说法中正确的是? import seaborn as sns import matplotlib.pyplot as plt import pandas as pd data…

Vue2基础:.sync修饰符的使用,认识,作用,本质案例演示,实现父子之间的通信。

.sync的作用: 可以实现子组件与父组件数据的双向绑定,简化代码。 与v-model的不同点,prop属性名可以自定义,不要一定要用value. .sync的本质: 就是:属性名和update:属性名合写。 下面我们进行代码演示…

Kimichat使用案例009:添加常用语(使用技巧)

文章目录 一、介绍二、常用语操作过程三、语言设置四、操作一、介绍 使用kimichat进行翻译,通常会使用提示语:翻译成中文。如果每天都要大量使用这一个功能,可以把提示语添加成常用语,直接点击调用即可,就不用再一次次重复输入了。 二、常用语操作过程 在kimichat的提示语…

wordpress入门教程,wordpress快速入门,wordpress教程视频

WordPress是一款广受欢迎的开源博客平台和内容管理系统,自2003年诞生以来,它不断发展和完善,如今已成为互联网上众多网站、博客的首选构建工具。 1、搜索“方圆资源网官网” WordPress教程的资源非常丰富,只要找到合适的途径&…

3 数据类型、运算符与表达式-3.5 字符型数据-3.5.2 转义字符

3.5.2 转义字符 #include <stdio.h>main() {int a, b, c;a 5;b 6;c 7;printf("ab c\tde\rf\n");printf("hijk\tL\bM\n");return 0; }

Vue18-列表渲染

一、v-for渲染列表 1-1、遍历数组&#xff08;用的多&#xff09; 1-2、key属性 让每一个<li>都有一个唯一的标识&#xff01; 1、写法一 只有用了遍历的方式(v-for)来生成多个同样结构的数据&#xff0c;必须给每个结构取一个唯一的标识。 2、写法二 或者&#xff1a;…

CSS id选择器

目录 任务描述 相关知识 id选择器 id选择器语法 类选择器与id选择器的区别 编程要求 任务描述 在本关中&#xff0c;你将通过id选择器的方式完成页面菜单栏样式布局&#xff0c;栏目导航等任务。 完成任务之后&#xff0c;基本页面效果如下&#xff1a; 动态效果如下&am…

使用 PlatformIO 将文件上传到 ESP32-S3 的 SPIFFS 文件系统

PlatformIO环境 将文件上传到 ESP32-S3 的 SPIFFS 文件系统 介绍&#xff1a; PlatformIO 是一个流行的开发平台&#xff0c;用于编写、构建和上传嵌入式项目。ESP32-S3 是 Espressif 推出的一款功能强大的嵌入式开发板&#xff0c;具有丰富的外设和通信接口。本文将介绍如何…

【差分数组】1674. 使数组互补的最少操作次数

本文涉及知识点 差分数组 LeetCode1674. 使数组互补的最少操作次数 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit 。每一次操作&#xff0c;你可以将 nums 中的任何整数替换为 1 到 limit 之间的另一个整数。 如果对于所有下标 i&#xff08;下标从 0 开始&…