2012-09-01 11 views
5

के साथ लंबे समय तक चलने वाले बड़े लेन-देन को संभालने में मुझे डेटाबेस ए से बहुत सारे डेटा प्राप्त करने के साथ एक बड़ा लेनदेन मिला है, इस डेटा के साथ कुछ जोड़-विमर्श करें, फिर डेटाबेस बी में मैनिपुलेटेड डेटा डालें। मुझे केवल अनुमतियां मिली हैं डेटाबेस ए में चयन करने के लिए, लेकिन मैं डेटाबेस बी में 0 टेबल और डालने/अद्यतन आदि बना सकता हूं।perl dbi

मैनिपुलेशन और सम्मिलन भाग perl में लिखा गया है और डेटा डेटा को अन्य डेटा स्रोतों से डेटा लोड करने के लिए पहले ही उपयोग में है, इसलिए यह सब कुछ है आवश्यक है डेटाबेस ए से आवश्यक डेटा प्राप्त करना और perl कक्षाओं को प्रारंभ करने के लिए इसका उपयोग करना।

मैं ऐसा करने के बारे में कैसे जा सकता हूं ताकि मैनिप्ल्यूशन या सम्मिलन प्रक्रियाओं (डेटाबेस डिस्कनेक्शन, अमान्य मानों, हार्ड डिस्क के कारण कक्षा प्रारंभिकता के साथ समस्या होने पर कोई त्रुटि उत्पन्न हो, तो मैं आसानी से वापस ट्रैक कर सकता हूं और त्रुटि कहां से उठा सकता हूं) विफलता आदि ...)? एक बार में लेनदेन करना अच्छा विकल्प नहीं लगता है क्योंकि डाटाबेस ए से डेटा डेटा का मतलब है कि डेटाबेस में मैनिपुलेशन और सम्मिलन के लिए कम से कम एक दिन या 2 लेना होगा।

डेटाबेस ए से डेटा अद्वितीय कुंजी का उपयोग करके लगभग 1000 समूहों में समूहित किया जाना चाहिए, जिसमें प्रत्येक कुंजी के साथ पंक्तियों के 1000s शामिल हैं। एक तरह से मैंने सोचा कि मैं ऐसा कर सकता हूं जो एक समूह लिखता है जो प्रति समूह करता है, जिसका अर्थ है कि मुझे यह ट्रैक करना होगा कि कौन सा समूह पहले ही डेटाबेस बी में डाला गया है। एकमात्र तरीका है कि मैं किस समूह की प्रगति को ट्रैक करने के बारे में सोच सकता हूं संसाधित किया गया है या नहीं, या तो लॉग फ़ाइल में या डेटाबेस बी में एक तालिका में है। दूसरा तरीका मैंने सोचा कि काम कर सकता है, एक फ्लैटफाइल में हेरफेर और सम्मिलन के लिए कक्षाओं को लोड करने के लिए आवश्यक सभी आवश्यक फ़ील्ड को डंप करना है, फ़ाइल को प्रारंभ करने के लिए पढ़ें कक्षाएं और डेटाबेस बी में डालें। इसका मतलब यह भी है कि मुझे कुछ लॉगिंग करना है, लेकिन अगर कोई त्रुटि होती है तो इसे फ्लैटफाइल में सटीक पंक्ति तक सीमित कर देना चाहिए। स्क्रिप्ट कुछ इस तरह दिखेगा:

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"; 
} 

तो अगर कोई त्रुटियां होती है, मैं तो बस इस स्क्रिप्ट फिर से चला सकते हैं और यह समूह या पंक्तियों को संसाधित किया गया है छोड़ने और जारी रखने चाहिए।

इन दोनों विधियों में एक ही विषय पर केवल भिन्नताएं हैं, और दोनों को मेरी प्रगति (तालिका या फ़ाइल में) पर वापस जाने की आवश्यकता है, उन डेटाबेस को छोड़ दें जिन्हें डेटाबेस बी में किया गया है और प्रक्रिया करें शेष डेटा

मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है लेकिन अन्य समाधानों के बारे में सोचने के लिए संघर्ष कर रहा हूं। क्या डाटाबेस के बीच बड़े लेन-देन को संभालने का एक और तरीका है जिसके लिए डेटा एक दूसरे से डेटा प्राप्त करने और दूसरे में डालने के बीच डेटा हेरफेर की आवश्यकता होती है? प्रक्रिया को पर्ल में सभी की आवश्यकता नहीं है, जब तक कि मैं डेटाबेस में डेटा को छेड़छाड़ करने और डालने के लिए पर्ल कक्षाओं का पुन: उपयोग कर सकता हूं।

उत्तर

2

ऐसा कहने के लिए खेद है, लेकिन मैं वास्तव में नहीं देखता कि आप एक छोटी कटौती करके इस समस्या को कैसे हल कर सकते हैं। मेरे लिए यह लगता है कि आप है, हालांकि सबसे उचित तरीकों के बारे में:

  • सहेजें कुछ अस्थायी तालिका/फ़ाइल में राज्य (मैं "टाई -f perldoc" इस पर गौर करना चाहते हैं, या SQLite) हर कदम
  • पर
  • हैंडल त्रुटियों को ठीक से TryCatch.pm, eval या जो भी आप पसंद करते हैं
  • अपने त्रुटियों को ठीक से, यानी संरचित लॉग लॉग ऑन करें आप
  • में पढ़ सकते हैं अपनी स्क्रिप्ट जो पिछले लॉग और डेटा और कोशिश करता में पढ़ता है करने के लिए कुछ "को फिर से शुरू" झंडा जोड़े फिर

यह मैं शायद आप जिन लाइनों पर सोच रहे थे, उनके साथ, लेकिन जैसा कि मैंने कहा, मुझे नहीं लगता कि आपकी समस्या को संभालने के लिए एक सामान्य "सही" तरीका है।

+0

प्रतिक्रिया के लिए धन्यवाद, मैं सिर्फ यह देखना चाहता था कि अगर मैं बहुत संकीर्ण सोच रहा हूं और कुछ आसान/स्पष्ट याद किया गया है तो कोई विकल्प था या नहीं – 1stdayonthejob