python代码

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import subprocess
  4. import sys
  5. import re
  6.  
  7. def run_cmd(cmd, cwd=None, runas=None):
  8. if not sys.platform.startswith('win') and runas and runas != 'root':
  9. cmd = 'su - {} -c "{}"'.format(runas, cmd)
  10. proc = subprocess.Popen(cmd,
  11. stdout=subprocess.PIPE,
  12. stderr=subprocess.STDOUT,
  13. shell=True,
  14. cwd=cwd)
  15. return proc
  16.  
  17. def get_os_oracle_user():
  18. cmd = ''' ps -ef | grep ora_ | grep -v grep | awk '{ print $1 }' | uniq '''
  19. code, res = run_cmd(cmd)
  20. if code == 0:
  21. os_oracle_user = res
  22. return os_oracle_user
  23. else:
  24. print "获取运行database的操作系统用户失败...", res
  25. sys.exit(1)
  26.  
  27. def get_grid_user():
  28. cmd = '''ps -ef | grep asm_pmon | grep -v grep |uniq'''
  29. return_code, result = run_cmd(cmd)
  30. if return_code == 0 and result:
  31. os_oracle_user = result.split('\n')[0].split()[0].strip()
  32. return os_oracle_user
  33. else:
  34. print "获取运行database的操作系统用户失败...", result
  35. sys.exit(1)
  36.  
  37. class Oracle_init():
  38. """所有监控oracle的基类"""
  39. def __init__(self, user='monitoruser', password='123456'):
  40. try:
  41. if user == 'sysdba':
  42. self.user = '/ as sysdba'
  43. elif user and password:
  44. self.user = '{0}/{1}'.format(user, password)
  45. else:
  46. self.user = None
  47. self.os_oracle_user=get_os_oracle_user()
  48. except Exception as err:
  49. print err
  50. sys.exit(1)
  51.  
  52. def run_cmd(self,sid,cmd):
  53. cmd = r'''su - {} -c "export ORACLE_SID={}
  54. sqlplus -S /nolog <<EOF
  55. conn /as sysdba;
  56. {}
  57. exit;
  58. EOF"'''.format(self.os_oracle_user, sid,cmd)
  59. code, res = run_cmd(cmd)
  60. error=self.check_error(res)
  61. if error:
  62. print error
  63. sys.exit(1)
  64. else:
  65. return res
  66.  
  67. def check_error(self,res):
  68. if re.search(r'ORA-01017', res):
  69. error = '账号或密码错误'
  70. elif re.search(r'ORA-01034', res):
  71. error = '数据库不可用'
  72. elif re.search('ORA-\d+:[\s\S]*', res):
  73. error = re.search('ORA-\d+:[\s\S]*', res).group()
  74. else:
  75. error = None
  76. return error
  77.  
  78. # 获取所有实例名
  79. def get_sids():
  80. sids = ''
  81. cmd = "ps -ef|grep -v grep |grep ora_pmon|awk '{print $NF}'|sed 's/ora\_pmon\_//'|uniq"
  82. code, res = run_cmd(cmd)
  83. if not code and res:
  84. sids = res.replace('\n', ' ')
  85. return sids
  86.  
  87. ########判断ohasd状态##############
  88. def get_oracleOhasdStatus():
  89. try:
  90. cmd = "ps -ef | grep ohasd.bin|grep -v grep"
  91. code,res=run_cmd(cmd)
  92. if code:
  93. return False
  94. else:
  95. return True
  96. except Exception as err:
  97. sys.stderr.write(err.__str__() + '\n')
  98. return False
  99.  
  100. ################监听日志大小##############
  101. def get_oracle_listenerLog(sid):
  102. try:
  103. global is_cluster
  104. if is_cluster:
  105. user=get_grid_user()
  106. else:
  107. user= get_os_oracle_user()
  108. cmd = 'su - {} -c "export ORACLE_SID={};' \
  109. 'du -sm $ORACLE_BASE/diag/tnslsnr/`hostname`/listener/trace/listener.log"'.format(user,sid)
  110. code,res=run_cmd(sid, cmd)
  111. if not res:
  112. print '未获得数据'
  113. sys.exit(1)
  114. else:
  115. return res.split()[0]
  116. except Exception as err:
  117. sys.stderr.write(err.__str__() + '\n')
  118. return -1
  119.  
  120. ################监听trace文件# ##############
  121. def get_oracleTrace(sid):
  122. try:
  123. global is_cluster
  124. if is_cluster:
  125. user = get_grid_user()
  126. cmd = 'su - {} -c "export ORACLE_SID={};cat $ORACLE_BASE/diag/asm/+asm/$ORACLE_SID/trace/alert_+ASM1.log |egrep \'ORA-|ERROR\'"'.format(
  127. user, sid)
  128. else:
  129. user = get_os_oracle_user()
  130. cmd='su - {} -c "export ORACLE_SID={};cat $ORACLE_BASE/diag/rdbms/$DB_UNIQUENAME/$ORACLE_SID/trace |egrep \'ORA-|ERROR\'"'.format(
  131. user, sid)
  132.  
  133. code, res = run_cmd(sid, cmd)
  134. if not res:
  135. print '未获得数据'
  136. sys.exit(1)
  137. else:
  138. return res.split()[0]
  139. except Exception as err:
  140. sys.stderr.write(err.__str__() + '\n')
  141. return -1
  142.  
  143. if __name__=='__main__':
  144. output = "metric=%s|value=%d|type=%s|tags=%s"
  145. print output % ("system.file.number", get_oracleOhasdStatus(), 'gauge', '')
  146.  
  147. obj = Oracle_init(user='monitoruser', password='123456')
  148.  
  149. sql_cmd = "select value from v\\\$parameter where name='cluster_database';"
  150. sids=get_sids()
  151. res=obj.run_cmd(sids[0],sql_cmd)
  152. res=res.split('\n')
  153. length=len(res)
  154. is_cluster=None
  155. for i in range(-1,-1-length,-1):
  156. if not i :
  157. continue
  158. if i.strip()=='False':
  159. is_cluster=False
  160. break
  161. if i.strip()=='True':
  162. is_cluster=True
  163. break
  164. if is_cluster is None:
  165. print '无法判断是否是集群'
  166. sys.exit(1)
  167.  
  168. for sid in sids:
  169. print output % ("system.file.number", get_oracle_listenerLog(sid), 'gauge', '')
  170. print output % ("system.file.number", get_oracleTrace(sid), 'gauge', '')

  

