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

news2025/2/24 18:21:17

说明

在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语句后,反馈给业务或应用或开发进行检查处理,同时也需要配合他们进行分析。

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

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

相关文章

热门开源项目推荐:智谱GLM-4-9B和ChatGLM3-6B

目录 热门开源项目推荐:智谱GLM-4-9B和ChatGLM3-6B 1.引言 1.1 开源文化简介 1.2 开源项目的重要性 1.3 博客目的和读者价值 2.什么是开源项目? 2.1 开源定义 2.2 开源许可证类型 2.3 开源社区的作用 3.为什么程序员应该关注开源项目&#xff…

高精度减法的实现

这是C算法基础-基础算法专栏的第八篇文章,专栏详情请见此处。 引入 上次我们学习了高精度加法的实现,这次我们要学习高精度减法的实现。 高精度减法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的…

WPF中的隧道路由和冒泡路由事件

文章目录 简介:一、事件最基本的用法二、理解路由事件 简介: WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒…

【建设方案】文档管理系统实现方案(Word原件)

文档管理系统建设的主要意义在于提升组织内部文档管理的效率、安全性和便利性。首先,通过集中存储和分类管理,文档管理系统能够迅速检索和共享文件,大幅提高工作效率。其次,系统内置的权限控制功能确保文档的安全,防止…

OpenStack入门体验及一键部署

OpenStack入门体验 技能目标: 了解云计算概念 了解OpenStack 了解OpenStack的构成 会OpenStack单机环境一键部署 从控制台认识OpenStack各项功能会 通过OpenStack控制台创建云主机 什么是云计算 云计算(cloudcomputing)是一种基于网络的超级计算模式&a…

Nginx负载均衡之长连接负载均衡

当客户端通过浏览器访问 HTTP 服务器时,HTTP 请求会通过 TCP 协议与 HTTP 服务器建立一条访问通道,当本次访问数据传输完毕后,该 TCP 连接会立即被断开,由于这个连接存在的时间很短,所以 HTTP 连接也被称为短连接。 …

Python学习打卡:day06

day6 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day648、函数综合案例49、数据容器入门50、列表的定义语法51、列表的下标索引1、列表的下标(索引)2、列表的下标&#xff08…

2024 年最新使用 Node 搭建QQ开放平台官方 QQ 频道机器人详细教程(更新中)

注册 QQ 开放平台账号 QQ 开放平台是腾讯应用综合开放类平台,包含 QQ 机器人、QQ 小程序、QQ 小游戏 等集成化管理,也就是说你注册了QQ 开放平台,你开发 QQ 机器人还是 QQ 小程序都是在这个平台进行部署上线和管理。 如何注册 QQ 开放平台账…

代码随想录:回溯20-21

51.N皇后 题目 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解…

WDF驱动开发-同步技术

使用自动同步 基于框架的驱动程序中几乎所有的代码都驻留在事件回调函数中。 框架会自动同步驱动程序的大部分回调函数,如下所示: 框架始终将 常规设备对象、 功能设备对象 (FDO) 和 物理设备对象 (PDO) 事件回调函数同步,以便每个设备一次…

内网安全【2】-域防火墙

1.判断什么时候用代理 2.判断什么时候用隧道 3.判断出网和不出网协议 4.如何使用代理建立节点并连接 5.如何使用隧道技术封装协议上线 6.判断哪些代理或隧道情况选择放弃 代理技术:解决网络通讯不通的问题(利用跳板机建立节点后续操作)(网络设置导…

【SpringBoot】深入分析 SpringApplication 源码:彻底理解 SpringBoot 启动流程

在黄昏的余晖里,梦境渐浓,如烟如雾。心随星辰,徜徉远方,岁月静好,愿如此刻般绵长。 文章目录 前言一、SpringBoot 应用二、SpringApplication2.1 SpringApplication 中的属性2.2 SpringApplication 的构造器2.3 Sprin…

高压消防接力泵的工作原理_鼎跃安全

森林消防工作是一项艰巨的任务,森林火灾具有蔓延快、控制难和燃烧剧烈等特点;同时,森林具有复杂的峡谷、山坡和陡峭等复杂情况,传统的消防设备难以深入火场,高压消防接力泵通过便携灵活性,深入火场助力消防…

【TF-IDF算法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版 1.环境要求 1.1 软件要求 要顺利运行本代码,请按照以下系统要求进行配置 已经测试过的系统 Linux Ubuntu 22.04.5 kernel version 6.7其他系统可能出现系统兼容性问题。 最低要求 该要求仅针对标准模…

C++的map

作用&#xff1a; 映射&#xff0c;相当于python的字典&#xff0c;使用一个key来寻找value&#xff0c;m[key]value; 生成&#xff1a; map<int,string> m;//无参生成&#xff0c;key是int类型&#xff0c;value是string类型 map<int,string> m{{1,"hello…

手把手教你入门vue+springboot开发(三)--登录功能后端

文章目录 前言一、redis安装二、后端代码1.修改application.yml文件2.增加utils文件3.增加Result类4.修改UserController类5.修改UserMapper类6.修改UserService和UserServiceImpl类7.增加LoginInterceptor类8.增加WebConfig类9.修改pom.xml文件 前言 前两篇我们用vuespringbo…

内网不能访问网站怎么办?

内网不能访问网站是在网络使用过程中常见的问题之一。当我们使用局域网连接时&#xff0c;有时候会遇到无法访问特定网站的情况。这可能是因为网络环境复杂&#xff0c;或者受到了某些限制。本篇文章将介绍一种解决内网不能访问网站问题的产品——天联组网。 天联组网是一款由…

非计算机专业可以考“软考”吗?

全国计算机软件水平考试对报名条件没有学历、资历、年龄以及专业等限制&#xff0c;非计算机专业的人员也可以报考。证书长期有效&#xff0c;考生可根据个人需求选择合适的级别和资格进行报考。报名方式包括网上报名和考生本人到指定地点报名两种。 考试范围 (1) 高级资格包括…

RS485和CAN电路中的TVS管选择

在RS485和CAN电路设计中&#xff0c;经常要考虑“静电和浪涌保护”&#xff0c;怎么选择TVS管&#xff0c;很少有人讲解。 1、先了解TVS管 TVS管有单向管和双向管&#xff0c;通常后缀为CA的是双向TVS管&#xff0c;只有字母A的是单向TVS管。见下图&#xff1a; 2、TVS选择依…