前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[打造自己的监控系统]使用Django获取Oracle TOP SQL数据并存入MySQL数据库

[打造自己的监控系统]使用Django获取Oracle TOP SQL数据并存入MySQL数据库

作者头像
bsbforever
发布2020-08-19 15:11:48
发布2020-08-19 15:11:48
2.7K0
举报

前面介绍了如何利用Python搭建一个网站并且介绍了如何在其中执行Oracle命令并在前端显示出来 然后讲述自定义命令相关的知识

精彩内容可通过公众号自定义菜单查看也可直接查看我的网站

http://www.zhaibibei.cn/oms/1.1/ http://www.zhaibibei.cn/oms/2.1/ http://www.zhaibibei.cn/oms/3.1/

通过上面我们已经知道了如何使用Django获取数据库的信息 接下来我们说的是如何通过Django创建的网站来监控Oracle的TOP SQL

注意事项 前面的内容我使用的是CentOS 6.8+ Python 2.7 的环境 从这期开始已经改成了CentOS 7 +Python 3.6 的环境 关于如何迁移将在后面介绍


开发环境

操作系统:CentOS 7.4 Python版本 :3.6 Django版本: 1.10.5 操作系统用户:oms


上节我们介绍了如何新建一个自定义命令,这节讲述如何使用其获取Oracle常见的性能指标,如物理读,逻辑读,CPU Time,等待事件等并保存在MySQL数据库中

1. 新建MySQL表存放监控数据

我们日常在运维Oracle数据库时有很多指标需要考虑

这里我挑选了一些日常检查的项目

  • 物理读:oracle_diskreads
  • 逻辑读:oracle_buffergets
  • 执行时间:oracle_elapsedtime
  • CPU 时间:oracle_cputime
  • TOP等待事件:oracle_topevent

1.1 添加models

这里列出来几个表的创建,全部代码请查看我的github主页

注意这里不同于Python2.7版本,原来的__unicode__在这里使用__str__

vim models.py

class oracle_diskreads(models.Model): ipaddress=models.GenericIPAddressField() tnsname=models.CharField(max_length=50) sql_time=models.BigIntegerField(blank=True) sql_id=models.CharField(max_length=50) disk_reads=models.BigIntegerField(blank=True) executions=models.BigIntegerField(blank=True) cpu_time=models.BigIntegerField(blank=True,null=True) elapsed_time=models.BigIntegerField(blank=True,null=True) module=models.CharField(max_length=65,null=True) sql_text=models.CharField(max_length=1000) def __str__(self): return self.tnsname class Meta: app_label='monitor'

class oracle_topevent(models.Model): ipaddress=models.GenericIPAddressField() tnsname=models.CharField(max_length=50) sql_time=models.CharField(max_length=100) event_name=models.CharField(max_length=100) total_waits=models.BigIntegerField(blank=True) total_timeouts=models.BigIntegerField(blank=True) wait_time=models.BigIntegerField(blank=True) def __str__(self): return self.tnsname class Meta: app_label='monitor'

1.2 创建数据库表

[oms@LProAP-MONITOR1 mysite]$ python manage.py makemigrations [oms@LProAP-MONITOR1 mysite]$ python manage.py migrate

1.3 添加至admin管理

vim admin.py

以上就完成了表的创建,一些字段的解释如下:

  • ipaddress:Oracle数据库的IP地址
  • tnsname:Oracle数据库的TNS名称
  • sql_time:该语句获取到的时间
  • sql_id:Oracle SQL语句的SQL ID,由于我这有9i的库,所以实际捞取的是hash_value的值
  • executions:Oracle SQL 语句的执行次数
  • elapsed_time:Oracle SQL 语句执行的时间
  • module:Oracle SQL 语句执行的模块
  • sql_text:Oracle SQL 语句的文本(这里从空间空间考虑,只截取前40个字符)
  • event_name:等待事件的名称
  • total_waits:等待事件等待的次数
  • total_timeouts:等待事件超时次数
  • wait_time:等待事件等待的时间

2. 编写自定义命令获取指标并存入数据库

如何创建自定义命令请参考:

http://www.zhaibibei.cn/oms/3.1/

2.1 主体程序

这里我们用oracle_topsql_mysql.py程序来获取Oracle TOP SQL

vim monitor/management/commands/oracle_topsql_mysql.py

2.2 调用的函数

上面主体程序调用了一些函数用于从Oracle数据库获取必要的数据

文件路径为monitor/command/getoracleinfo_topsql.py

这里选取几个,具体的参见我的github主页,可根据实际情况进行调整

def getbuffergets(cursor): s=cursor.execute('select hash_value, abs(buffer_gets),abs(executions) ,abs(cpu_time),abs(elapsed_time),module,substr(sql_text,0,40) from v$sqlarea where abs(buffer_gets)>100000') row=s.fetchall() return row

def getdiskreads(cursor): s=cursor.execute('select hash_value, abs(disk_reads),abs(executions) ,abs(cpu_time),abs(elapsed_time),module,substr(sql_text,0,40) from v$sqlarea where abs(disk_reads)>100000') row=s.fetchall() return row

def gettopevent(cursor): s=cursor.execute('select event,abs(total_waits),abs(total_timeouts),abs(time_waited) from v$system_event') row=s.fetchall() return row

这个程序讲解如下:

  1. 后从oraclelist表中获取信息
  2. 遍历每个数据库,当monitor_type为1和performance_type为1时继续
  3. 利用取出来的信息连接数据库,当连接成功后执行相应的程序获取TOP SQL数据,获取完成后关闭数据库连接
  4. 接下来采用insert/save方法保存到MySQL数据库中

一些注意事项

  1. 由于我有9i的库,所以统一抓取hash_value
  2. 各个函数的内容请自行查看源代码,很容易理解
  3. 由于出现过负数的情况所以采用了abs函数
  4. 这里调用了send_mail函数用于程序运行异常时通知我

3. 最终结果

使用如下命令运行

/usr/bin/python /home/oms/mysite/manage.py oracle_topsql_mysql

可以看出数据库的信息已经保存在MySQL数据库中了


4. 设置自动运行

这里我们设置每小时执行一次,并重定向所有日志至一个文件

这样我们可以通过检查该日志文件判断脚本是否正常运行

0 * * * * /usr/bin/python /home/oms/mysite/manage.py oracle_topsql_mysql >>/home/oms/mysite/crontab.log 2>&1

源代码位置

源码会在后续放出


好了,这节介绍了如何利用自定义命令获取Oracle数据库的性能指标并保存在MySQL数据库中

下节介绍如何将这些数据展示在一个页面上

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宅必备 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 新建MySQL表存放监控数据
  • 2. 编写自定义命令获取指标并存入数据库
    • 一些注意事项
  • 3. 最终结果
  • 4. 设置自动运行
    • 源代码位置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档