巧用nagios脚本监控oracle连接

场景:
程序修改完成后,上传到应用服务器tomcat,重启tomcat后,发现启动异常!前端nginx负载均衡出现504错误,网站无法打开!

排查:
经过排查tomcat日志,发现连接数据库异常;登陆数据库后以"conn /as sysdba"方式登陆正常,数据库轻载,无压力;于是检查数据库的监听器,输入"lsntctl services"命令,卡住,半天不出结果…

故障处理:
输入"lsntctl stop" 或者"lsntctl reload"命令,卡住,半天不出结果,于是输入service network restart命令,一样没有效果!于是出必杀技,输入"netstat -ntpl|grep :1521"命令找出监听器的进程号,kill -9结束掉,然后重启监听器,再启动tomcat正常,网站访问畅通无阻!

原因分析:
可能由于数据库bug的原因,出现监听器卡住的情况,导致数据库连接失败!参见:http://hi.baidu.com/hzcasper/blog/item/8bdf7449e350263d0bf7ef70.html

后期维护:
为了尽量避免这种问题,想到去写一个监控脚本配合nagios监控,当数据库连接异常的时候,可以第一时间收到报警短信;java程序连接数据库使用连接池,所以不一定会及时暴露出问题!

写一个脚本放任务计划中运行,定期去连接下数据库,查询下系统时间和数据库的状态,spool输出到临时文件上


  1. [root@server199 ~]# crontab -l  
  2. */5  *    *             *  *  /usr/local/nagios/libexec/connect_oracle.sh  
  3. [root@server199 ~]# cat /usr/local/nagios/libexec/connect_oracle.sh
    #!/bin/sh
    #functions: connect oracle server test
    #author:lw.yang
    #modify_date: 2012-02-22
  4. rm -rf /tmp/check_oracle.log
    export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1/
    $ORACLE_HOME/bin/sqlplus username/password@ip:1521/services_name <<EOF
    set echo off
    set feedback off
    spool /tmp/check_oracle.log
    alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
    select sysdate from dual;
    select name,open_mode from v\$database;
    spool off
    set echo on
    set feedback on
    EOF

再写一个脚本来根据临时文件来判断数据库是否正常,该脚本供nagios插件check_nrpe调用,之所以分两个脚本,中间使用临时文件,主要是出于权限问题的考虑,nagios本身带了一个check_oracle的插件,感觉不太适用,还需要在nagios服务器端安装oracle客户端,配置tnsnames.ora文件,设置oracle相关的环境变量等等…


  1. [root@server199 ~]# cat /usr/local/nagios/libexec/check_oracle.sh   
  2. #!/bin/sh  
  3. #functions: use monitor oracle server status with nagios nrpe plugin  
  4. #author:lw.yang  
  5. #modify_date: 2012-02-22  
  6.  
  7. STATE_OK=0 
  8. STATE_CRITICAL=2 
  9.  
  10. if  [ -f /tmp/check_oracle.log  ];then  
  11.       COUNT=$(grep -i 'READ WRITE' /tmp/check_oracle.log  |wc -l)  
  12.         if [ $COUNT -eq 1 ];then  
  13.         echo "connect oracle server normal..."  
  14.         exit $STATE_OK  
  15.         else  
  16.         echo "database not open"  
  17.         exit $STATE_CRITICAL  
  18.         fi  
  19.       else  
  20.       echo "can't connect to oracle server..."  
  21.       exit $STATE_CRITICAL  
  22. fi       

监控效果!

[root@server199 ~]# cat /tmp/check_oracle.log 
SQL> alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
SQL> select sysdate from dual;

SYSDATE                                                                         
-------------------                                                             
2012-02-23:10:10:03                                                             
SQL> select name,open_mode from v$database;

NAME      OPEN_MODE                                                             
--------- ----------                                                            
EPROWB2B  READ WRITE                                                            
SQL> spool off

 

巧用nagios脚本监控oracle连接

 本文转自斩月博客51CTO博客,原文链接http://blog.51cto.com/ylw6006/787496如需转载请自行联系原作者


ylw6006

上一篇:shell脚本的简单介绍


下一篇:JS实现局部打印和预览