因为系统执行请求太多,cpu经常卡,但是不知道哪个请求卡了cpu。

所以想做个界面展示所有请求执行情况,包括执行时间和占用cpu。

执行时间可以用当前时间减去提交时间获得,但是cpu的准确数据在服务器上面,EBS本身没有。

所有考虑从数据库读取cpu情况进行追溯。

主要思路如下:

1. linux定时执行脚本,将cpu使用率写入到txt文件;

2. 数据库程序读取txt文件,写入到table中进行记录;

具体如下:

1. DBA在linux建立sh文件如下

#!/bin/bash
.  /etc/profile
. /home/oraprod/.bash_profile
/usr/bin/top -bn  1  -i -c |grep oracle|awk '{ if ($9 > 70) print $1,$9}' |awk '{print  > "/data/prod/temp/topcpupid.txt"}'

2. DBA使用corntab建立定时任务(每分钟执行,每次执行60次,这样可以达到秒级记录)

#!/bin/bash
.  /etc/profile
. /home/oraprod/.bash_profilestep=1
for (( i = 0; i < 60; i = (i+step) )); do/home/oraprod/topcpupid.shsleep $step
doneexit 0

3. 数据库代码获取cpu使用率

Utl_File.Fopen和Utl_File.Get_Line得到txt内容

--建立数据库object
CREATE OR REPLACE TYPE xxtopcpu AS OBJECT (pid NUMBER,cpuusage NUMBER);
CREATE OR REPLACE TYPE xxtopcpu_table AS TABLE OF xxtopcpu;--建立路径--注意:不同环境服务器路径会不同,需要DBA去人
CREATE OR REPLACE DIRECTORY XXCPUREAD AS '/data/dev/temp/';--在程序包读取文件返回object
--该程序会按照路径读取指定txt文档,整理数据插入到object,返回对象列表FUNCTION Get_Cpuusage RETURN Xxtopcpu_Table ISHandle       Utl_File.File_Type;v_Text       VARCHAR2(4000);Lv_Fiel_Name VARCHAR2(2000) := 'topcpupid.txt'; --'topcpupid.txt';Lv_Dir_Name  VARCHAR2(100) := 'XXCPUREAD'; --'/data/dev/temp/'Xxtopcpu_Rec Xxtopcpu := Xxtopcpu(NULL, NULL);Xxtopcpu_Tbl Xxtopcpu_Table := Xxtopcpu_Table();Ln_Index     NUMBER := 0;BEGIN--Write_Cpuusage;Handle := Utl_File.Fopen(Lv_Dir_Name, Lv_Fiel_Name, 'r');LOOPBEGINUtl_File.Get_Line(Handle, v_Text);Dbms_Output.Put_Line(v_Text);SELECT Substr(v_Text, 1, Instr(v_Text, ' ') - 1),Substr(v_Text, Instr(v_Text, ' ') + 1, 10)INTO Xxtopcpu_Rec.Pid,Xxtopcpu_Rec.CpuusageFROM Dual;Ln_Index := Ln_Index + 1;Xxtopcpu_Tbl.Extend;Xxtopcpu_Tbl(Ln_Index) := Xxtopcpu_Rec;EXCEPTIONWHEN No_Data_Found THENEXIT;END;END LOOP;FOR i IN 1 .. Xxtopcpu_Tbl.Count LOOPDbms_Output.Put_Line('pid:' || '---' || Xxtopcpu_Tbl(i).Pid);END LOOP;Utl_File.Fclose(Handle);RETURN Xxtopcpu_Tbl;END Get_Cpuusage;

4. 定时获取cpu使用情况,做历史记录分析

a. 建立table表

create table it_erp_r.XXCUS_CPUINFO_T
(group_id   NUMBER,query_date DATE,pid        NUMBER,cpuusage   NUMBER,session_id NUMBER,ser_id     NUMBER,request_id NUMBER,sql_id     VARCHAR2(100)
);
-- Add/modify columns
alter table IT_ERP_R.XXCUS_CPUINFO_T add request_code varchar2(200);-- Create sequence
create sequence IT_ERP_R.XXCUS_CPUINFO_S
minvalue 1
maxvalue 999999999999
start with 1
increment by 1;

b. 建立job定时执行

CREATE OR REPLACE PROCEDURE it_erp_r.Xxcus_Cpuinfo_Prc ISLd_Date       DATE := SYSDATE;Ln_Group_Id   NUMBER := It_Erp_r.Xxcus_Cpuinfo_s.Nextval;Ln_Request_Id NUMBER;lv_request_code VARCHAR2(100);CURSOR Cur_Loop ISSELECT Cputop.Pid,Cputop.Cpuusage,Ses.Sid,Ses.Serial# Ser_Id,Ses.Sql_IdFROM TABLE(Apps.Xxcus_Error_Operation_Pkg.Get_Cpuusage) Cputop,V$process Pro,V$session SesWHERE Pro.Spid = Cputop.PidAND Ses.Paddr = Pro.Addr;
BEGINFOR i IN Cur_Loop LOOPBEGINSELECT Fcr.Request_Id,fcr.Concurrent_Program_NameINTO Ln_Request_Id,lv_request_codeFROM Fnd_Concurrent_Worker_Requests FcrWHERE Fcr.Oracle_Process_Id = i.Pid;EXCEPTIONWHEN OTHERS THENLn_Request_Id := NULL;lv_request_code := NULL;END;INSERT INTO It_Erp_r.Xxcus_Cpuinfo_t(Group_Id,Query_Date,Pid,Cpuusage,Session_Id,Ser_Id,Request_Id,Sql_Id,request_code)VALUES(Ln_Group_Id,Ld_Date,i.Pid,i.Cpuusage,i.Sid,i.Ser_Id,Ln_Request_Id,i.Sql_Id,lv_request_code);END LOOP;COMMIT;
EXCEPTIONWHEN OTHERS THENROLLBACK;END Xxcus_Cpuinfo_Prc;

