GVKun编程网logo

oracle 监控(oracle监控软件)

28

关于oracle监控和oracle监控软件的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于12.Oracle杂记——Oracle等待事件性能监控脚本、13.Oracle杂记——Oracle

关于oracle 监控oracle监控软件的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于12.Oracle杂记——Oracle等待事件性能监控脚本、13.Oracle杂记——Oracle错误故障诊断监控脚本、14.Oracle杂记——Oracle SQL监控脚本、15.Oracle杂记——Oracle诊断磁盘IO监控脚本等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

oracle 监控(oracle监控软件)

oracle 监控(oracle监控软件)

python 代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import subprocess
import sys
import re


def run_cmd(cmd, cwd=None, runas=None):
    if not sys.platform.startswith(''win'') and runas and runas != ''root'':
        cmd = ''su - {} -c "{}"''.format(runas, cmd)
    proc = subprocess.Popen(cmd,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT,
                            shell=True,
                            cwd=cwd)
    return proc


def get_os_oracle_user():
    cmd = '''''' ps -ef | grep ora_ | grep -v grep | awk ''{ print $1 }'' | uniq ''''''
    code, res = run_cmd(cmd)
    if code == 0:
        os_oracle_user = res
        return os_oracle_user
    else:
        print "获取运行database的操作系统用户失败...", res
        sys.exit(1)

def get_grid_user():
    cmd = ''''''ps -ef | grep asm_pmon | grep -v grep |uniq''''''
    return_code, result = run_cmd(cmd)
    if return_code == 0 and result:
        os_oracle_user = result.split(''\n'')[0].split()[0].strip()
        return os_oracle_user
    else:
        print "获取运行database的操作系统用户失败...", result
        sys.exit(1)

class Oracle_init():
    """所有监控oracle的基类"""
    def __init__(self, user=''monitoruser'', password=''123456''):
        try:
            if user == ''sysdba'':
                self.user = ''/ as sysdba''
            elif user and password:
                self.user = ''{0}/{1}''.format(user, password)
            else:
                self.user = None
            self.os_oracle_user=get_os_oracle_user()
        except Exception as err:
            print err
            sys.exit(1)

    def run_cmd(self,sid,cmd):
        cmd = r''''''su - {} -c "export ORACLE_SID={}
        sqlplus -S /nolog <<EOF
        conn /as sysdba;
        {}
        exit;
        EOF"''''''.format(self.os_oracle_user, sid,cmd)
        code, res = run_cmd(cmd)
        error=self.check_error(res)
        if error:
            print error
            sys.exit(1)
        else:
            return res

    def check_error(self,res):
        if re.search(r''ORA-01017'', res):
            error = ''账号或密码错误''
        elif re.search(r''ORA-01034'', res):
            error = ''数据库不可用''
        elif re.search(''ORA-\d+:[\s\S]*'', res):
            error = re.search(''ORA-\d+:[\s\S]*'', res).group()
        else:
            error = None
        return error

