[打造自己的监控系统之执行Oracle命令]检查未绑定变量的语句(硬解析状况)
上节我们介绍了如何通过Django获取Oracle 执行次数等于一的语句,而这些语句很有可能是未使用绑定变量导致,这节讲如何获取其具体的信息
开发环境
操作系统:CentOS 7.3 Python版本 :2.7 Django版本: 1.10.5 操作系统用户:oracle
建立页面的步骤
我们还是通过这张图的步骤来说明如何建立页面
urls.py页面
首先是monitor/urls.py,这节不需要修改这个文件
urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^oracle_command/$',views.oracle_command, name='oracle_command'), url(r'^commandresult/$',views.commandresult, name='commandresult'), ]
oracle_command为执行Oracle命令的页面
commandresult为执行完Oracle命令显示结果的页面
views.py
下面为commandresult对应的函数在views.py里面的写法
1. 首先获取到表单中的数据,如 ipaddress,tnsname以及执行的命令
2. 然后通过ipaddress,tnsname从oraclelist数据库中查找获得用户名密码用于连接
3. 再判断命令内容,如果是check_unboundsql
4. 则首先获取上节中查找到的执行次数等于一的语句,
5. 然后将语句作为参数传递到函数getunboundsql中未使用绑定变量的语句的相信信息,详情看具体代码
6. 最后把页面的标题以及数据放到dic变量中传到 oracle_command_result_5.html模板文件中
getunboundsql函数
这里的getunboundsql函数获取执行次数等于一的语句,详情看具体代码
monitor/command/getoraclecommandresult.py
def getunboundsql(cursor,unboundsql): fp=open('/home/oracle/mysite/monitor/command/oracle_command/getunboundsql.sql','r') fp1=fp.read().strip()+unboundsql+'%' order by last_load_time desc' s=cursor.execute(fp1) fp.close() row=s.fetchall() return row
getexecutions.sql
这个SQL获取v$sql视图中未使用绑定变量的语句情况
select sql_text, hash_value, module , first_load_time, last_load_time from v$sql where sql_text like '
template文件
这里我们使用oracle_command_result_5.html文件来显示
oracle_command_result_5.html
该模板是一个表格,通过将传过来的变量显示在前端页面
实际效果
http://10.65.202.218:8081/monitor/oracle_command/
从上面结果我们可以看到这个select语句的where子句未使用绑定变量,从模块中可以看到其来自的哪里,载入时间也可以判断其执行的非常频繁。
源码地址
源码请查看我的GitHub主页
https://github.com/bsbforever/wechat_monitor
到这里已经讲了日常运维中遇到的情形,大家如有其他需求,基本上都提供了模板供修改
下期将是一个总结
- AutoMapper 使用实践
- CTF---安全杂项入门第二题 A记录
- PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
- 手把手带你进入TOP20的商超销售预测
- 【干货荟萃】机器学习&深度学习知识资料大全集(二)(论文/教程/代码/书籍/数据/课程等)
- 逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能
- 【专知-Java Deeplearning4j深度学习教程06】用卷积神经网络CNN进行图像分类
- 万恶的剪贴板==》为存储而生
- AdaBoost算法(R语言)
- CTF---Web入门第六题 因缺思汀的绕过
- 小案例(六):预测小偷行为(python)
- 小案例(五):销量预测(python)
- SQL:插入指定标识列的数据时候的小错误
- 逻辑回归与梯度下降详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RTOS函数命名规则
- 通过思维导图,让女朋友搭建一个hadoop完全分布式
- FreeRTOS内核应用开发手记
- 移植FreeRTOS后运行,卡在uxDeletedTasksWaitingCleanUp
- 99%的人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系
- 什么是前缀树--打开了我的新思路
- 一个案例搞懂原码、反码、补码,不懂得请看过来
- 人人都在用,但你却不知道它背后发生了什么——浏览器的工作原理:浏览器幕后揭秘
- 这有一把钥匙,打开MySQL死锁问题!
- 普通人如何全面了解大数据的特点,意义和发展前景
- 面试官问我Linux下常见网络命令
- 最全常用User-Agent
- 聊到JVM(还怕面试官问JVM吗?)
- Android.location.Address类方法获取GPS定位信息
- Python二叉树详解笔记