f 用Perl 寫了一隻在Oracle DR 資料庫清理archive log 的程式 ~ 迪貝之家

用Perl 寫了一隻在Oracle DR 資料庫清理archive log 的程式

我是第一次寫Perl DBI 存取Oracle,它打Patch的程式很多都是用Perl寫的,我就去看了datapatch裡頭的程式碼,一層一層去找可以參考的某隻程式,就找到了這一隻sqlpatch.pm,我不用看懂裡頭寫什麼,我只需要知道他們是怎麼調用library 及怎麼寫相應的Oracle語法就好了,因為我會用的perl binary 也是Oracle已經compile在它的環境裡頭的
基本上,就是找出正在apply的序號,只要比它小的,就是砍掉

use strict;
use DBI;
use DBD::Oracle ;
use warnings;
use v5.16;

my $dbi_connect_string = "dbi:Oracle:";
my %connect_properties;
$connect_properties{RaiseError} = 0;
$connect_properties{PrintError} = 0;
$connect_properties{AutoCommit} = 1;
$connect_properties{ora_session_mode} = DBD::Oracle::ORA_SYSDBA;
my $db_user="";
my $db_password="";
my $dbh = DBI->connect($dbi_connect_string, $db_user, $db_password,\%connect_properties);
 die "Unable for connect to server $DBI::errstr" unless $dbh;
my $sth;
my $applying_seq;
$sth = $dbh->prepare("select min(SEQUENCE#) from v\$MANAGED_STANDBY where status = 'APPLYING_LOG'");
        if($sth->execute) {
                 $applying_seq = $sth->fetchrow;
       }
$sth->finish();
$dbh->disconnect();
my $dirname = "/oradata/TEST/arch/*1002815719.dbf";
 foreach my $filename (glob($dirname)){
     my $atrestseq =  (split /_/,$filename)[1];
     unlink $filename if ( $applying_seq >  $atrestseq) ;  

}

不清理的話~~  就把你的filesystem 給塞爆了!!
我原本想說,用opendir的函式,可是用了它之後,在處理它的block裡頭就一直出現Use of uninitialized value in numeric lt (<)這個錯誤,不管是用while還是foreach來處理都一樣,最後就找了glob來處理,不然原本是照tutorials網站上的語法來修改的

opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
while( ($filename = readdir(DIR))) {
   print("$filename\n");
}
closedir(DIR);
原因不明,待未來的日子研究吧!!