# 获取所有实例名
def get_sids():
    sids = ''''
    cmd = "ps -ef|grep -v grep |grep ora_pmon|awk ''{print $NF}''|sed ''s/ora\_pmon\_//''|uniq"
    code, res = run_cmd(cmd)
    if not code and res:
        sids = res.replace(''\n'', '' '')
    return sids


########判断ohasd状态##############
def get_oracleOhasdStatus():
    try:
        cmd = "ps -ef | grep ohasd.bin|grep -v grep"
        code,res=run_cmd(cmd)
        if code:
            return False
        else:
            return True
    except Exception as err:
        sys.stderr.write(err.__str__() + ''\n'')
        return False



################监听日志大小##############
def get_oracle_listenerLog(sid):
    try:
        global is_cluster
        if is_cluster:
            user=get_grid_user()
        else:
            user= get_os_oracle_user()
        cmd = ''su - {} -c "export ORACLE_SID={};'' \
              ''du -sm $ORACLE_BASE/diag/tnslsnr/`hostname`/listener/trace/listener.log"''.format(user,sid)
        code,res=run_cmd(sid, cmd)
        if not res:
            print ''未获得数据''
            sys.exit(1)
        else:
            return res.split()[0]
    except Exception as err:
        sys.stderr.write(err.__str__() + ''\n'')
        return -1

################监听trace文件# ##############
def get_oracleTrace(sid):
    try:
        global is_cluster
        if is_cluster:
            user = get_grid_user()
            cmd = ''su - {} -c "export ORACLE_SID={};cat $ORACLE_BASE/diag/asm/+asm/$ORACLE_SID/trace/alert_+ASM1.log |egrep \''ORA-|ERROR\''"''.format(
                user, sid)
        else:
            user = get_os_oracle_user()
            cmd=''su - {} -c "export ORACLE_SID={};cat $ORACLE_BASE/diag/rdbms/$DB_UNIQUENAME/$ORACLE_SID/trace |egrep \''ORA-|ERROR\''"''.format(
                user, sid)

        code, res = run_cmd(sid, cmd)
        if not res:
            print ''未获得数据''
            sys.exit(1)
        else:
            return res.split()[0]
    except Exception as err:
        sys.stderr.write(err.__str__() + ''\n'')
        return -1

if __name__==''__main__'':
    output = "metric=%s|value=%d|type=%s|tags=%s"
    print output % ("system.file.number", get_oracleOhasdStatus(), ''gauge'', '''')

    obj = Oracle_init(user=''monitoruser'', password=''123456'')

    sql_cmd = "select value from v\\\$parameter where name=''cluster_database'';"
    sids=get_sids()
    res=obj.run_cmd(sids[0],sql_cmd)
    res=res.split(''\n'')
    length=len(res)
    is_cluster=None
    for i in range(-1,-1-length,-1):
        if not i :
            continue
        if i.strip()==''False'':
            is_cluster=False
            break
        if i.strip()==''True'':
            is_cluster=True
            break
    if is_cluster is None:
        print ''无法判断是否是集群''
        sys.exit(1)

    for sid in sids:
        print output % ("system.file.number", get_oracle_listenerLog(sid), ''gauge'', '''')
        print output % ("system.file.number", get_oracleTrace(sid), ''gauge'', '''')

  

12.Oracle杂记——Oracle等待事件性能监控脚本

12.Oracle杂记——Oracle等待事件性能监控脚本

12.Oracle杂记——Oracle等待事件性能监控脚本

在第10篇中,列了一个执行脚本但是感觉还是太粗,缺少针对性。对此又进行了一些优化和雕琢。雕琢算不上,只是进行了揣摩。

原型脚本集成的命令太多太散,不能精确分析问题,所以进行了分治。

脚本名字从原先的select_dbinfo.exe改为dbwaiteventmon.exe

更加形象,当然其中和wait无关的监控后续也会重新进行整理。

考虑到数值动态变化,会话与系统统计数据的差异,各类相关信息区别和联系;蛤蟆初步规划如下,当然此处只是个规划,后续可能会改变。如有改变后续再加以说明,很多在可以图形化OEM点击得到,而且非常直观,此处实现用于学习目的和给文本爱好者的朋友。

等待事件监控:dbwaiteventmon.exe

用于错误故障诊断监控:dberrfind.exe

诊断磁盘IO类:dbiomon.exe

诊断内存命中类:dbhitratiomon.exe

诊断表索引类:dbtableindexmon.exe

诊断表空间类:dbtbspacetmon.exe

诊断sql类:dbsqlmon.exe

诊断进程类:dbprocessmon.exe

诊断会话类:dbsessionmon.exe

报告类:dbreport.exe

此篇主要是实现等待事件动态监控:dbwaiteventmon.exe

据说等待事件从ORACLE7.0.12开始的,对此不做任何评论,这种历史错了又何妨呢?

在12C 中共有等待事件:1650种,记住每个等待事件的可能性几乎是0. 如果能全记住,蛤蟆建议去参加最强大脑,但是生活中没记住可以查的,只要知道哪里可以查找即可。

主要分为IDLE和NON-IDLE的,我们关系NON-IDLE的等待。

当前实现的功能如下:

$ sh dbwaiteventmon.sh

Invalid Arguments!

pls use like this : ./dbwaiteventmon.exe [NUMBER ]

the NUMBER can be from 1 to 100

[1] show the wait event's parameters meaning

[2] show the specified SESSION's current all wait,you should specify the SESSIONID

[3] show the specified SESSION's history TOP 10 wait,you should specify theSESSION ID

[4] show ALL SESSION's current wait

[5] show SYstem's TOP 10 wait event (the statistical information begin withinstance started)

[6] show SYstem's latch wait,gets,misses,sleeps,need latch name input

[7] get the last Minuts's wait event,you can define how minutes

[8] get the waitevent which waited more than ? seconds,you can control thesecond number

[9] get database wait time ratio

共9个功能。

分别是:

1 显示等待事件的参数含义

2 显示指定会话的当前所有等待,需要输入会话ID

3 显示指定会话的TOP 10历史等待,需要输入会话ID

4显示所有会话的当前等待

5 显示系统TOP 10等待事件

6 显示SYstem LATCH的WAITS,GETS,MISSES,SLEEPS,需要输入LATCH名字

7 获取最后几分钟等待事件,可以定义多少分钟

8 获取 超过多少秒的等待事件,可以输入多少秒

9 获取数据库等待事件占总体的比例,这个颗粒度比较大。

后续蛤蟆会不断更新,如果有更新会直接传到CSDN上。

下载地址:http://download.csdn.net/detail/notbaron/9447082

后续几篇的小工具也已经一并打包到里面,大家可以直接下载尝试一下。

13.Oracle杂记——Oracle错误故障诊断监控脚本

13.Oracle杂记——Oracle错误故障诊断监控脚本

13.Oracle杂记——Oracle错误故障诊断监控脚本

错误故障诊断的脚本,还没实现多少,此处先放上来,后续继续完善会。

当前实现的功能如下:

$ sh dberrfind.sh

Invalid Arguments!

pls use like this : ./dberrfindmon.exe [NUMBER ]

the NUMBER can be from 1 to 100

[1] get hidden parameters

只是获取隐藏参数。

程序名字如下:dberrfind.exe

下载地址: http://download.csdn.net/detail/notbaron/9447082

14.Oracle杂记——Oracle SQL监控脚本

14.Oracle杂记——Oracle SQL监控脚本

14.Oracle杂记——Oracle sql监控脚本

根据第上一篇描述的,需要dbsqlmon.exe脚本来监控sql语句。

长时间运行的sql(超过6秒)可以通过监控V$SESSION_LONGOPS来观察。(包括很多备份、恢复函数,静态统计收集,查询执行等)

而监控数据被记录在V$sql_MONITOR视图中。V$sql_MONITOR收集的信息每秒刷新一次。当sql执行完毕后 ,至少会保留一分钟。

当前实现的功能如下:

$ sh dbsqlmon.sh

Invalid Arguments!

pls use like this : ./dbsqlmon.exe [ NUMBER]

the NUMBER can be from 1 to 100

[1] show the instance's sql monitor status

[2] report sql monitor

[3] tuning sql recommendations with exactly sql_ID

[4] get the session's execuing sql TEXT,need the SESSION_ID

[5] get the sql's explain,need the "sqlTEXT"

[6] get the sql's explain which cause session to wait. but you need input thewaitevent name

[7] get the last Mins's busiest sql,you can define how minuts

[8] get sid,sqltext,sql's waitevent of the executing sql

现在主要8个功能

1 显示实例sql监控状态

2 获取sql 监控 报告

3 获取sql ID 的调优建议

4 获取会话的当前正在执行的sql 文本

5 获取sql执行计划,需要输入sql文本(相关即可)

6 导致会话具体等待的sql执行计划,需要输入等待事件名字

7 获取最后几分钟最繁忙的sql

8 获取当前正在执行sql的SID,sqlTEXT,等待事件

程序名字如下:dbsqlmon.exe

下载地址: http://download.csdn.net/detail/notbaron/9447082

15.Oracle杂记——Oracle诊断磁盘IO监控脚本

15.Oracle杂记——Oracle诊断磁盘IO监控脚本

15.Oracle杂记——Oracle诊断磁盘IO监控脚本

继上面的监控脚本,这次是IO监控脚本

主要是系统IO相关类

执行功能如下

$ sh dbiomon.sh

Invalid Arguments!

pls use like this : ./dbiomon.exe [ NUMBER]

the NUMBER can be from 1 to 100

[1] show the db's file io statistic

[2] show the segment io statistic

[3] show the os's file system io statistic

主要功能如下:

1 显示数据库文件的IO 统计信息

2 显示段 IO统计信息

3 显示操作系统 文件系统的IO 统计信息

程序名字如下:dbiomon.exe

下载地址: http://download.csdn.net/detail/notbaron/9447082

关于oracle 监控oracle监控软件的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于12.Oracle杂记——Oracle等待事件性能监控脚本、13.Oracle杂记——Oracle错误故障诊断监控脚本、14.Oracle杂记——Oracle SQL监控脚本、15.Oracle杂记——Oracle诊断磁盘IO监控脚本等相关内容,可以在本站寻找。

本文标签: