Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

वर्तमान परिवर्तन खोजने के लिए LogMiner का उपयोग करना

ऐसे अवसर हो सकते हैं जब डेटाबेस में हाल के परिवर्तनों की जांच करना और रिपोर्ट करना आवश्यक हो कि क्या, कब और किसके द्वारा बदला गया था। वर्षों से Oracle का DBMS_LOGMNR पैकेज ऐसे कार्यों के लिए उपलब्ध है, लेकिन इसके आह्वान को पूरी तरह से कवर नहीं किया गया है। पारंपरिक तरीके START_LOGMNR प्रक्रिया के लिए एक बुनियादी कॉल के साथ उपयोग के लिए लॉग माइनर तैयार करने के लिए ADD_LOGFILE () प्रक्रिया का उपयोग करते हैं। यह वर्तमान एससीएन के साथ प्रारंभिक बिंदु के रूप में उपयोगिता शुरू करता है। एक वैध प्रारंभिक SCN का चयन करके और उसे START_LOGMNR() कॉल पर प्रदान करके, लॉग माइनर को प्रारंभ करने का एक और तरीका है। इस लेख में, आप देखेंगे कि यह कैसे किया जा सकता है, और इस प्रक्रिया में, पीजीए आवंटन के साथ चिंता का एक संभावित क्षेत्र प्रकट होता है।

लॉग माइनर शुरू करने के लिए एक 'सादे वेनिला' स्क्रिप्ट को देखते हुए सामान्य प्रक्रिया कॉल की जाती है जो वर्तमान एससीएन के साथ लॉग माइनर शुरू करती है:

