有的时候无法使用Oracle自带的OEM监控,那么就需要确定一个监控方案。
此方案,使用Python+Prometheus+Grafana+Oracle
1.监控配置表
-- Create table
create table DB_MONITOR_TAB
(
  ID                  NUMBER,
  MONITOR_CLASS       VARCHAR2(50),
  MONITOR_NAME        VARCHAR2(50) not null,
  MONITOR_SQL         VARCHAR2(1000),
  CREATED_TIME        DATE default sysdate,
  STATUS              NUMBER default '0',
  MONITOR_INSTRUCTION VARCHAR2(100)
)
tablespace DBADMIN
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table
comment on table DB_MONITOR_TAB
  is 'Oracle监控配置表';
-- Add comments to the columns
comment on column DB_MONITOR_TAB.ID
  is '序号';
comment on column DB_MONITOR_TAB.MONITOR_CLASS
  is '监控类别';
comment on column DB_MONITOR_TAB.MONITOR_NAME
  is '监控事项';
comment on column DB_MONITOR_TAB.MONITOR_SQL
  is '监控事项的SQL';
comment on column DB_MONITOR_TAB.CREATED_TIME
  is '监控事项创建时间';
comment on column DB_MONITOR_TAB.STATUS
  is '监控事项是否开启 1:开启,0:不开启';
-- Create/Recreate primary, unique and foreign key constraints
alter table DB_MONITOR_TAB
  add constraint PK_MONITOR_NAME primary key (MONITOR_NAME)
  using index
  tablespace DBADMIN
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
 
2.插入监控数据
insert into db_monitor_tab values (1,'session','v_session','select initcap(s.TYPE)||' '||initcap(s.STATUS) status,count(s.STATUS) from v$session s group by  s.TYPE,s.STATUS order by status',sysdate,1,'当前session个数')
insert into db_monitor_tab values (10,'archive_log_info','v_archive_log_info','select 'Archive_Log_Size' || '(MB)',case when trunc(sum(s.BLOCKS * s.BLOCK_SIZE)/1024/1024, 2) is null then 0 else trunc(sum(s.BLOCKS * s.BLOCK_SIZE)/1024/1024,2) end from v$archived_log s where s.DEST_ID = 1 and s.COMPLETION_TIME >= trunc(sysdate) and s.COMPLETION_TIME < trunc(sysdate + 1)',sysdate,1,'每天归档日志大小(MB)')
insert into db_monitor_tab values (11,'archive_log_info','v_archive_log_count','select 'Archive_Log_Count',count(1) from v$archived_log s where s.DEST_ID = 1 and s.COMPLETION_TIME >= trunc(sysdate) and s.COMPLETION_TIME < trunc(sysdate + 1)',sysdate,1,'每天归档日志数量')
insert into db_monitor_tab values (12,'lock_info','v_locke_count','select 'Lock_Count', count(1) from v$session s where s.STATUS='ACTIVE' AND s.LOCKWAIT is not null and s.BLOCKING_SESSION_STATUS='VALID'',sysdate,1,'行锁数量')
insert into db_monitor_tab values (13,'redo_info','v_redo_info','SELECT initcap(NAME), VALUE FROM V$SYSSTAT where NAME in  ('redo entries','redo buffer allocation retries')',sysdate,1,'redo情况')
insert into db_monitor_tab values (14,'net_info','v_net_info','SELECT initcap(NAME)||'(KB)',round(VALUE/1024,2) FROM V$SYSSTAT where NAME in ('bytes received via SQL*Net from client','bytes sent via SQL*Net to client')',sysdate,1,'数据库数据进出的网络流量')
insert into db_monitor_tab values (2,'process','v_process','select 'Process_Count',count(1) from v$process',sysdate,1,'当前process个数')
insert into db_monitor_tab values (3,'tablespace_used','v_tablespace_used','SELECT x.tablespace_name||'(%)',x.USED_RATE FROM (select * from (select a.TABLESPACE_NAME TABLESPACE_NAME,ROUND((a.total-b.free_space)/a.total*100,2) as USED_RATE from (select TABLESPACE_NAME,sum(bytes/1024/1024) total from dba_data_files group by TABLESPACE_NAME) a,(select TABLESPACE_NAME,sum(bytes/1024/1024) free_space from dba_free_space group by tablespace_name) b where a.TABLESPACE_NAME=b.TABLESPACE_NAME) UNION all select * from (select c.TABLESPACE_NAME TABLESPACE_NAME,ROUND((c.total-d.free_space)/c.total*100,2) as USED_RATE from (select TABLESPACE_NAME,sum(bytes/1024/1024) total from dba_temp_files group by TABLESPACE_NAME) c,(select TABLESPACE_NAME,sum(FREE_SPACE/1024/1024) free_space from dba_temp_free_space group by tablespace_name)d where c.TABLESPACE_NAME=d.TABLESPACE_NAME)) X order by USED_RATE desc',sysdate,1,'各个表空间使用情况')
insert into db_monitor_tab values (4,'wait_class','v_wait_class','SELECT s.WAIT_CLASS,sum(s.TIME_WAITED/1000) FROM v$system_event s group by s.WAIT_CLASS order by s.WAIT_CLASS',sysdate,1,'数据库各类型等待事件统计')
insert into db_monitor_tab values (5,'sga_info','v_shared_pool','select sg.NAME||'(GB)',trunc(sg.BYTES/1024/1024/1024,2) from v$sgainfo sg where sg.NAME in ('Buffer Cache Size','Shared Pool Size') order by sg.name',sysdate,1,'shared_pool 内存大小')
insert into db_monitor_tab values (6,'sga_info','v_shared_pool_free_size','SELECT 'shared_pool_free'||'(GB)',trunc(sp.BYTES/1024/1024/1024,2) FROM V$SGASTAT sp WHERE NAME = 'free memory' and pool='shared pool'',sysdate,1,'shared_pool 空闲内存大小')
insert into db_monitor_tab values (7,'hits_info','v_library_cache_hits','select 'Library_Cache_Hits'||'(%)',trunc(sum(ly.PINHITS)/sum(ly.PINS)*100,2) from v$librarycache ly',sysdate,1,'library_cache_hits')
insert into db_monitor_tab values (8,'hits_info','v_buffer_pool_cache_hits','SELECT 'Buffer_Pool_Cache_Hits'||'(%)',(trunc(1-(PHYSICAL_READS/(DB_BLOCK_GETS+CONSISTENT_GETS)),2))*100 FROM V$BUFFER_POOL_STATISTICS WHERE NAME='DEFAULT'',sysdate,1,'buffer_pool_cache_hits')
insert into db_monitor_tab values (9,'hits_info','v_sql_hard_prse_hit','select 'Hard_Parse_Hits'||'(%)',trunc((select st.VALUE from v$sysstat st  where st.NAME='parse count (hard)')/(select st.VALUE from v$sysstat st  where st.NAME='parse count (total)') *100,2) from dual',sysdate,1,'sql硬解析的百分比')
 