创建定时job

beginsys.dbms_scheduler.create_job(job_name            => 'XXCUPINFO',job_type            => 'STORED_PROCEDURE',job_action          => 'it_erp_r.Xxcus_Cpuinfo_Prc',start_date          => to_date('09-03-2022 17:55:00', 'dd-mm-yyyy hh24:mi:ss'),repeat_interval     => 'Freq=SECONDLY;Interval=30',end_date            => to_date(null),job_class           => 'DEFAULT_JOB_CLASS',enabled             => true,auto_drop           => false,comments            => '获取cpu使用率信息');
end;
/

创建job的说明这里说的比较清楚:

sys.dbms_scheduler.create_job创建定时任务_傲骨雄风的博客-CSDN博客_sys.dbms_scheduler

oracle 读取数据库cpu使用率相关推荐

  1. mysql数据库占用太多的CPU_mysql数据库CPU使用率过高解决方案

    压测时,经常会出现mysql数据库CPU使用率过高,下面介绍一下简单的问题定位方法: 1.确定是否有慢sql语句: 1)登录数据库服务器,连接数据库:执行命令:mysql -uroot -p 密码 2 ...

  2. mysql查询cpu使用率100%_数据库CPU使用率100% 排查记

    1.背景: 在监控线上数据库的运行是否安全.正常的过程中,cpu 使用率是一个重要的指标,一旦cpu使用率飙升至90%+甚至达到100%,必然会对数据库的正常工作产生影响. 在排查数据库的cpu 飙升 ...

  3. 花式读取Android CPU使用率

    本文包含以下内容: 1.介绍常见的获取android cpu使用率的方法 2.介绍这些常见方法背后的原理 3.介绍我自己写的一个脚本,这个脚本可以获取各个线程在cpu各个核上的占用率 一.常见的获取A ...

  4. 通过TOP命令查找达梦数据库CPU使用率高的会话

    1.查看数据库进程id Ps –ef|grep dmser 数据库进程ID是1613/2.通过top命令查看CPU使用率高的pid: top -Hp 1613 这里CPU使用率高的PID是1674 3 ...

  5. Oracle读取数据库中表填充,Oracle数据库中查看所有表和字段以及表注释.字段注释...

    1.获取表: select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 se ...

  6. oracle数据库主机CPU使用率高问题的分析及SQL优化

    服务概述 业务系统ORACLE数据库所在主机在近期遇到CPU使用率高的性能问题,工程师及时响应并协助查找了引起数据库性能问题的SQL:后续对此故障原因进行分析及相关建议,详细的故障情况及相关信息分析及 ...

  7. Oracle数据库CPU占用过高

    一.问题描述 运行在Windows上的Oracle开发库的oracle进程CPU使用率保持在99%,服务器和数据库均反应缓慢. 二.排查思路 可能造成CPU使用率高的情况有:大量排序.大量SQL解析. ...

  8. php读取oracle,php读取oracle中数据库文件

    //需要配置下php.ini中extension-php使得php支持对oracle 11G数据库文件的访问 $dbconn=oci_connect("mnmlist"," ...

  9. oracle读取数据方式,关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

最新文章

  1. bd9.1 MySQL 常见问题
  2. linux yum配置文件 yum.conf 简介
  3. 浅谈Struts2的命名空间及以传统形式返回json数据
  4. 华为P50保护壳曝光:双环形后置相机模组实锤
  5. python程序员怎么建议_资深程序员对Python新手的八个建议,超级实用!
  6. PhpStorm下Laravel代码智能提示
  7. JMeter压测输出HTML图形化报表
  8. windows上通过vnc连接虚拟机中linux系统
  9. php之图片上传到服务器的原理
  10. L2Dwidget.js L2D网页动画人物添加
  11. layui 时间控件(laydate) 闪退问题
  12. 倒立摆状态反馈控制——分析、建模与仿真(matlab)
  13. 善用win7中的资源监视器
  14. 超详细3D建模教学他来了
  15. 数据分析2021年最实用工具排名前6位出炉
  16. 2023交易猫源码跳转APP
  17. python数据框提取子集_pandas 数据子集的获取
  18. Alpine linux 小内存版,Alpine Linux系统-Alpine Linux系统【轻量级Linux】下载v3.11.0 最新版-西西软件下载...
  19. 阿里国际站如何有效覆盖关键词+关键词推广评分详解
  20. 极品鸿蒙系统 心月文谛,第五章:分身系统开启

热门文章

  1. 网站可以赚钱吗(现在自己做网站还有前景吗)
  2. LeetCode题解:704.二分查找
  3. googletest (gtest)的使用方法
  4. oracle正则判断数字开头,oracle 正则表达式判断是否数字
  5. 用Matlab将Excel表格数据导入并绘制曲线
  6. 银联手机网页支付(WAP支付) PHP开发
  7. DEDE列表页属性合集【集合篇】
  8. 积鼎CFD软件VirtualFlow新版本上线,更丰富的多相流模型,更优用户体验
  9. 阿里云推出国内首个社保云系统
  10. 碰到边缘就反弹的金币收集游戏,译者:lixingqiu