डेटाबेस प्रतिकृति अब Oracle-to-Oracle कॉन्फ़िगरेशन तक सीमित नहीं है; Oracle-to-cloud और Oracle-to-BigQuery विभिन्न विकल्पों में से केवल दो हैं जिन्हें अब प्रतिकृति कॉन्फ़िगरेशन के लिए चुना जा सकता है। इन विन्यासों की एक अच्छी संख्या में गोल्डनगेट पसंद के उपकरण के रूप में निहित है, इसकी बहुमुखी प्रतिभा और विश्वसनीयता को देखते हुए। दुर्भाग्य से, जब ओरेकल को दूसरे प्लेटफॉर्म पर दोहराया जाता है, तो टेबल संशोधन जैसी क्रियाएं एक बंदर-रिंच को काम में ला सकती हैं। इस प्रकार, यह वांछनीय होगा कि गोल्डनगेट एक्सट्रैक्ट को संभालने की प्रत्याशा में इस तरह के बदलावों को इनायत से और जल्दी से बदल दिया जाए। आइए संभावित परिदृश्यों को देखें और कार्रवाई का सर्वोत्तम तरीका निर्धारित करें।
डीबीए का पहला विचार यूनिफाइड ऑडिटिंग हो सकता है, क्योंकि यह ऑडिट करने योग्य कार्यों के लिए जानकारी का खजाना प्रदान करता है। अफसोस कि 'ऑडिट टेबल' ऑडिट के लिए उपलब्ध विशेषाधिकारों की सूची में नहीं है:
SCOTT @ orcl> ऑडिट पॉलिसी बनाएं, परिवर्तन_टैब_पोल 2 विशेषाधिकार तालिका में बदलाव करें; विशेषाधिकार तालिका में बदलाव करें * पंक्ति 2 पर त्रुटि:ORA-46355:अनुपलब्ध या अमान्य विशेषाधिकार ऑडिट विकल्प। SCOTT @ orcl>
दिलचस्प बात यह है कि 'किसी भी तालिका को बदलें' विशेषाधिकार है ऑडिट करने योग्य, लेकिन यह ऑडिट नहीं करता है कि आप क्या सोच सकते हैं कि ऑडिट किया जाएगा:
SCOTT @ orcl> ऑडिट पॉलिसी बनाएं टेबल_पोल 2 विशेषाधिकार कोई भी टेबल बनाएं, कोई टेबल बदलें, कोई टेबल ड्रॉप करें; ऑडिट पॉलिसी बनाई गई। SCOTT @ orcl> ऑडिट पॉलिसी टेबल_पोल; ऑडिट सफल हुआ।ऐसी नीति केवल अन्य उपयोगकर्ताओं को ऐसे विशेषाधिकार देने का लेखा-जोखा करती है और हो सकता है कि हमेशा एक लेखा परीक्षा रिकॉर्ड प्रस्तुत न करे। ऑडिटिंग द्वारा आवश्यकता अभी तक पूरी नहीं हुई है इसलिए एक और समाधान तैयार किया जाना चाहिए। सौभाग्य से, Oracle सिस्टम-स्तरीय ट्रिगर प्रदान करता है जो ऐसे कार्यों के लिए ऑडिट रिकॉर्ड तैयार कर सकता है। यह कैसे किया जा सकता है इसका एक उदाहरण नीचे दिखाया गया है। उत्पन्न किए गए ऑडिट रिकॉर्ड को शामिल करने के लिए पहले एक तालिका बनाई जाती है:
तालिका बनाएं ddl_log (ऑपरेशन varchar2(30),obj_owner varchar2(35),object_name varchar2(35),sql_text varchar2(200),attempt_by varchar2(35),attempt_dt टाइमस्टैम्प); ddl_log(obj_owner, संचालन) पर इंडेक्स ddl_log_idx बनाएं;रिपोर्ट बनाने में तेजी लाने के लिए तालिका को obj_owner और संचालन पर अनुक्रमित किया गया है। इसके बाद एक ट्रिगर उस उपयोगकर्ता के रूप में बनाया जाता है जिसके पास सभी CREATE, ALTER और DROP निष्पादित किए गए कथनों को लॉग करने के लिए निगरानी की जाने वाली तालिकाएँ होती हैं:
ddl_log.ऑपरेशन% प्रकार बनाने या बदलने या छोड़ने से पहले ट्रिगर ddl_trigger बनाएं या बदलें; sql_text ora_name_list_t; मैं pls_integer; मैं शुरू:=sql_txt (sql_text); अगर i =1 फिर ddl_log में डालें ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name, sql_text(1), उपयोगकर्ता, डुअल से v_systimestamp चुनें; elsif i =2 फिर ddl_log में डालें ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name, sql_text(1)||sql_text(2), उपयोगकर्ता, डुअल से v_systimestamp चुनें; elsif i>=3 फिर ddl_log में डालें ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name, sql_text(1)||sql_text(2)||sql_text(3), उपयोगकर्ता, डुअल से v_systimestamp चुनें; अंत अगर;अंत ddl_trigger;/
चूंकि SQL टेक्स्ट के 64-बाइट 'टुकड़े' की संख्या काफी बड़ी हो सकती है, इसलिए ट्रिगर SQL_TEXT कॉलम को पहले तीन 'टुकड़ों' तक सीमित कर देता है, जिससे स्ट्रिंग की अधिकतम लंबाई 192 वर्ण हो जाती है। जैसा कि बड़े बयानों के लिए अपेक्षित है, पूरा पाठ प्रदान नहीं किया जाएगा, लेकिन इसे किसी भी 'परिवर्तन तालिका' कथन को पूरी तरह से कैप्चर करना चाहिए। ध्यान दें कि यह ट्रिगर न केवल ALTER TABLE स्टेटमेंट्स को कैप्चर करेगा बल्कि डेटाबेस में सबमिट किए गए किसी भी CREATE/ALTER/DROP स्टेटमेंट को भी कैप्चर करेगा। इसका मतलब है कि उपयोगकर्ता को बदलें, ट्रिगर बदलें, पैकेज बदलें, फ़ंक्शन बदलें, टेबलस्पेस बदलें, सिस्टम बदलें, बनाएं ... और ड्रॉप करें ... स्टेटमेंट भी DDL_LOG टेबल में लॉग हो जाते हैं। इस वजह से, तालिका तेजी से बढ़ सकती है और काफी बड़ी हो सकती है, इस प्रकार एक सीमित इतिहास रखने की योजना बनाई जानी चाहिए। अधिकांश प्रणालियों के लिए, डेटाबेस में तालिका परिवर्तनों को ट्रैक करने के लिए 90 दिन पर्याप्त होने चाहिए। लॉग किए गए डेटा से उत्पन्न रिपोर्ट को हटाए जाने से पहले लंबे समय तक (उदाहरण के लिए, 12 महीने) रखा जा सकता है।
तालिका डेटा के प्रबंधन के लिए एक नमूना स्क्रिप्ट नीचे दी गई है; यह डेटा की 90-दिन की विंडो लागू करता है। एक लॉग निर्देशिका बनाई जाती है:
mkdir -p /u01/app/oracle/ddl_chg/purge_logs
DDL_LOG से पुराने रिकॉर्ड को शुद्ध करने के लिए एक SQL स्क्रिप्ट लिखी जाती है:
कॉलम sys_date new_value dt noprintcolumn name new_value db_nm noprintto_char(sysdate,'RRRRMMDD') sys_date को डुअल से चुनें;v$डेटाबेस से नाम चुनें;स्पूल /u01/app/oracle/ddl_chg/purge_logs/ddl_log_purge_&$dt.nm। लॉगसेट इको ऑन ---- रिकॉर्ड हटाने के लिए स्लेटेड - डीडीएल_लॉग से चुनें जहां प्रयास_डीटीजाहिर है, यह सीधे क्रॉन (या किसी भी समान शेड्यूलर) से नहीं चल सकता है, इसलिए एक रैपर स्क्रिप्ट की आवश्यकता है:
#!/bin/ksh## purge_ddl_log_90.sh## DDL_LOG तालिका से पुराने ऑडिट रिकॉर्ड को शुद्ध करने के लिए शेल स्क्रिप्ट### चयनित डेटाबेस खोजें और परिवेश सेट करें#सेट-ए डेटाबेस `ps -ef | ग्रेप [पी] सोम | ग्रेप '<नाम>' | awk -F"_" '{print $3}' for i in ${database[@]}## डेटाबेस के लिए परिवेश सेट करें#do ORACLE_SID=$i निर्यात ORACLE_SID ORAENV_ASK=NO निर्यात ORAENV_ASK अनसेट ORACLE_BASE निर्यात ORACLE_BASE पथ=$PATH:। /oraenv -s LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/precomp/सार्वजनिक निर्यात LD_LIBRARY_PATH PATH=$ORACLE_HOME/bin:$PATH निर्यात पथ## SQL*Plus प्रारंभ करें और स्क्रिप्ट निष्पादित करें# PATH /nolog < शेल स्क्रिप्ट ps कमांड के आउटपुट के आधार पर उचित वातावरण और ORACLE_SID सेट करती है। खोज करने के लिए डेटाबेस नाम और ORACLE_HOME स्थान प्रदान करने के लिए स्क्रिप्ट को संपादित करने की आवश्यकता होगी। | . का उपयोग करके एक से अधिक डेटाबेस नाम निर्दिष्ट किए जा सकते हैं विभाजक के रूप में:
'abd|def|ghi|jkl'यह प्रत्येक डेटाबेस में DDL_LOG तालिका को शुद्ध करने का एक तरीका प्रदान करता है जहां यह तालिका/ट्रिगर संयोजन स्थापित किया गया है। प्रत्येक डेटाबेस के लिए पर्ज ट्रेल्स को अलग रखने के लिए लॉग फ़ाइल नाम में डेटाबेस नाम शामिल है। निगरानी की जा रही प्रणाली की भंडारण सीमा को पूरा करने के लिए लॉगफाइलों को रखने की अवधि को बदला जा सकता है।
DDL_LOG तालिका में पाए गए डेटा से परिवर्तन रिपोर्ट तैयार की जा सकती हैं:
सेट लाइनसाइज 140कॉलम sdate new_value sdt noprintselect to_Char(sysdate, 'RRRRMMDDHH24')sdate from dual;column modlen new_value mlen noprintselect 'a'||nvl(max(length(modification)),25) modlen From(select obj_owner Owner , object_name टैबनाम, सबस्ट्र (sql_text, instr (sql_text, 'संशोधित')) संशोधन, ddl_log से प्रयास_dt mod_time (instr (sql_text, 'तालिका बदलें')> 0 या instr (sql_text, 'वैकल्पिक तालिका')> 0)); कॉलम objlen new_value ओलेन नोप्रिंटसेलेक्ट 'ए' ) संशोधन, try_dt mod_timefrom ddl_logwhere (instr(sql_text, 'तालिका बदलें')> 0or instr(sql_text, 'ALTER TABLE')> 0));स्तंभ संशोधन प्रारूप &mlencolumn mod_time प्रारूप a29column tab_name प्रारूप और मालिक का चयन करें||'।'|| tabname tab_name, संशोधन, mod_timefrom (obj_owner स्वामी का चयन करें, object_name tabname, substr (sql_text, instr (sql_text, 'add')) संशोधन, try_dt mod_timefrom ddl_logजहां instr (निचला (sql_text), 'तालिका बदलें')> 0unionselect obj_owner स्वामी, object_name tabname, substr(sql_text, instr(sql_text, 'drop')) संशोधन, try_dt mod_timefrom ddl_logwhere instr(lower(sql_text), 'alter table')> 0unionselect obj_owner मालिक, object_name tabname, substr(sql_text, instr(sql_text, 'modify) ')) संशोधन, try_dt mod_timefrom ddl_logजहां instr(निचला(sql_text), 'तालिका बदलें')> 0unionselect obj_owner मालिक, object_name tabname, substr(sql_text, instr(sql_text, 'ADD')) संशोधन, try_dt mod_timefrom ddl_logजहां instr(निचला (निचला) sql_text), 'तालिका बदलें')> 0unionselect obj_owner मालिक, object_name tabname, substr(sql_text, instr(sql_text, 'DROP')) संशोधन, try_dt mod_timefrom ddl_logजहां instr(लोअर (sql_text), 'टेबल बदलें')> 0unionselect obj_owner मालिक , वस्तु _नाम टैबनाम, सबस्ट्र (sql_text, instr (sql_text, 'MODIFY')) संशोधन, प्रयास_dt mod_timefrom ddl_logजहां instr (निचला (sql_text), 'तालिका बदलें')> 0) dl जहां निचला (dl. संशोधन) '% तालिका%' पसंद नहीं है और mod_time>=trunc(systimestamp)1, 3spool /u01/app/oracle/ddl_chg/log/tab_chg_rpt_&sdt._&1..lst/spool offद्वारा ऑर्डर करेंडेटाबेस का नाम स्क्रिप्ट को दिया जाता है, इसलिए इसे रिपोर्ट फ़ाइल नाम में शामिल किया जाएगा। कोड केवल तालिका परिवर्तन (इसलिए UNION प्रश्नों की लंबी स्ट्रिंग) पर रिपोर्ट करता है और नीचे दिखाए गए के समान रिपोर्ट तैयार करता है:
TAB_NAME संशोधन MOD_TIME------------------------------------------ ------------------------------ SCOTT.DDL_LOG संशोधित sql_text varchar2(200) 23-नवंबर-19 01.23.49.859971 अपराह्नस्क्रिप्ट संभावित रूप से लाइन की लंबाई को कम करने के लिए संग्रहीत डेटा की अधिकतम लंबाई के आधार पर कॉलम स्वरूपण भी सेट करती है। टाइमस्टैम्प डेटा का उपयोग जनरेट किए गए परिवर्तन रिकॉर्ड के लिए दिनांक और दृश्य समय मान दोनों प्रदान करने के लिए किया गया था। इन लिपियों का परीक्षण किया गया है, लेकिन ऑपरेटिंग सिस्टम विक्रेता के Linux/Unix के कार्यान्वयन के आधार पर कुछ संशोधनों की आवश्यकता हो सकती है।
उन डीबीए के लिए जो प्रतिकृति सिस्टम नहीं चला रहे हैं, उनके लिए यह ज्यादा काम का नहीं हो सकता है। लेकिन, Oracle से अन्य सिस्टम (जैसे BigQuery, स्नोफ्लेक और इसी तरह) में डेटा की नकल करने वालों के लिए, यह जानना कि तालिका में परिवर्तन कब हुए हैं, उन परिवर्तनों द्वारा बनाई गई प्रतिकृति विफलताओं से निपटना आसान बना सकता है। जितनी तेजी से प्रतिकृति प्रक्रिया वापस पटरी पर आ सकती है उतनी ही तेजी से सिस्टम जो उस प्रतिकृति डेटा पर भरोसा करते हैं, कार्यक्षमता पर वापस आ सकते हैं।
# # #
डेविड फिट्ज़जारेल . के लेख देखें