oracle监控的更多相关文章

  1. oracle 监控执行的sql语句

    oracle 监控执行的sql语句 select * from v$sqlarea a where module='PL/SQL Developer' order by a.FIRST_LOAD_TI ...

  2. oracle监控参数

    Sar –u 检查CPU的繁忙程度列说明Usr用户模式下cpu运行所占的百分比Sys系统模式下cpu运行所占的百分比Wio因为有进程等待块I/O而使cpu处于闲置状态所占百分比IdleCpu为闲置状态 ...

  3. oracle监控脚本

    简单命令 1.显示服务器上的可用实例:ps -ef | grep smon2.显示服务器上的可用监听器:ps -ef | grep -i listener | grep -v grep3.查看Orac ...

  4. Oracle监控代理安装ITM(IBM Tivoli Monitoring)

    1 监控代理安装 2 1.1 安装 2 1.1.1 解压安装包 2 1.1.2 安装 2 1.2 配置 5 1.2.1 给Agent授权 5 1.2.2 配置Oracle Agent 10 目录 1  ...

  5. zabbix oracle监控插件orabbix部署安装

    1,下载orabbix插件包(插件包同时满足在大部分POSIX-linux及unix和大部分版本的windows下运行,玩转类似但不等同于Tomcat) wget http://www.smartma ...

  6. Oracle 监控索引使用

    Oracle提供一个监控索引的方法,来确定索引是否被使用.如果索引没有被使用,就可以删除它们以减少不必要的语句的开销.因为表上的大量不必要的索引可能会降低DML语句的性能,给数据库性能产生压力.所以生 ...

  7. oracle监控脚本【转】

    1. 监控事例的等待 select event,sum(decode(wait_Time,0,0,1)) "Prev", sum(decode(wait_Time,0,1,0)) ...

  8. Oracle监控的关键指标

    1.监控事例的等待 select event, , , )) "Prev", , , )) "Curr", count(*) "Tot" f ...

  9. 转 oracle 监控执行计划突然变化

    ########sample 执行计划突然变化 问题: 接受到一条信息,执行计划突然变化了. SELECT /*+ db120190621 no_expand */ INTERNAL_KEY FROM ...

随机推荐

  1. layui(二)——layer组件常见用法总结

    layer是layui的代表作,功能十分强大,为方便以后快速配置这里对其常见用法做了简单总结 一.常用调用方式 //1.普通消息:alert(content,[options],[yesCallBac ...

  2. centos 6.5 安装jdk1.8

    1.源码包准备: 首先到官网下载jdk-8u66-linux-x64.tar.gz, http://www.oracle.com/technetwork/java/javase/downloads/j ...

  3. SpringMVC的概念和图解

    1.概念 Spring MVC起步:慕课网视频 SpringMVC架构浅析:参考 Spring详解(一)------概述 Spring架构简单描述 2.图片

  4. JDK源码之ArrayList

    序言 ArrayList底层通过数组实现. ArrayList即动态数组,实现了动态的添加和减少元素 需要注意的是,容量拓展,是创建一个新的数组,然后将旧数组上的数组copy到新数组,这是一个很大的消 ...

  5. Image转Base64

    今天和一个朋友联调图片转Base64时发现一个问题 public static string ImageToBase64(Image img) { BinaryFormatter binFormatt ...

  6. Mono.Cecil

    Mono Cecil十分强大,强大到可以静态注入程序集(注入后生成新的程序集)和动态注入程序集(注入后不改变目标程序集,只在运行时改变程序集行为),它甚至可以用来调试PDB MDB调试符号格式文件. ...

  7. 如何利用iconfont图标代替小图片

    1.首先 你要有一个阿里巴巴矢量图这个网站的账号:http://www.iconfont.cn/ 在这里注册哦~ 2.蓝后 可以在首页搜索你想要的图标,比如 我想放一个管理员的图标在页面上: 就要点击 ...

  8. axis2客户端

    package com.yq.test; /** * Created by yangqing on 2016/12/6. */ import java.util.Date; import java.u ...

  9. PHP实现权限管理功能

    权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样. 首先先看下数据库 总共有5张表,users,roles和roleswork 3张表与另外2张表形 ...

  10. EF 复杂语句的使用

    //EF多重排序 context.Serials .Where(s => ("," + s.VideoGenreIds + ",").Contains(& ...