前面介绍了如何利用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数据库中
我们日常在运维Oracle数据库时有很多指标需要考虑
这里我挑选了一些日常检查的项目
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
以上就完成了表的创建,一些字段的解释如下:
如何创建自定义命令请参考:
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
这个程序讲解如下:
使用如下命令运行
/usr/bin/python /home/oms/mysite/manage.py oracle_topsql_mysql
可以看出数据库的信息已经保存在MySQL数据库中了
这里我们设置每小时执行一次,并重定向所有日志至一个文件
这样我们可以通过检查该日志文件判断脚本是否正常运行
0 * * * * /usr/bin/python /home/oms/mysite/manage.py oracle_topsql_mysql >>/home/oms/mysite/crontab.log 2>&1
源码会在后续放出
好了,这节介绍了如何利用自定义命令获取Oracle数据库的性能指标并保存在MySQL数据库中
下节介绍如何将这些数据展示在一个页面上