3.Python监控程序
cat oracle_status_output.py
from prometheus_client import Gauge,start_http_server
import random
import subprocess
import time
import cx_Oracle
class Oracle_Status_Output:
    def __init__(self,db_sql):
        self.db_name = 'dbadmin'
        self.db_password = 'QazWsx12'
        self.db_tns = 'localhost:1521/paydb'
        self.db_sql = db_sql
    def oracle_status_select(self):
        try:
            db=cx_Oracle.connect(self.db_name,self.db_password,self.db_tns)
            cursor = db.cursor()
            cursor.execute(self.db_sql)
            v_result=cursor.fetchall()
            db.close()
            return v_result
        except Exception as e:
            print(e)
if __name__ == "__main__":
    start_http_server(9800)
    oracleGauge = Gauge('oracleGauge','Description of gauge', ['mylabelname'])
    while True:
        try:
            time.sleep(1)
            def Gauge_Values(vsql):
                outvalue = Oracle_Status_Output(vsql).oracle_status_select()
                return outvalue
            jsql = Oracle_Status_Output("select monitor_sql from db_monitor_tab where status=1 and monitor_sql is not null").oracle_status_select()
            for x in range(len(jsql)):
                orasql="".join(tuple(jsql[x]))
                orasqlout = Gauge_Values(orasql)
                def ResultOutput(v_status):
                    for i in range(int(len(v_status))):
                        oracleGauge.labels(mylabelname=v_status[i][0]).set(v_status[i][1])
                ResultOutput(orasqlout)
        except Exception as e:
            print(e)

