首页 > 数据库 >资源消耗类应急处理方法oracle

资源消耗类应急处理方法oracle

时间:2023-10-17 20:06:37浏览次数:38  
标签:process 数据库 消耗 id session sql oracle 应急 CPU

1.高资源消耗进程应急处理

现象描述

某个oracle process CPU使用率非常高。
某个oracle process MEM使用率非常高。

影响因素

暂无

解决方法

1、使用TOPAS观察哪个进程CPU使用率高,找出相关进程号,通过以下命令定位数据库SID号.
Select sid,sql_id,event,status from v$session where paddr in (select addr from v$process where spid=&进程号);
2、使用以下命令查看oracle会话使用内存超过100M的用户

set line 180
col MACHINE for a10
col PROGRAM for a25
col USERNAME for a15
select s.sid, s.serial#, s.username, s.machine, s.program,s.process, s.sql_id, p.pga_alloc_mem/1048576 size_m, p.spid
 from v$session s, v$process p where s.paddr=p.addr 
 and p.pga_alloc_mem>104857600 order by 7 desc;

3、对相关进程和会话进行分析,决定是否kill.

2.IO非常高

现象描述

数据库登陆缓慢,或者根本不可用,无法登陆数据库进行查询等操作。表空间满或者文件系统满了(一般情况下不会发生,因为我们有监控告警)。这里主要是针对异常sql引起数据库hang的情况

影响因素

分析IO高的原因,例如:
A、大量的并行;
B、长事务;
C、物理读高

解决方法

在操作系统使用命令: ps -ef|grep LOCAL=NO |awk ‘{print $2}’ |xargs kill -9
kill所有非本地进程,然后检查系统资源状态,检查数据库状态

3.PGA使用过大

现象描述

影响SQL执行的效率

影响因素

PGA使用过大

解决方法

1、查询当前PGA使用大小:

select sum(pga_alloc_mem)/1048576/1024 size_gb from v$process ;

2.查询使用PGA较大的具体进程
例如以下语句可以查出具体占用内存大于100m的进程信息:(例如)

set line 180
col MACHINE for a10
col PROGRAM for a25
col USERNAME for a15
select s.sid, s.serial#, s.username, s.machine, s.program,s.process, s.sql_id, p.pga_alloc_mem/1048576 size_m, p.spid
 from v$session s, v$process p where s.paddr=p.addr 
 and p.pga_alloc_mem>104857600 order by 7 desc;

3.咨询开发商是否可以删除语句

alter system kill session 'sid,serial#';

4.CPU使用过高应急处理

现象描述

CPU中 usr%使用率达到90以上

影响因素

CPU使用过高,一般表现在以下几点:
A、不良SQL造成的大量等待事件
B、大量的短连接造成CPU负载高。
C、BUG引起

解决方法

1、当CPU出现高负载的时候,首先我们要检查当前的数据库里是否有大量异常等待,例如:latch free, library cache lock/pin 等待事件。
select event,count(*),wait _class from v$session group by event,wait_class order by 2;
如果有,根据相关等待事件分析问题。也可以通过HANG分析,进行阻塞源头会话定位。
2、当CPU出现高负载的时候,检查发现当前数据库并无任何异常等待事件,我们就要参考平时的CPU使用率指标,然后通过会话、事务量来衡量。
3、当CPU出现高负载的时候,检查发现当前数据库并无任何异常等待事件,当前活动SQL语句与平时差别很大,我们可以关闭监听,检查是否由于连接造成的。

5.大表索引被删除导致CPU 100%的应急处理

现象描述

CPU使用率90%以上

影响因素

大表上索引被删除,部分SQL全表扫描导致资源集聚消耗。

解决方法

1、查找某个实例上等待session的信息,定位低效SQL:

select to_char(a.logon_time,'yyyy-mm-dd hh24:mi') logon_time,
       a.sql_id,
       a.event,
       a.username,
       a.osuser,
       a.process,
       a.machine,
       a.program,a.module,
       b.sql_text,
       b.LAST_LOAD_TIME,
       to_char(b.last_active_time,'yyyy-mm-dd hh24:mi:ss') last_active_time,
       c.owner,c.object_name,
       a.last_call_et,
       a.sid,a.SQL_CHILD_NUMBER,
       c.object_type,p.PGA_ALLOC_MEM,a.p1,a.p2,a.p3,
       'kill -9 '||p.spid killstr
  from v$session a, v$sql b, dba_objects c,v$process p
 where a.wait_class <> 'Idle' and a.status='ACTIVE' and p.addr=a.paddr
   and a.sql_id = b.sql_id(+) 
   and a.sql_child_number = b.CHILD_NUMBER(+)
   and a.row_wait_obj# = c.object_id(+)
   and a.type='USER'
 order by a.sql_id,a.event;