-----run_logmnr.sql---- लॉगफाइल्स जोड़ें और DBMS_LOGMNR को-- लगातार माइन आर्काइवलॉग्स-सेट लाइनसाइज 200 ट्रिम्सपूल को पेजसाइज 0 पर सेट करें ---- मौजूदा लॉगफाइल्स जोड़ें ---- स्टैंडबाय लॉगफाइल्स को छोड़ दें- - चयन करें 'exec dbms_logmnr.add_logfile (''' /tmp/add_logfiles.sql/spool off@/tmp/add_logfiles---- लॉगमिनर को कॉन्टिन्यूअस माइन मोड में शुरू करें--exec dbms_logmnr.start_logmnr(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS 

ध्यान दें कि सभी उपलब्ध रीडो लॉग लॉग माइनर शुरू करने से पहले जोड़े जाते हैं। एक अन्य विधि मौजूद है जो start_logmnr कॉल के लिए एक प्रारंभिक SCN की आपूर्ति करती है, जब तक कि डेटाबेस ARCHIVELOG मोड में चल रहा हो:

BEGIN DBMS_LOGMNR.START_LOGMNR( startScn => , endScn => , OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_LOGMNR.CONTINUOUS);/
 दिलचस्प बात यह है कि लॉग माइनर सत्र शुरू करने के लिए अंतिम SCN आवश्यक नहीं है। डेटाबेस ARCHIVELOG मोड में होना चाहिए ताकि CONTINUOUS_MINE विकल्प निर्दिष्ट किया जा सके क्योंकि लॉग माइनर स्वचालित रूप से प्रत्येक उपलब्ध संग्रहीत लॉग फ़ाइल को चलाने के रूप में स्वचालित रूप से जोड़ देगा। इस पद्धति का उपयोग किसी भी खोज को शुरू करने के लिए एक विशिष्ट SCN का उपयोग करने की अनुमति देता है; अंतिम SCN कोष्ठक खोज को निर्दिष्ट करना ताकि डेटा का केवल एक सीमित उपसमूह V$LOGMNR_CONTENTS दृश्य में वापस आ जाए और खोज के लिए एक रोक बिंदु प्रदान करे, ताकि दृश्य की एक क्वेरी समाप्त हो सके।

डेटाबेस अलर्ट लॉग की जाँच करके लॉग माइनर की प्रगति की निगरानी करना एक सरल कार्य है क्योंकि 'LOGMINER' के साथ चिह्नित प्रविष्टियाँ पंजीकृत हैं। एक पूर्ण प्रविष्टि में एक BEGIN और एक END लाइन शामिल होगी, जैसा कि नीचे दिखाया गया है:

Mon Oct 07 12:48:22 2019LOGMINER:सत्र के लिए माइनिंग लॉगफाइल समाप्त करें -2147482111 थ्रेड 1 अनुक्रम 9776, /oracle/archive/awcis/awcis_0000009776_0001_1008544071.arcMon Oct 07 12:48:22 2019LOGMINER:सत्र के लिए माइनिंग लॉगफाइल शुरू करें - 2147482111 थ्रेड 1 अनुक्रम 9777, /ओरेकल/आर्काइव/awcis/awcis_0000009777_0001_1008544071.arcMon अक्टूबर 07 12:48:36 2019LOGMINER:सत्र -2147482111 थ्रेड 1 अनुक्रम 9777, /ओरेकल/संग्रह/awcis/awcis_0000009777.0001_10085440 के लिए खनन लॉगफ़ाइल समाप्त करें। :48:36 2019LOGMINER:सत्र -2147482111 थ्रेड 1 अनुक्रम 9778, /oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon अक्टूबर 07 12:48:49 2019LOGMINER:सत्र के लिए खनन लॉगफ़ाइल समाप्त करें -2147482111 थ्रेड 1 अनुक्रम 9778, / oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:सेशन -2147482111 थ्रेड 1 सीक्वेंस 9779, /oracle/archive/awcis/awcis_0000009779_0001_1008544071.arc
के लिए माइनिंग लॉगफाइल शुरू करें।

स्थानीय Oracle सत्रों के लिए संख्याएँ धनात्मक पूर्णांक होती हैं; दूरस्थ सत्रों के लिए, पर्ल, पायथन, सी/सी ++ या अन्य भाषाओं जैसी उपयोगिताओं द्वारा शुरू किए गए नकारात्मक पूर्णांक देखे जाएंगे (ऊपर दिखाई गई प्रविष्टियां पायथन लिपि द्वारा शुरू की गई थीं)। लॉग फ़ाइल नाम ऑनलाइन फिर से करें लॉग और उपलब्ध संग्रहीत प्रतियों दोनों के माध्यम से चक्रित होंगे।

इस तरह से लॉग माइनर शुरू करने से 'मिसिंग लॉगफाइल' जैसी त्रुटियां भी हो सकती हैं, जब चयनित शुरुआती एससीएन या एससीएन रेंज अब फिर से स्ट्रीम में उपलब्ध नहीं है। लंबे समय से चल रहे प्रश्नों में ऐसी त्रुटियां आ सकती हैं। इसके अतिरिक्त, यदि उपलब्ध लॉग फ़ाइलों के संबंध में SCN सीमा से बाहर है, तो लॉग माइनर शुरू नहीं होगा, फेंकना:

पंक्ति 1 पर त्रुटि:ORA-01292:वर्तमान LogMiner सत्र के लिए कोई लॉग फ़ाइल निर्दिष्ट नहीं की गई हैORA-06512:"SYS.DBMS_LOGMNR" पर, पंक्ति 58ORA-06512:पंक्ति 2 पर

ऐसी त्रुटियों को दूर करने में मदद करने के लिए V$LOG दृश्य से FIRST_CHANGE# का चयन करने से लॉग माइनर सत्र के लिए मान्य प्रारंभिक बिंदु उपलब्ध होंगे; V$ARCHIVED_LOG के विरुद्ध एक समान क्वेरी का उपयोग करने से संग्रहीत फिर से की गई प्रतियों के लिए सभी उपलब्ध प्रारंभिक SCN वापस आ जाएंगे।

इस तरह से लॉग माइनर का उपयोग करने की यह एकमात्र जटिलता नहीं है। कितनी जानकारी वापस की जानी है, इस पर निर्भर करते हुए, लॉगमिनर प्रक्रिया बड़ी मात्रा में पीजीए मेमोरी आवंटित कर सकती है, जो अगर pga_aggregate_limit छोटी है, तो निम्न त्रुटि फेंक सकती है:

ORA-04036:इंस्टेंस द्वारा उपयोग की गई PGA मेमोरी PGA_AGGREGATE_LIMIT से अधिक है

सौभाग्य से यह एक घातक त्रुटि नहीं है। चूंकि पीजीए संसाधनों की अब आवश्यकता नहीं है, स्मृति को कहीं और उपयोग के लिए डेटाबेस में वापस छोड़ा जा सकता है। हालाँकि, उस मेमोरी को मेमोरी पूल में वापस लाने में वांछित से थोड़ा अधिक समय लग सकता है। एक विकल्प यह है कि pga_aggregate_limit को लॉग माइनर सत्रों के योग से अधिक सेट किया जाए जो त्रुटि को होने से रोक सकता है। आप कैसे जानते हैं कि उन सत्रों में कौन सी स्मृति आवंटित की जाती है? एक दृश्य, V$PROCESS_MEMORY_DETAIL, डेटाबेस में उपलब्ध है। लेकिन बिना किसी तैयारी के इस दृष्टिकोण को क्वेरी करने का प्रयास वापस आ जाएगा:

कोई पंक्ति नहीं चुनी गई।

यह एक अपेक्षाकृत छोटी समस्या है, लेकिन इसके लिए ओरेडबग उपयोगिता के उपयोग की आवश्यकता होती है। निम्न चरण डेटा को V$PROCESS_MEMORY_DETAIL में लोड करेंगे:

---- वर्तमान सत्र पहचानकर्ता सेट करें-- oradebug setmypid---- वांछित प्रक्रिया के PID का उपयोग करना--मेमोरी डेटा को डंप करना ---- यह V$PROCESS_MEMORY_DETAIL--oradebug pga_detail_get  को पॉप्युलेट करता है- --- वांछित डेटा प्राप्त करने के लिए दृश्य को क्वेरी करें-- चयन करें * v$process_memory_detail से;---- नए डेटा के साथ दृश्य को फिर से पॉप्युलेट करने के लिए-- बस oradebug pga_detail_get-- Statement--oradebug pga_detail_get  निष्पादित करें   

इन क्रियाओं को करने के लिए एक स्क्रिप्ट नीचे दिखाई गई है:

----ऑरेडबग कॉल्स के लिए वातावरण सेट करें--ऑरेडबग सेटमायपिडसेट इको ऑफ ट्रिम्सपूल ऑनसेट वेरिफाई ऑफ फंडेफाइन p_1अपरिभाषित p_2अपरिभाषित s1अपरिभाषित s2variable p1 नंबर वेरिएबल p2 नंबर कॉलम sys_date new_value sysdt noprintselect to_char(sysdate, 'MISS')DHH_date noprintselect to_char(sysdate, 'RRRRMMDDHH) --  सत्र की प्रक्रिया आईडी प्राप्त करें--कॉलम pid new_value p_1v$प्रक्रिया से pid चुनें जहां addr in (v$session से paddr चुनें जहां उपयोगकर्ता नाम ='' और sid =(अधिकतम (sid) से चुनें) v$session जहां उपयोगकर्ता नाम ='')); प्रारंभ :p1 :=&p_1;end;/---- डंप प्रक्रिया विवरण v$process_memory_detail--oradebug dump pga_detail_get &p_1spool &p_1._pga_stats_&sysdt..log--- -  के लिए सत्र की जानकारी प्राप्त करें--COLUMN alme HEADING "आवंटित MB" FORMAT 99999D9COLUMN usme HEADING "यूज्ड MB" FORMAT 99999D9COLUMN frme HEADING "Freeable MB" FORMAT 99999D9COLUMN उपयोगकर्ता नाम "Max MB" FORMAT प्रोग्राम 99999D9COLUMN उपयोगकर्ता नाम फ़ॉर्मैट a22COLUMN sid FORMAT a5COLUMN spid FORMAT a8column pid_remote फ़ॉर्मेट a12SET LINESIZE 300 सेलेक्ट s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) प्रोग्राम , s.process pid_remote, s.status, ROUND(pga_used_mem/1024/1024) usme, ROUND(pga_alloc_mem/1024/1024) alme, ROUND(pga_freeable_mem/1024/1024) frme, ROUND(pga_max_mem/1024/1024) mameFROM, v$sessionFROM v$प्रक्रिया pWHERE p.addr=s.paddrAND s.username ='' pga_max_mem,logon_time द्वारा आदेश;---- 30 सेकंड की नींद ---- सत्र की जानकारी फिर से प्राप्त करें--exec dbms_lock.sleep(30) कॉलम साइड new_value s1 noprintSELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) प्रोग्राम, s.process pid_remote, s.status, ROUND( pga_used_mem/1024/1024) usme, ROUND(pga_alloc_mem/1024/1024) alme, ROUND(pga_freeable_mem/1024/1024) frme, ROUND(pga_max_mem/1024/1024) mameFROM v$session s,v$process pWHERE p.addr=s.paddrAND s.username =''ऑर्डर बाय pga_max_mem,logon_time;exec dbms_lock.sleep(10)v$session से max(sid) sid चुनें जहां यूजरनेम =''; ---- प्रक्रिया स्मृति जानकारी प्राप्त करें-- कॉलम श्रेणी शीर्षक "श्रेणी" कॉलम आवंटित शीर्षक "आवंटित बाइट्स" कॉलम का उपयोग किया गया शीर्षक "प्रयुक्त बाइट्स" कॉलम अधिकतम_आवंटित शीर्षक "अधिकतम आवंटित बाइट्स" चयन पिड, श्रेणी, आवंटित, प्रयुक्त, max_allocatedFROM v$process_memoryWHERE pid में (v$प्रक्रिया से पिड का चयन करें जहां addr (v$session से पैडर का चयन करें जहां sid =&&s1));exec dbms_lock.sleep(10) pid, श्रेणी, आवंटित, उपयोग करें, का चयन करें, max_allocatedFROM v$process_memoryWHERE pid in (v$प्रक्रिया से पिड चुनें जहां addr (v$session से पैडर चुनें जहां sid =&&s1));exec dbms_lock.sleep(10)v$process whe से pid का चयन करें फिर से जोड़ें (v$session से paddr चुनें जहां यूजरनेम ='' और sid =(v$session से max(sid) चुनें जहां यूजरनेम =''));---- का पहला पास सेव करें pga आँकड़े--बनाएँ tab1 ASSELECT pid, श्रेणी, नाम, heap_name, बाइट्स, आबंटन_काउंट, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detailWHERE pid =&p_1AND श्रेणी ='अन्य';---- pga डंप का दूसरा पास प्राप्त करें। &p_1exec dbms_lock.sleep(120) ---- pga आँकड़ों का दूसरा पास सहेजें--तालिका टैब2 ASSELECT pid, श्रेणी, नाम, हीप_नाम, बाइट्स, आवंटन_काउंट, हीप_डिस्क्रिप्टर, parent_heap_descriptorFROM v$process_memory_detailWHERE pid ='Other'; ---- अंतिम रिपोर्ट शुरू करें ---- पीजीए हीप जानकारी-- कॉलम श्रेणी शीर्षक "श्रेणी" कॉलम नाम शीर्षक "नाम" कॉलम हीप_नाम शीर्षक "हीप नाम" कॉलम q1 शीर्षक "मेमोरी 1" प्रारूप 999,999,999,999COLUMN "मेमोरी 2nd " प्रारूप 999,999,999,9 99COLUMN diff HEADING "अंतर" प्रारूप S999,999,999,999SET LINES 150SELECT tab2.pid, tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tab2.bytes-tab1.bytes diffFROM tab1, tab2WHERE tab1.category =tab2.categoryand tab1.name =tab2.nameऔर tab1.heap_name =tab2.heap_nameand tab1.pid =tab2.pidand tab1.bytes <> tab2.bytes BY 1, 7 DESC;---- Logminer PGA info- -COLUMN heap_name HEADING "हीप नेम" COLUMN नाम HEADING "टाइप" COLUMN आबंटन_काउंट HEADING "काउंट" COLUMN बाइट्स HEADING "Sum"COLUMN avg HEADING "औसत" FORMAT 99999D99SELECT pid, हीप_नाम, नाम, आवंटन_काउंट बाइट्स, टैबनाम, आवंटन_काउंट, बाइट्स, जैसे 'लॉगमिनर%';स्पूल ऑफड्रॉप टेबल टैब1 पर्ज;ड्रॉप टेबल टैब2 पर्ज;

इस कोड को स्क्रिप्ट के रूप में सहेजें और स्ट्रिंग्स को लॉग माइनर चलाने वाले उपयोगकर्ता खाते से बदलने के लिए टेक्स्ट को संपादित करें। स्क्रिप्ट विशेष रूप से लॉगमिनर मेमोरी को लक्षित करती है ताकि इसे बढ़ने के लिए मॉनिटर किया जा सके। इसे किसी अन्य समस्या स्मृति क्षेत्रों को देखने के लिए भी संशोधित किया जा सकता है। आगे के शोध के लिए टैब 1 और टैब 2 को संरक्षित करने के लिए 'ड्रॉप टेबल' कमांड पर टिप्पणी करें, यदि वांछित हो तो अन्य मेमोरी क्षेत्र रुचि के हो सकते हैं। ज्ञात पीजीए-संबंधित मुद्दों के लिए ओरेकल समर्थन की भी जांच करें। ऐसी रिपोर्ट में संभावित रूप से V$PROCESS_MEMORY_DETAIL का उपयोग करके विशिष्ट समस्या क्षेत्रों की जांच करने के लिए क्वेरी का उपयोग किया जाएगा। सुविधा के लिए उन अतिरिक्त प्रश्नों को प्रक्रिया स्मृति के सभी संदिग्ध क्षेत्रों पर रिपोर्ट करने के लिए ऊपर दिखाए गए कोड में जोड़ा जा सकता है। यह डेटा डेटाबेस में विशिष्ट वन-ऑफ पैच लागू करने की आवश्यकता को साबित करने में सहायक होगा।

लॉग माइनर डेटाबेस में वर्तमान और अपेक्षाकृत हाल की पिछली कार्रवाइयों की जांच करने में एक बहुत ही उपयोगी उपकरण हो सकता है। लॉग माइनर सत्र सक्रिय होने पर पीजीए आवंटन की निगरानी करना आवश्यक हो सकता है, इसलिए निवारक कार्रवाई जैसे कि pga_aggregate_limit को बढ़ाना निष्पादित किया जा सकता है, और सत्र अचानक समाप्त नहीं होंगे। जैसा कि कहा जाता है, "पूर्व चेतावनी दी जाती है", और भले ही डीबीए के पास चार भुजाएँ न हों, यह जानना कि आगे क्या हो सकता है, हमेशा ज्ञान के लायक होता है।

डेविड फिट्ज़जारेल के सभी लेख देखें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या .NET में OraOLEDB प्रदाता CLOB फ़ील्ड पर अविश्वसनीय है?

  2. ओरेकल बाहरी टेबल

  3. क्या हम किसी तालिका के प्राथमिक कुंजी मान अपडेट कर सकते हैं?

  4. NHibernate के साथ बल्क इंसर्ट ऑपरेशंस को गति दें

  5. फॉरवर्ड क्रॉस संस्करण R12.2 . में ट्रिगर होता है