开发者社区> 科技探索者> 正文

巧用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

 

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


ylw6006

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何使用码匠连接 Oracle
目前码匠已经实现了与 Oracle 数据源的连接,能让您快速、高效地搭建应用和内部系统。
22 0
ORACLE 11g【安装流程】及部门问题解决,ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务 下
ORACLE 11g【安装流程】及部门问题解决,ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务 下
23 0
ORACLE 11g【安装流程】及部门问题解决,ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务 上
ORACLE 11g【安装流程】及部门问题解决,ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务 上
30 0
Jdbc连接Oracle数据库详细案例,占位符的使用
Jdbc连接Oracle数据库详细案例,占位符的使用
37 0
PLSQL连接Oracle数据库详细教程
PLSQL连接Oracle数据库详细教程
70 0
Python连接Oracle数据库完美教程
Python连接Oracle数据库完美教程
65 0
32位plsq 连接 64位Oracle
学习并了解32位plsq 连接 64位Oracle。
54 0
SpringBoot中连接oracle出现告警信息
前几日领导说需要连接友商的Oracle,然后读取友商的数据展示到页面来。工作还是需要做的嘛,虽然比较简单些,但是工作量还是有的(此处划水摸鱼了呢?)。为了演示连接成功和可以读取数据,我在本地搭建了一个Oracle,然后作为测试来模拟读取,后续只需要替换下连接器的连接即可。然后,在启动SpringBoot项目时,有一个很显眼的WARN红色字体在控制台打印出来了。
136 0
oracle学习4-连接,文件操作,交互命令
oracle学习4-连接,文件操作,交互命令
39 0
在使用MyBatis连接Oracle进行查询时遇到查询结果集不为空, 某些字段空值情况
在使用MyBatis连接Oracle进行查询时,出现运行结果正常,但是名字取值为空的情况
75 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
EasyDBforOracle— 基于阿里云的Oracle最佳实践
立即下载
Oracle云上最佳实践
立即下载
迁移 ORACLE 最佳实践
立即下载