2、非rac环境
a.部分大表索引删除,导致全表扫面,cpu 100%
b.此时数据库基本处于hang状态,应用已经无法响应
c.停止相关应用,kill掉这些等待session, 新建索引(parallel nologging)
d.如果无法停止应用,停止数据库的监听,kill掉等待session,新建索引(parallel nologging)

3、rac环境
a.部分大表索引删除,导致全表扫面,cpu 100%
b.此时该节点基本处于hang状态,应用已经无法响应
c.停止相关应用,kill掉这些等待session, 新建索引(parallel nologging)
d.如果无法停止应用,停止所有节点的监听,kill掉等待session,新建索引(parallel nologging)

标签:process,数据库,消耗,id,session,sql,oracle,应急,CPU
From: https://blog.51cto.com/u_13482808/7908507

相关文章

  • Oracle中如何根据查询sql片段定位查询客户端主机地址
    --1.根据sql片段获取sql_id--select*fromv$sqlwherelast_active_time>sysdateandsql_textlike'%ZL0204_03r%';selectsql_id,modulefromv$sqlwherelast_active_time>sysdateandsql_textlike'%ZL0204_03%';--2.根据sql_id查询sid......
  • java serverlets使用数据源连接oracle数据库,并执行查询操作代码
    packagechap03;importjava.io.IOException;importjava.io.PrintWriter;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.PreparedStatement;importjava.sql.Statement;importjava.u......
  • Oracle regexp_substr()正则表达
    SELECTA.*,regexp_substr(A.MATERIAL_ID,'[^,]+',1,lvl,'c')MATERIAL_NO,regexp_count(A.MATERIAL_ID,',')+1CNTFROMDWT_INPUT_LOTA,(selectlevellvlfromdualconnectbylevel<6)WHERE1=1 ANDA.PROD_TYPEIN('Norm......
  • oracle-rownum详解
    Oracle中的rownum用法详解:rownum是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,返回的第二行分配的是2,这个为字段可以用于限制返回查询的总行数,且rownum不可以以任何表的名称作为前缀。 1.rownum对于等于某值的查询条件:如果想找到第一条查询数据,可以......
  • Oracle Cloud 更换MFA(2步验证)设备
    OracleCloud更换MFA(2步验证)设备1.起因发现越狱的ios设备,在移动数据模式下无法稳定获取IPV6地址,也不知道哪个插件影响的。所以想恢复系统重新越狱试一下,但手机安装了OracleCloud的2步验证程序,之前想更换,一直没找到在哪设置的2.更换过程中另外一个问题:找不到个人账号的设置......
  • CentOS7.9部署Oracle
    CentOS7.9部署Oracle整体思路准备好CentOS7.9系统和Oracle安装包。Oracle下载链接:https://www.oracle.com/database/technologies/oracle-database-software-downloads.html系统配置最低要求:1c,2G可用内存需要交换空间介于1GB和2GB之间RAM大小的1.5倍介于2GB和16G......
  • docker安装配置oracle19c
    1.拉取oracle19c镜像,我这边使用的是:registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle2.创建Oracle容器: dockerrun-d-p1521:1521--nameoracle19c-dregistry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c  可以看到状态是Starting,具体日志可以查看 dock......
  • Oracle分区表技术详解
    Oracle是如何存储数据的?逻辑存储与物理存储在国企或者一线大厂,一般都会选择使用Oracle数据库,程序通过mybatis等持久层框架访问Oracle数据库,指定表空间,表空间内包含若干张表,表中存有行数据,行数据以行片段的形式存储在数据库块中,①当插入的行太大,无法装入单个块时;②或因为更新的......
  • Oracle的存储过程
    Oracle存储过程简介什么是存储过程在oracle中,存储过程是为了完成特定功能的SQL语句集,编译后存储在数据库中,用户通过指定存储过程名字并给出参数(如果该存储过程带有参数)来调用存储过程。存储过程有什么优点效率高:存储过程编译一次后,就会存到数据库,每次调用时都直接执行,而如果......
  • Oracle重新编译视图
    当表名、列名、列类型等底层表的信息发生改变的时候,就会使得视图无法使用,其时就需要对视图进行重新的编译。第一步,查找失效的视图。可以使用数据字典中的user_objects来查找出失效的视图名,还可以利用user_views来查找出相应视图的代码信息。基本的代码如下:----------------查......