Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28900
  • 博文数量: 8
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 08:51
文章分类
文章存档

2014年(8)

我的朋友

分类: Oracle

2014-05-25 17:42:46

   在日常工作中,有一些經常要處理的事情.
  1. 檢查oracle是否正常.
  2. oracle job運行是否正常. job有broken的, scheduler job運行FAILED.
  3. 業務數據一致性檢測.
  4. tablespace空間
  5. 有多個不同的數據庫, 每一台需檢測的不一樣
  6. nagios的 check_oracle_health需要定義很多server, 且不是很符合我的需求

  需要一種較為通用的nagios插件來處理,以簡化流程.
  我的解決方案是這樣子.
  1. 在oracle管理員帳戶中建立dt_nagios_check表, 保存需要check的sql .
  如有需求變更,  nagios插件不需修改, 只修改dt_nagios_check中的數據.

   

点击(此处)折叠或打开

  1. create table dt_nagios_check
  2. ( id number(4) not null,
  3.   check_sql varchar2(2000),
  4.   msg_ok varchar2(2000),
  5.   msg_warning varchar2(2000) ,
  6.   enable char(1) default 'Y' ,
  7.   constraints pk_dt_nagios_check primary key (id)
  8. );
  數據範例:
   每一台oracle按業務需求分別創建需檢核的sql.
  注意: check_sql只能是一個匯總後的錯誤總數. msg_ok或msg_warning中只能一個參數.
   如msg_ok為null,則表示檢測無數據時,nagios不顯示信息
 

点击(此处)折叠或打开

  1. insert into dt_nagios_check (id,check_sql,msg_ok,msg_warning) values
  2. (1, q'# SELECT count(*) FROM dba_scheduler_job_run_details WHERE log_date >SYSDATE-1 AND status<>'SUCCEEDED' #', 'Oracle Scheduler jobs Succeeded ','Warning: <%d> Scheduler jobs failed') ;

  3. insert into dt_nagios_check (id, check_sql, msg_warning) values
  4. (2, ' select sum(num_rows) from yy3mat.dt_data_check_logs ', 'Warning: <%d> yy3mat data check error') ;


  
  2. perl開發nagios 插件,抓dt_nagios_check中的sql,循環執行.   輸出報錯信息
 

点击(此处)折叠或打开

  1. #!/usr/bin/perl
  2. # nagios: -epn
  3. BEGIN {
  4.        $ENV{ORACLE_HOME} = "/usr/lib/oracle/11.2/client";
  5.        $ENV{NLS_LANG}="TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950";
  6.        $ENV{LD_LIBRARY_PATH} = "$ENV{ORACLE_HOME}/lib:/usr/lib";

  7. }
  8. use DBI;
  9. use strict;
  10. use warnings;
  11. #use utils ;
  12. use constant STATE_CRITICAL=>2 ;
  13. use constant STATE_WARNING=>1 ;

  14. #my ($username,$password,$cmd,$database) ;
  15. my $arg ;
  16. while ($arg = shift @ARGV) {
  17.         $main::username = shift @ARGV if ($arg eq "-u");
  18.         $main::password = shift @ARGV if ($arg eq "-p");
  19.         $main::database = shift @ARGV if ($arg eq "--db");
  20. }

  21. &usage($0) if ( $main::database eq "" ) ;

  22. # Connect to database
  23. my $dbh = DBI->connect( "dbi:Oracle:$main::database", $main::username, $main::password,
  24.         { PrintError => 1, AutoCommit => 0 } )
  25.         or &die_state(STATE_CRITICAL,"Cannot connect: $DBI::errstr\n\n");

  26. my $cnt = &check_nagios_dynsql ;
  27. $dbh->disconnect;

  28. exit( STATE_WARNING ) if ($cnt >0 ) ;
  29. exit 0 ;
  30. #-------------------------------------------



  31. sub die_state()
  32. {
  33.   my $aa = shift ;
  34.   printf shift ;
  35.   exit $aa ;
  36. }

  37. sub select_count()
  38. {
  39.     my $rs = $dbh->selectall_arrayref(shift );
  40.     return $rs->[0]->[0];

  41. }




  42. sub check_nagios_dynsql()
  43. {
  44.     printf("Database:%s\n",$main::database) ;

  45.     my ($cnt,$err) ;
  46.     $cnt =0 ;
  47.     my $sth = $dbh->prepare("SELECT check_sql,msg_ok,msg_warning FROM dt_nagios_check where enable='Y' order by id ");
  48.     $sth->execute();
  49.     while (my $data = $sth->fetchrow_hashref) {

  50.         $err = &select_count( $data->{CHECK_SQL}) ;
  51.         if ($err <=0) {
  52.             print $data->{MSG_OK}, "\n" if defined($data->{MSG_OK}) ;
  53.         } else {
  54.             printf($data->{MSG_WARNING}, $err) ;
  55.             print "\n";
  56.         }
  57.         $cnt += $err ;

  58.     }


  59.     return $cnt
  60. }


  61. sub usage()
  62. {
  63.         print <<_EOF_;
  64. usage: $0
  65.        [--db database] - the oracle database
  66.        [-u username] - the user for oracle
  67.        [-p password] - the oracle password
  68. _EOF_
  69.         exit(1);

  70. }


3. 配置nagios3服務
 

点击(此处)折叠或打开

  1. define command{
  2. command_name oracle_nagios_dynsql
  3. command_line /usr/local/nagios/plugins/check_oracle_dynsql.pl --db '$ARG1$' -u '$ARG2$' -p '$ARG3$'
  4. }



  5. define service{
  6. use oracle-service-yydg
  7. host_name oracle1.yydg.com.cn
  8. service_description oracle status oracle1
  9. normal_check_interval 15
  10. check_command oracle_nagios_dynsql!oracle1.yydg.com.cn!dbauser!dbapass
  11. }

4
  以上. 如無異常.即可運行.
  如想順利配置, 需要了解一些nagios,perl ,oracle相關知識.
  如想改為監控別的數據庫,如mysql, postgresql,sqlsever之類的. 也可按照這個思路修改check_oracle_dynsql.pl插件程序.

我的nagios+cacti運行的平台是跑在kvm上的256M內存的Debian Linux.
效果不錯.
如有更好的建議或方法,請與我聯絡. gangjh@gmail.com


阿飛
2014/01/25


 




 
 
阅读(1570) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~