Scripts : Retard de réplication de base de données Oracle
Bonjour,
Je me permet d'ajouter ce post au forum afin d'avoir un petit coup de pouce sur un script que je fais. Je me suis aussi adressé sur le forum Centreon mais pour l'instant, les réponses apporté ne m'ont pas permis de palier au problème rencontré. Vous l'aurez donc compris, ce scripts a pour but de s'interfacer avec Centreon.
Attaquons le vif du sujet, dans la boite ou je travail, nous utilisons les réplications de base de donnée depuis la France vers les DOM-TOM en streaming proposé par Oracle.
Le but de mon script est d'interroger les bases de données par le biais de sqlplus et d'un script retard2.sql.
Voici un exemple du résultat du script sur le retard de la base de Paris par rapport a celles des DOM-TOM. La requête est effectué presque instantanément :
Code:
1 2 3 4 5 6 7 8
| CAPTURE_FOR_MART .003611111
CAPTURE_FOR_REU .003611111
CAPTURE_FOR_MAY .003611111
CAPTURE_FOR_NC .003611111
CAPTURE_FOR_TAH .003611111
CAPTURE_FOR_GUAD .003611111
CAPTURE_FOR_SPM .914166667
CAPTURE_FOR_GUY .003611111 |
Or, le tableau ici présent ne me convient pas car il y a trop d'information. Je ne souhaite récupérer que la station qui possède le plus de retard.
Voici le script que j'utilise pour récupérer les informations que je souhaite :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #!/usr/bin/perl
############ check_oracle_retard ################
# Date : June 7 20010
# Author : XXXX
#################################################
# Description :
#Ce script permet de connaitre le retard des
#réplication des bases oracle. Usage strictement
#réservé la base RFOPARIS.
use strict;
use FindBin;
use lib "$FindBin::Bin";
use lib "/usr/lib/nagios/plugins";
use utils qw(%ERRORS);
#################################################
##### Plugin var init
##
my $test;
my @TABL;
my @stream;
my $max;
my $Nmax;
my $res;
my @sql;
my $export;
my $retard;
$Nmax="";
$max=0;
$retard="/usr/local/nagios/libexec/retard.txt.RFOPARIS";
##################################################
#################################################
#### Mise a jour du fichier
##
@sql = `/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOPARIS.world \@/usr/local/nagios/libexec/retard2`;
#################################################
##################################################
##### Script
##
foreach $res (@sql) {
@stream = split(/\t /, $res);
if (length(@stream[0]) >= "2")
{
if (@stream[1] > $max)
{
$max=@stream[1];
$Nmax=@stream[0];
}
}
}
if ($max < 1) {
$max = sprintf("%.3fH", $max);
`echo 'true\nReplication Oracle Streaming : OK $Nmax avec $max' > $retard`;
exit $ERRORS{'OK'};
}
elsif ($max >= 1 && $max < 2) {
$max = sprintf("%.3fH", $max);
`echo 'middle\nReplication Oracle Streaming : Warning $Nmax avec $max' > $retard`;
exit $ERRORS{'WARNING'};
}
elsif ($max >= 2) {
$max = sprintf("%.3fH", $max);
`echo 'false\nReplication Oracle Streaming : CRITICAL $Nmax avec $max' > $retard`;
exit $ERRORS{'CRITICAL'};
} |
Le script intérroge donc la base pour connaître le retard, puis transfert ça dans un fichier texte. Ensuite, depuis mon serveur de supervision j'utilise un autre script qui va parser le fichier texte en question pour mettre en forme mon résultat et l'interfacer avec Centreon. J'utilise un cron donc pour automatiser le lancement du script. Jusque là pas de problème, tout s'effectue parfaitement.
Par contre, lorsque je souhaite interroger les bases des DOM-TOM pour connaître le retard de Paris, c'est le drame. La requête prend environ 10 secondes, donc en exécution à la main, il n'y a aucun problème par contre par un cron je ne récupère rien.
Voici le script utilisé :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| #!/usr/bin/perl
######## check_oracle_retard_station ############
# Date : June 7 20010
# Author : XXXXXX
#################################################
use strict;
use FindBin;
use lib "$FindBin::Bin";
use lib "/usr/lib/nagios/plugins";
use Getopt::Long;
use utils qw(%ERRORS);
use vars qw($opt_S);
#################################################
#################################################
##### Plugin var init
##
my $max;
my $res;
my @TABL;
my @stream;
my @sql;
my $sql;
my $retard;
my $test;
Getopt::Long::Configure('bundling');
GetOptions
("S=s" => \$opt_S, "station=s" => \$opt_S);
$max=0;
$retard="/usr/local/nagios/libexec/retard.txt";
##################################################
##################################################
##### Verify Options
##
if (!$opt_S) {
printf("Argument -S non declare : Station de votre choix\nexemple : RFOGUY1, RFOMART1, RFOGUAD1, RFOTAH1, RFOMAY1, RFONC1, RFOSPM1, RFOREU1\n");
exit $ERRORS{'OK'};
}
if ($opt_S eq "RFOPARIS") {
printf("Argument -S non valide : Pour PARIS utiliser check_oracle_retard_perl\n");
exit $ERRORS{'OK'};
}
##################################################
#################################################
#### Mise a jour du fichier
##
if ($opt_S eq "RFOMART1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOMART1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOMART1";
}
if ($opt_S eq "RFOGUAD1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOGUAD1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOGUAD1";
}
if ($opt_S eq "RFOGUY1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOGUY1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOGUY1";
}
if ($opt_S eq "RFOSPM1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOSPM1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOSPM1";
}
if ($opt_S eq "RFOMAY1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOMAY1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOMAY1";
}
if ($opt_S eq "RFOTAH1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOTAH1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOTAH1";
}
if ($opt_S eq "RFONC1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFONC1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFONC1";
}
if ($opt_S eq "RFOREU1") {
@sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOREU1.world \@/usr/local/nagios/libexec/retard2`;
$retard="/usr/local/nagios/libexec/retard.txt.RFOREU1";
}
#################################################
#################################################
#### Script
##
foreach $res (@sql) {
@stream = split(/\t /, $res);
if (length(@stream[0]) >= "2")
{
$max=@stream[1];
}
}
if ($max < 1) {
$max = sprintf("%.3fH", $max);
$test = `echo \$ORACLE_HOME`;
`echo '$test true\nReplication Oracle Streaming : OK $opt_S avec $max' > $retard`;
exit $ERRORS{'OK'};
}
elsif ($max >= 1 && $max < 2) {
$max = sprintf("%.3fH", $max);
`echo 'middle\nReplication Oracle Streaming : Warning $opt_S avec $max' > $retard`;
exit $ERRORS{'WARNING'};
}
elsif ($max >= 2) {
$max = sprintf("%.3fH", $max);
`echo 'false\nReplication Oracle Streaming : CRITICAL $opt_S avec $max' > $retard`;
exit $ERRORS{'CRITICAL'};
} |
En executant le script à la main (en tant qu'utilisateur nagios) :
Code:
1 2 3 4 5
| # ./check_oracle_retard_station_perl -S RFOGUY1
# cat retard.txt.RFOGUY1
/opt/oracle/product/10.2.0/db
true
Replication Oracle Streaming : OK RFOGUY1 avec 0.001H |
Hors si je laisse cron l'executer (en tant qu'utilisateur nagios) :
Code:
1 2 3 4
| cat retard.txt.RFOGUY1
/opt/oracle/product/10.2.0/db
true
Replication Oracle Streaming : OK RFOGUY1 avec 0.000H |
Le retard n'est pas "normal" car sur divers test ou il y avait plus d'une heure de retard, le résultat affiché était quand même 0.000H.
Je me demande donc d'ou vient la source, même si je pense que ça vient du fait que cron ne patiente pas jusqu'à la fin de l'exécution de la commande.
Voilà tout, si vous pouvez me filer une piste que j'explorerais je vous en serais reconnaissant !
Désolé pour le pavé mais j'ai essayer de détailler d'expliquer un maximum. Je suis aussi ouvert à la critique, ayant "appris" le perl il y a 1 semaine. (System D)
Cordialement,
Aletor!