oracle 读取数据库cpu使用率
因为系统执行请求太多,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使用率相关推荐
- mysql数据库占用太多的CPU_mysql数据库CPU使用率过高解决方案
压测时,经常会出现mysql数据库CPU使用率过高,下面介绍一下简单的问题定位方法: 1.确定是否有慢sql语句: 1)登录数据库服务器,连接数据库:执行命令:mysql -uroot -p 密码 2 ...
- mysql查询cpu使用率100%_数据库CPU使用率100% 排查记
1.背景: 在监控线上数据库的运行是否安全.正常的过程中,cpu 使用率是一个重要的指标,一旦cpu使用率飙升至90%+甚至达到100%,必然会对数据库的正常工作产生影响. 在排查数据库的cpu 飙升 ...
- 花式读取Android CPU使用率
本文包含以下内容: 1.介绍常见的获取android cpu使用率的方法 2.介绍这些常见方法背后的原理 3.介绍我自己写的一个脚本,这个脚本可以获取各个线程在cpu各个核上的占用率 一.常见的获取A ...
- 通过TOP命令查找达梦数据库CPU使用率高的会话
1.查看数据库进程id Ps –ef|grep dmser 数据库进程ID是1613/2.通过top命令查看CPU使用率高的pid: top -Hp 1613 这里CPU使用率高的PID是1674 3 ...
- Oracle读取数据库中表填充,Oracle数据库中查看所有表和字段以及表注释.字段注释...
1.获取表: select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 se ...
- oracle数据库主机CPU使用率高问题的分析及SQL优化
服务概述 业务系统ORACLE数据库所在主机在近期遇到CPU使用率高的性能问题,工程师及时响应并协助查找了引起数据库性能问题的SQL:后续对此故障原因进行分析及相关建议,详细的故障情况及相关信息分析及 ...
- Oracle数据库CPU占用过高
一.问题描述 运行在Windows上的Oracle开发库的oracle进程CPU使用率保持在99%,服务器和数据库均反应缓慢. 二.排查思路 可能造成CPU使用率高的情况有:大量排序.大量SQL解析. ...
- php读取oracle,php读取oracle中数据库文件
//需要配置下php.ini中extension-php使得php支持对oracle 11G数据库文件的访问 $dbconn=oci_connect("mnmlist"," ...
- oracle读取数据方式,关于oracle数据库读取数据的三种方式
打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name varchar2(6), ID num ...
最新文章
- bd9.1 MySQL 常见问题
- linux yum配置文件 yum.conf 简介
- 浅谈Struts2的命名空间及以传统形式返回json数据
- 华为P50保护壳曝光:双环形后置相机模组实锤
- python程序员怎么建议_资深程序员对Python新手的八个建议,超级实用!
- PhpStorm下Laravel代码智能提示
- JMeter压测输出HTML图形化报表
- windows上通过vnc连接虚拟机中linux系统
- php之图片上传到服务器的原理
- L2Dwidget.js L2D网页动画人物添加
- layui 时间控件(laydate) 闪退问题
- 倒立摆状态反馈控制——分析、建模与仿真(matlab)
- 善用win7中的资源监视器
- 超详细3D建模教学他来了
- 数据分析2021年最实用工具排名前6位出炉
- 2023交易猫源码跳转APP
- python数据框提取子集_pandas 数据子集的获取
- Alpine linux 小内存版,Alpine Linux系统-Alpine Linux系统【轻量级Linux】下载v3.11.0 最新版-西西软件下载...
- 阿里国际站如何有效覆盖关键词+关键词推广评分详解
- 极品鸿蒙系统 心月文谛,第五章:分身系统开启