使用Oracle正则表达式监控应用到数据库的连接情况
NinGoo's blog

使用Oracle正则表达式监控应用到数据库的连接情况

Oracle从10g开始支持正则表达式,在一些特殊的应用场景下,可以发挥超乎想象的便利。

通过v$session,可以监控应用服务器到数据库的连接的情况。假设应用服务器的名字都是有规律的,典型的如字母+数字+.+后缀的格式,例如app123.idc1表示位于idc1机房的app应用的123机器。当然,机器名的规则要根据具体的场景来分析得出,本文以上述规则来演示如何利用正则表达式来得到每组不同的应用服务器到数据库的连接情况。

对于数据库来说,可能有多组不同的应用服务器需要连接。典型的监控指标可以包括:每组应用服务器的机器数,每组应用服务器当前总的连接数,每组应用服务器中单台最大的连接数,每组应用服务器中单台最少的连接数。通过如下的sql语句,使用正则表达式,可以轻松获取上述四个指标:

select b.machine,
         count(*) machine_nums,
         b.cnt total_sessions,
         max(a.cnt) max_sessions,
         min(a.cnt) min_sessions
from
    (select machine,count(*) cnt
       from v$session
      group by machine) a,
    (select regexp_replace(regexp_replace(machine,'[0-9]','#'),'#+','#') machine,
            count(*) cnt
       from v$session
      group by  regexp_replace(regexp_replace(machine,'[0-9]','#'),'#+','#')
     ) b
where regexp_replace(regexp_replace(a.machine,'[0-9]','#'),'#+','#')=b.machine
group by b.machine,b.cnt
MACHINE        MACHINE_NUMS TOTAL_SESSIONS MAX_SESSIONS MIN_SESSIONS
--------------- ----------- -------------- ------------ ------------
db#.idc#                  1            22            22           22
test#.idc#                2            10             5            5
appa#.idc#               30           166            10            5
appb#.idc#               17            18             2            1

上面的sql中,使用了正则表达式函数REGEXP_REPLACE将数字替换成#,以方便对同组应用的机器进行分组统计。只要根据相应的规则进行修改,就可以适用到不同的场景。然后利用该sql固定时间如五分钟来采集数据,就可以得到趋势展示,绘成图形,直观的分析应用服务器到数据库的连接情况。

本文网址:http://www.ningoo.net/html/2009/use_oracle_regexp_monitor_database_session.html

订阅到Google | 收藏到Del.icio.us | 推荐到鲜果

上一篇: 下一篇:
相关文章 随机文章

本文Tags: , ,

3 条评论

  • At 2009.09.30 15:58, P.Linux said:

    用正则和用LIKE进行匹配的时候,等效的语句哪个会快一点呢?
    在MySQL用EXPLAIN分析都是不采用索引的,但是如果是regexp ‘^a’和Like ‘a%’这样的,总是Like快一些,有时还不是快一点点。
    但是前后都匹配的regexp ‘^a.*b$’和LIKE ‘a%b’又是差不多的效率。
    是不是’a%’这种能一定程度上使用索引而EXPLAIN不能分析出来呢?

    • At 2009.09.30 16:49, NinGoo said:

      @P.Linux:所以说,判断语句是否优化,不能光凭实验去看执行是快还是不快,你必须要去理解数据库是如何执行语句的,为什么不同的执行方式会有不同的结果。那么如何去知道数据库是是怎么执行语句的,就要去看执行计划了。like ‘a%’这类是可以用到索引的,执行计划也是能看到的。

      • At 2009.09.30 17:39, P.Linux said:

        额,原来我建的索引类型不对,全文索引要采用Match才行。
        用BTREE索引以后Like和Regexp都可以在EXPLAIN看到type成了Index。
        对每种数据库的具体实现,还是有很大差别的,每种数据库的运行原理必须了解我才能提高。这次面试最大的收益就是了解了我在基础关系代数理论和数据库应用之间具体数据库实现的这层缺环,停留在应用层或浮在基础理论再过多少年我也提高不了,DBA不仅仅靠经验。
        就算这次进不了阿里系,知道自己缺哪块了,补上短板,一定能像Sky.Jian一样,从一个刚毕业的大学生迅速成长为一名优秀的DBA.
        祝你中秋&&国庆快乐~ ^_^


      (Required)
      (Required, will not be published)