Python Oracle数据库监控的更多相关文章

  1. Oracle数据库web维护管理及监控

    1.Oracle数据库客户端的种类及现状         目前Oracle数据库维护管理,通常是使用客户端软件:PL/SQL Developer,SQL* Plus,toad,em等进行数据的管理.维 ...

  2. 利用zabbix监控oracle数据库

    一.概述 zabbix是一款非常强大,同时也是应用最为广泛的开源监控软件,本文将给大家介绍如何利用zabbix监控oracle数据库. 二.环境介绍 以下是我安装的环境,实际部署时并不需要跟我的环境一 ...

  3. python - DBUtils 连接池减少oracle数据库的连接数

    问题: 接到需求,告知项目的oracle连接次数过多,对系统造成太过大的负担,要求减少oracle数据库的连接次数 分析: 仔细分析代码以后,发现产生问题的原因,在于之前要求提升oracle监控的监控 ...

  4. 使用Zabbix监控Oracle数据库

    Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...

  5. Spotlight监控Oracle数据库的链接创建

    最近在做性能测试时,由于要挂载空间数据,开发人员直接将所有业务表都挂到了Oracle数据库中.最近做了几次测试发现响应时间和吞吐量都不是很理想,进行一番分析后怀疑可能在Oracle中出现问题,因此再网 ...

  6. python——连接Oracle数据库

    前言 Python自带的模块中有很多操纵文件的.我们可以把文件的数据读出来,经过处理还可以将数据写入文件中.但是对于数据的管理和分析来说,数据库还是专业一些.如果Python能和数据库结合在一起,那么 ...

  7. python 连接oracle 数据库

    我们在测试中可能需要对oracle 数据库进行操纵,比如这样一个场景,在往oracle 里面插数据的同时,另一个工具从里面读,如何能保证读出来的数据是有顺序的,即:先插入进去的先读出来,根据这个场景们 ...

  8. Python使用cx_Oracle模块连接操作Oracle数据库

    1. 简单介绍 cx_Oracle 是一个用来连接并操作 Oracle 数据库的 Python 扩展模块, 支持包含 Oracle 9.2 10.2 以及 11.1 等版本号 2.安装 最好是去官网h ...

  9. 搜索表字段包含某字符串的SQL和监控Oracle数据库的SQL。

    1.第一个SQL 背景:需要找到SQL Server数据库中,包含某个字符串的表,输出表和包含该字符串的列. )='=' --这里填要搜索的字符串 DECLARE @sql NVARCHAR(MAX) ...

随机推荐

  1. HTML切换页面IE版本

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![e ...

  2. bootstrap6 关于bs的使用总结

    在同一行中也可以有多个过了行的 "行", 即列的"总宽度"超宽度12. 即实现堆叠display:block和水平排列float的自动控制, 在div的clas ...

  3. 加法变乘法|2015年蓝桥杯B组题解析第六题-fishers

    加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+1011+12+...+2728+29+ ...

  4. 【第十六章】 springboot + OKhttp + String.format

    模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...

  5. 数据库与hadoop与分布式文件系统的区别和联系

    转载一篇关系数据库与Hadoop的关系的文章 1. 用向外扩展代替向上扩展 扩展商用关系型数据库的代价是非常昂贵的.它们的设计更容易向上扩展.要运行一个更大的数据库,就需要买一个更大的机器.事实上,往 ...

  6. [IOS][sqlite][SQL][数据库]SQL基本语句大全

    参考:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库CREATE DATABASE d ...

  7. zookeeper篇-如何修改源码

    提一个问题先 zxid有64位,分成两部分: 高32位是Leader的epoch:选举时钟,每次选出新的Leader,epoch累加1 低32位是在这轮epoch内的事务id:对于用户的每一次更新操作 ...

  8. 语言小知识-Java ArrayList类 深度解析

    · 问题 1:ArrayList 的 size 和 capacity 怎么理解? 如果把 ArrayList 看作一个杯子的话,capacity 就是杯子的容积,也就是代表杯子能装多少东西,而 siz ...

  9. 《剑指offer》第十题(斐波那契数列)

    // 面试题:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. #include <iostream> using namespace std; ...

  10. ActivityGroup实现tab功能

    android.app包中含有一个ActivityGroup类,该类是Activity的容器,可以包含多个嵌套进来的 Activitys,这篇文章就是借助ActivityGroup可以嵌套Activi ...