2012-09-01 32 views
5

Veritabanından A çok sayıda veri almak, bu verilerle bazı manipülasyonlar yapmak ve sonra manipüle edilmiş veriyi veri tabanına eklemek için büyük bir işlem var. Yalnızca izinlerim var A veritabanında seçmek için , ancak tablolar oluşturmak ve B veritabanında ekleme/güncelleştirme vb. olabilir. perl dbi ile uzun süreli büyük işlemlerin yürütülmesi

Manipülasyon ve ekleme bölümü, diğer veri kaynaklarından B veritabanına veri yüklemek için kullanılan ve zaten kullanımda olan tüm gerekli olan A veri tabanından gerekli verileri almak ve perl sınıflarını başlatmak için kullanmaktır.

Bunu yapmak için nasıl yapabilirim? Geri alma ve düzeltme veya ekleme yordamları sırasında herhangi bir hata oluşması durumunda hataların nerede olduğunu kolayca bulabilirim (veritabanı bağlantısı kesilmesi, geçersiz değerler nedeniyle sınıf başlatmayla ilgili sorunlar, sabit disk başarısızlık vb ...)? İşlemin tek seferde yapılması iyi bir seçenek gibi görünmemektedir, çünkü A veri tabanından elde edilen miktar verileri, veri manipülasyonu ve veri tabanına girmek için en az bir gün veya 2 alacağı anlamına gelmektedir.

A veri tabanındaki veriler Her biri 1000'er satır içeren her bir anahtarla benzersiz anahtarlar kullanarak yaklaşık 1000 gruba ayrılabilir. Yapabileceğimi düşündüğüm yollardan biri, grup başına taahhüt veren bir betik yazmaktır. Bu da, hangi grubun daha önce B veritabanına girildiğini izlemem gerekiyordu. Hangi grupların ilerlemesini izlemeyi düşünebilmemin tek yolu. işlenmiş ya da değil, bir günlük dosyasında ya da B veritabanında bir tabloda. Çalıştırılabileceğini düşündüğüm ikinci bir yöntem, bir düz dosyaya ekleme ve ekleme için sınıfları yüklemek için gereken tüm gerekli alanları dökmek, dosyayı başlatmak için okumaktır sınıfları ve B veritabanına eklemek. Bu aynı zamanda, bazı günlük işlemleri yapmak zorunda olduğum anlamına gelir, ancak herhangi bir hata oluşursa, düz dosyadaki tam satıra kadar daraltması gerekir. komut dosyası aşağıdaki gibi görünecektir: Herhangi bir hata oluşursa yoksa

use strict; 
use warnings; 
use DBI; 

#connect to database A 
my $dbh = DBI->connect('dbi:oracle:my_db', $user, $password, { RaiseError => 1, AutoCommit => 0 }); 

#statement to get data based on group unique key 
my $sth = $dbh->prepare($my_sql); 

my @groups; #I have a list of this already 

open my $fh, '>>', 'my_logfile' or die "can't open logfile $!"; 

eval { 
    foreach my $g (@groups){ 
     #subroutine to check if group has already been processed, either from log file or from database table 
     next if is_processed($g); 

     $sth->execute($g); 
     my $data = $sth->fetchall_arrayref; 

     #manipulate $data, then use it to load perl classes for insertion into database B 
     #. 
     #. 
     #. 
    } 
    print $fh "$g\n"; 
}; 
if ([email protected]){ 
    $dbh->rollback; 
    die "something wrong...rollback"; 
} 

Yani, sadece tekrar bu komut dosyasını çalıştırabilir ve işlenmiş olan gruplar veya satırları atlayarak devam etmelidir.

Her iki yöntem de aynı temada yalnızca varyasyonlardır ve her ikisi de ilerlememi (tablo veya dosya) izlediğim yere geri gitmeyi gerektirir, B veritabanına taahhüt edilenleri atlar ve kalan veriler.

Eminim bunu yapmanın daha iyi bir yolu var ama diğer çözümleri düşünmek için uğraşıyorum. Birinden veri alıp diğerine yerleştirme arasında veri manipülasyonu gerektiren veritabanları arasında büyük işlemlerin ele alınmasının başka bir yolu var mı? Perl sınıflarını veriyi manipüle etmek ve veritabanına eklemek için yeniden kullanabildiğim sürece sürecin Perl'de olması gerekmiyor.

cevap

2

Bunu söylediğim için üzgünüm, ancak bu sorunu kısa bir yoldan nasıl çözebileceğinizi gerçekten anlamıyorum. Eğer ettik gibi bana geliyor olsa en makul yolları hakkında:

  • kaydet bazı geçici tablo/dosyadaki devlet (ben sqlite "kravat -f perldoc" içine bakmak veya ediyorum) her adımda
  • de Eğer
  • düzgün yani yapılandırılmış günlükleri hatalarınızı Log tercih ne olursa olsun
  • Kol hataları düzgün TryCatch.pm, eval veya önceki günlüğüne ve veri ve denemeden de okur betiğinize bazı "özgeçmiş" bayrağını ekleyin
  • okuyabilirsiniz tekrar

This i Muhtemelen düşündüğünüz hatlar boyunca, ama dediğim gibi, sorununuzu çözmenin genel bir “doğru” yolu olduğunu sanmıyorum.geribildirim için

+0

teşekkürler, ben her ihtimale karşı herhangi bir alternatif Ben çok dar düşünüyordum olup olmadığını görmek istedim ve daha basit/bariz bir şey kaçırmış – 1stdayonthejob

İlgili konular