IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Scripts : Retard de réplication de base de données Oracle


Sujet :

Programmation et administration système Perl

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    Est-il possible d'avoir le log de la cron ?

    as tu un outils comme mysql administrator qui te donne la possibilité de monitorer les query sql, si oui utilise le pour voir le temps que prend ta commande avant de se terminer .

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Salut,

    Merci d'abord pour la réponse. Je n'ai plus de logs depuis quelques jours en fait, ce qui signifie que tout fonctionne bien a priori.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    From nagios@srvtrfparis01.rfo-tech  Mon Jul 19 15:57:20 2010
    Return-Path: <nagios@srvtrfparis01.rfo-tech>
    Received: from srvtrfparis01.rfo-tech (localhost.localdomain [127.0.0.1])
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1) with ESMTP id o6JDvKK5016853
    	for <nagios@srvtrfparis01.rfo-tech>; Mon, 19 Jul 2010 15:57:20 +0200
    Received: (from nagios@localhost)
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1/Submit) id o6JDvKoC016851;
    	Mon, 19 Jul 2010 15:57:20 +0200
    Date: Mon, 19 Jul 2010 15:57:20 +0200
    Message-Id: <201007191357.o6JDvKoC016851@srvtrfparis01.rfo-tech>
    From: root@srvtrfparis01.rfo-tech (Cron Daemon)
    To: nagios@srvtrfparis01.rfo-tech
    Subject: Cron <nagios@srvtrfparis01> export ORACLE_HOME=/opt/oracle/product/10.2.0/db && /usr/local/nagios/libexec/check_oracle_retard_station_perl -S RFOTAH1
    X-Cron-Env: <SHELL=/bin/sh>
    X-Cron-Env: <HOME=/home/nagios>
    X-Cron-Env: <PATH=/usr/bin:/bin>
    X-Cron-Env: <LOGNAME=nagios>
    X-Cron-Env: <USER=nagios>
     
    max :  ,009722222
    =  ,009722222
     
    From nagios@srvtrfparis01.rfo-tech  Mon Jul 19 15:59:17 2010
    Return-Path: <nagios@srvtrfparis01.rfo-tech>
    Received: from srvtrfparis01.rfo-tech (localhost.localdomain [127.0.0.1])
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1) with ESMTP id o6JDxHd4018080
    	for <nagios@srvtrfparis01.rfo-tech>; Mon, 19 Jul 2010 15:59:17 +0200
    Received: (from nagios@localhost)
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1/Submit) id o6JDxHGs018078;
    	Mon, 19 Jul 2010 15:59:17 +0200
    Date: Mon, 19 Jul 2010 15:59:17 +0200
    Message-Id: <201007191359.o6JDxHGs018078@srvtrfparis01.rfo-tech>
    From: root@srvtrfparis01.rfo-tech (Cron Daemon)
    To: nagios@srvtrfparis01.rfo-tech
    Subject: Cron <nagios@srvtrfparis01> export ORACLE_HOME=/opt/oracle/product/10.2.0/db && /usr/local/nagios/libexec/check_oracle_retard_station_perl -S RFOMAY1 
    X-Cron-Env: <SHELL=/bin/sh>
    X-Cron-Env: <HOME=/home/nagios>
    X-Cron-Env: <PATH=/usr/bin:/bin>
    X-Cron-Env: <LOGNAME=nagios>
    X-Cron-Env: <USER=nagios>
     
    max :  ,099166667
    =  ,099166667
     
    From nagios@srvtrfparis01.rfo-tech  Mon Jul 19 16:01:18 2010
    Return-Path: <nagios@srvtrfparis01.rfo-tech>
    Received: from srvtrfparis01.rfo-tech (localhost.localdomain [127.0.0.1])
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1) with ESMTP id o6JE1Imv019367
    	for <nagios@srvtrfparis01.rfo-tech>; Mon, 19 Jul 2010 16:01:18 +0200
    Received: (from nagios@localhost)
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1/Submit) id o6JE1I8X019365;
    	Mon, 19 Jul 2010 16:01:18 +0200
    Date: Mon, 19 Jul 2010 16:01:18 +0200
    Message-Id: <201007191401.o6JE1I8X019365@srvtrfparis01.rfo-tech>
    From: root@srvtrfparis01.rfo-tech (Cron Daemon)
    To: nagios@srvtrfparis01.rfo-tech
    Subject: Cron <nagios@srvtrfparis01> export ORACLE_HOME=/opt/oracle/product/10.2.0/db && /usr/local/nagios/libexec/check_oracle_retard_station_perl -S RFOGUY1
    X-Cron-Env: <SHELL=/bin/sh>
    X-Cron-Env: <HOME=/home/nagios>
    X-Cron-Env: <PATH=/usr/bin:/bin>
    X-Cron-Env: <LOGNAME=nagios>
    X-Cron-Env: <USER=nagios>
     
    max :  ,003611111
    =  ,003611111
     
    From nagios@srvtrfparis01.rfo-tech  Mon Jul 19 16:04:17 2010
    Return-Path: <nagios@srvtrfparis01.rfo-tech>
    Received: from srvtrfparis01.rfo-tech (localhost.localdomain [127.0.0.1])
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1) with ESMTP id o6JE4H8a021192
    	for <nagios@srvtrfparis01.rfo-tech>; Mon, 19 Jul 2010 16:04:17 +0200
    Received: (from nagios@localhost)
    	by srvtrfparis01.rfo-tech (8.13.1/8.13.1/Submit) id o6JE4GwC021190;
    	Mon, 19 Jul 2010 16:04:16 +0200
    Date: Mon, 19 Jul 2010 16:04:16 +0200
    Message-Id: <201007191404.o6JE4GwC021190@srvtrfparis01.rfo-tech>
    From: root@srvtrfparis01.rfo-tech (Cron Daemon)
    To: nagios@srvtrfparis01.rfo-tech
    Subject: Cron <nagios@srvtrfparis01> export ORACLE_HOME=/opt/oracle/product/10.2.0/db && /usr/local/nagios/libexec/check_oracle_retard_station_perl -S RFOGUAD1
    X-Cron-Env: <SHELL=/bin/sh>
    X-Cron-Env: <HOME=/home/nagios>
    X-Cron-Env: <PATH=/usr/bin:/bin>
    X-Cron-Env: <LOGNAME=nagios>
    X-Cron-Env: <USER=nagios>
     
    max :=
    La dernière, rien n'est complété car la base était parfaitement synchrone a ce moment là.
    Ensuite, non je ne possède pas d'outil pour regarder précisément le temps d'exécution des commandes SQL. Mais d'après les logs, ça prend environ 17 secondes.

    Un collègue m'a sorti la tête de l'eau en regardant un peu mon script. Et il s'avère (log de de cron a l'appui) que la commande s'exécute bien, le résultat est bien récupéré néanmoins, je l'interprète mal dans la boucle suivante lorsque le script est exécuté par le cron :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach $res (@sql) {
            @stream = split(/\t /, $res);
            if (length(@stream[0]) >= "2")
            {
                    $max=@stream[1];
                    printf("max :".$max."=".@stream[1]);
            }
    }
    Aletor!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    Ok Nickel,

    n'oublies pas le RESOLU alors

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Alors en fait, j'ai trouvé d'ou venait le problème. C'est que les valeurs (0,2 ; 2,53) arrivaient avec des "," et non pas des ".". Or en exécution locale je bénéficie des variables d'environnement qui s'occupe de transformer les "," en ".". Tandis qu'avec l'exécution par le cron, cette variable d'environnement n'est pas chargée.

    Il m'a donc fallut utiliser un :
    Et le compte est bon. Problème à la con mais alors qu'est ce que j'ai galéré pour trouver ça....

    EDIT : Impossible d'éditer mon 1er post... Donc je ne peux pas mettre le topic en résolu, merci a l'admin qui le fera :$

Discussions similaires

  1. [SQL] script de dump d'une base de donnée
    Par developpeur_mehdi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/03/2010, 08h17
  2. [PAMC11]Script de génération d'une base de données
    Par tbastien dans le forum Sybase
    Réponses: 1
    Dernier message: 22/04/2007, 01h03
  3. Réponses: 6
    Dernier message: 07/04/2007, 15h16
  4. Réponses: 4
    Dernier message: 15/05/2006, 15h54
  5. Réponses: 1
    Dernier message: 04/03/2006, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo