Hi,

Since I do not believe that my computer suddenly has lost the ability to 
compare numbers correctly, I suppose there must be some mistake in my following 
code. To cut a long story short, the below sub 
1.      connects to a db, 
2.      gets the number of datafiles used by this db,
3.      gets the names of these datafiles, 
4.      gets the number of datafiles for this db from the filesystem,
5.      checks whether all the db's datafiles' pathes are within the $dbdir 
(from another function) 
6.      and finally compares whether the numbers of datafiles in the db and on 
the filesystem equal. 
        
And this is exactly the point: They equal for one database that I run a test 
against, but the logic says they differ!

CODE:

sub checkDatafiles {
    my $fnc = ( caller 0 )[$CALLER_ID];

    ### 1 ###
    # DB-Connect
    my $DBI;
    my $dbh = DBI->connect('dbi:Oracle:', '', '', {ora_session_mode=>2, 
RaiseError=>1, AutoCommit=>1}); # Connect zur DB
    if ( ! $dbh ) { # Error, wenn Connect nicht funktioniert
        LOGWARN("$fnc - Verbindung zu Datenbank $db fehlgeschlagen: 
$DBI::errstr\n");
        $rcs { "$fnc" } = (1);
    }

    ### 2 ###
    # Anzahl der Datafiles in der DB (View DBA_DATA_FILES)
    my $sql = "select count(*) from dba_data_files"; # SQL-Statement
    my $sth = $dbh->prepare($sql); # Ausführung vorbereiten
    my $anz_dbf_db = $dbh->selectcol_arrayref($sth); # holt alle Inhalte der 1. 
Spalte in eine Array-REFERNZ!!!
    $sth->finish();
    if ( ! @$anz_dbf_db ) { # Array-REFERENZ!!!, Error, wenn DB nicht gelesen 
werden kann
        LOGWARN("$fnc - Datenbank konnte nicht gelesen werden: $DBI::errstr\n");
        $rcs { "$fnc" } = (1);
    }
    DEBUG("$fnc - Anzahl Datafiles aus DB: @$anz_dbf_db\n");

    ### 3 ###
    # Namen der Datafiles in der DB (View DBA_DATA_FILES)
    my $sql2 = "select FILE_NAME from dba_data_files"; # SQL-Statement
    my $sth2 = $dbh->prepare($sql2); # Ausführung vorbereiten
    my $names_dbf_db = $dbh->selectcol_arrayref($sth2); # holt alle 
Datafilenamen in eine Array-REFERENZ!!!
    if ( ! @$names_dbf_db ) { # Array-REFERENZ!!!, Error, wenn DB nicht gelesen 
werden kann
        LOGWARN("$fnc - Datenbank konnte nicht gelesen werden: $DBI::errstr\n");
        $rcs { "$fnc" } = (1);
    }
    DEBUG("$fnc - Namen der Datafiles lt. DB: @$names_dbf_db\n");
    $sth2->finish();
    $dbh->disconnect();

    ### 4 ###
    # Anzahl der Datafiles im Filesystem
    my @dbfs_fs;
    foreach ( glob "$dbdir/*.dbf" ) { # alle Datafiles im Filesystem
        # DEBUG("$fnc - Datafile im FS: $_\n");
        if ( $_ ne "$dbdir/temp01.dbf" ) {
            push @dbfs_fs, $_;
        }
    }
    DEBUG("$fnc - Namen aller Datafiles im FS: @dbfs_fs\n");
    my $anz_dbf_fs = @dbfs_fs; # Anzahl der Datafiles im Filesystem
    INFO("$fnc - Anzahl Datafiles im Filesystem: $anz_dbf_fs\n");

    ### 5 ###
    # Pfade der Datafiles lt. DB prüfen - müssen alle in $dbdir liegen
    my @dbf_pfad_falsch;
    foreach my $dbf_db ( @$names_dbf_db ) {
        # DEBUG("$fnc - Datafile in DB: $dbf_db\n");
        if ( $dbf_db !~ /$dbdir/ ) {
            # DEBUG("$fnc - falscher Pfad: $dbf_db matcht nicht mit $dbdir\n");
            push @dbf_pfad_falsch, $dbf_db;
        } else {
            # DEBUG("$fnc - richtiger Pfad: $dbf_db matcht mit $dbdir\n");
        }
    }
    if ( @dbf_pfad_falsch ) {
            LOGDIE("ACHTUNG! Datafile(s) @dbf_pfad_falsch nicht im 
DB-Verzeichnis $dbdir!\n");
    }

    ### 6 ###
    if ( @$anz_dbf_db != $anz_dbf_fs ) { # wenn Anzahl der Datafiles ungleich   
<-- ERROR HERE!
        DEBUG("$fnc - vgl. @$anz_dbf_db != $anz_dbf_fs\n");
        my @dbfs_diff;
        if ( @$anz_dbf_db > $anz_dbf_fs ) { # mehr Datafiles in der DB als im FS
            LOGWARN("$fnc - ACHTUNG! Mehr Datafiles in der Datenbank 
(@$anz_dbf_db) als im Filesystem ($anz_dbf_fs)!\n");
            @dbfs_diff = grep 'MISSING', @$names_dbf_db;
        } elsif ( @$anz_dbf_db < $anz_dbf_fs ) { # mehr Datafiles im FS als in 
der DB
            DEBUG("$fnc - vgl. @$anz_dbf_db < $anz_dbf_fs\n");
            LOGWARN("$fnc - ACHTUNG! Mehr Datafiles im Filesystem ($anz_dbf_fs) 
als in der Datenbank (@$anz_dbf_db)!\n");
            foreach my $dbf_fs ( @dbfs_fs ) {
                if ( ! grep /$dbf_fs/, @$names_dbf_db ) {
                    DEBUG("$fnc - DBF $dbf_fs matcht nicht mit DB.\n");
                    push @dbfs_diff, $dbf_fs;
                }
            }
        } else {
            INFO("$fnc - Anzahl Datafiles in Datenbank und Filesystem 
ident.\n");
        }
        if ( @dbfs_diff ) {
            LOGWARN("$fnc - Fehlende(s) Datafile(s): @dbfs_diff\n");
        }
        $rcs { "$fnc" } = (1);
    }
}

OUTPUT:

2010/10/27 12:29:15 main::checkDatafiles - Anzahl Datafiles aus DB: 141
2010/10/27 12:29:15 main::checkDatafiles - Anzahl Datafiles im Filesystem: 141
2010/10/27 12:29:15 main::checkDatafiles - vgl. 141 != 141
2010/10/27 12:29:15 main::checkDatafiles - vgl. 141 < 141
2010/10/27 12:29:15 main::checkDatafiles - ACHTUNG! Mehr Datafiles im 
Filesystem (141) als in der Datenbank (141)!

I hope that the sense of my output can be understood, even if it is not in 
English...

Any help appreciated :-)

Kind regards, 
Nora 



Reply via email to