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