sql >> Database >  >> RDS >> Oracle

LogMiner gebruiken om huidige wijzigingen te vinden

Het kan voorkomen dat het nodig is om recente wijzigingen in de database te onderzoeken en te rapporteren wat, wanneer en door wie is gewijzigd. Het DBMS_LOGMNR-pakket van Oracle is al jaren beschikbaar voor dergelijke taken, maar de aanroepen ervan zijn niet volledig gedekt. Conventionele methoden gebruiken de ADD_LOGFILE()-procedure om Log Miner voor te bereiden voor gebruik met een basisaanroep naar de START_LOGMNR-procedure. Hiermee start u het hulpprogramma met de huidige SCN als startpunt. Er is een andere manier om Log Miner te starten, door een geldige start-SCN te selecteren en die aan de START_LOGMNR()-aanroep te geven. In dit artikel zult u zien hoe dit kan worden gedaan en, in het proces, een mogelijk aandachtspunt met PGA-toewijzingen onthullen.

Kijkend naar een 'plain vanilla'-script om Log Miner te starten, worden de gebruikelijke procedure-aanroepen gedaan die Log Miner starten met de huidige SCN:

---- run_logmnr.sql---- Voeg logbestanden toe en stel DBMS_LOGMNR in op-- continu archiveren van archieflogs--set linesize 200 trimspool op paginagrootte 0---- Voeg de bestaande logbestanden toe---- Laat standby-logbestanden weg- -select 'exec dbms_logmnr.add_logfile('''||member||''')'from v$logfilewhere typ <> 'STANDBY'and member in (select min(member) from v$logfile group by group#)spool /tmp/add_logfiles.sql/spool off@/tmp/add_logfiles---- Start logmnr in continue mijnmodus--exec dbms_logmnr.start_logmnr(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.TEDMS_LOGMNR. 

Merk op dat alle beschikbare redo-logs worden toegevoegd voordat Log Miner wordt gestart. Er bestaat een andere methode die een startende SCN levert aan de start_logmnr-aanroep, zolang de database in ARCHIVELOG-modus draait:

BEGIN DBMS_LOGMNR.START_LOGMNR( startScn => , endScn => , OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_NUOUSNR.CONTI); 

Interessant is dat de eind-SCN niet nodig is om een ​​Log Miner-sessie te starten. De database moet in ARCHIVELOG-modus staan, zodat de optie CONTINUOUS_MINE kan worden opgegeven, omdat Log Miner automatisch elk beschikbaar gearchiveerd logbestand toevoegt terwijl het wordt uitgevoerd. Door deze methode te gebruiken, kan een specifieke SCN worden gebruikt om een ​​zoekopdracht te starten; het specificeren van het einde SCN-haakjes zoeken zodat slechts een beperkte subset van gegevens wordt geretourneerd naar de V$LOGMNR_CONTENTS-weergave en een stoppunt voor de zoekopdracht biedt, zodat een zoekopdracht van de weergave kan worden beëindigd.

Het is een eenvoudige taak om de voortgang van Log Miner te volgen door het databasewaarschuwingslogboek te controleren, aangezien items gemarkeerd met 'LOGMINER' worden geregistreerd. Een volledige invoer bevat een BEGIN- en een END-regel, zoals hieronder weergegeven:

Ma 07 okt 12:48:22 2019LOGMINER:Mijnbouwlogbestand beëindigen voor sessie -2147482111 thread 1 reeks 9776, /oracle/archive/awcis/awcis_0000009776_0001_1008544071.arcMon 07 okt 12:48:22 2019LOGMINER:Mijnbouwlogbestand voor sessie starten - 2147482111 thread 1 sequence 9777, /oracle/archive/awcis/awcis_0000009777_0001_1008544071.arcMon Oct 07 12:48:36 2019LOGMINER:Mijnbouwlogbestand beëindigen voor sessie -2147482111 thread 1 sequence 9777, /oracle/archive/awcis/awcis_0000009777_0001_1008544007 12arc :48:36 2019LOGMINER:Begin mijnbouwlogbestand voor sessie -2147482111 thread 1 reeks 9778, /oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon 07 okt 12:48:49 2019LOGMINER:Beëindig mijnbouwlogbestand voor sessie-2147482111 thread 1 reeks 9778, / oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon 07 okt 12:48:49 2019LOGMINER:Begin met mijnbouwlogbestand voor sessie-2147482111 thread 1 reeks 9779, /oracle/archive/awcis/awcis_0000009779_0001_1008544071.arc

Voor lokale Oracle-sessies zijn de getallen positieve gehele getallen; voor sessies op afstand, geïnitieerd door hulpprogramma's zoals Perl, Python, C/C++ of andere talen, zullen negatieve gehele getallen worden gezien (de hierboven getoonde items zijn geïnitieerd door een Python-script). De namen van logbestanden gaan door zowel de online redo-logs als de beschikbare gearchiveerde kopieën.

Het op deze manier starten van Log Miner kan ook fouten veroorzaken, zoals 'ontbrekend logbestand' wanneer het geselecteerde startende SCN- of SCN-bereik niet langer beschikbaar is in de herhalingsstroom. Langlopende query's kunnen dergelijke fouten tegenkomen. Bovendien, als de SCN buiten bereik is met betrekking tot de beschikbare logbestanden, zal Log Miner niet starten en gooien:

ERROR op regel 1:ORA-01292:er is geen logbestand opgegeven voor de huidige LogMiner-sessieORA-06512:op "SYS.DBMS_LOGMNR", regel 58ORA-06512:op regel 2

Om dergelijke fouten te helpen elimineren, biedt het selecteren van de FIRST_CHANGE# in de V$LOG-weergave geldige startpunten voor een Log Miner-sessie; het gebruik van een vergelijkbare zoekopdracht tegen V$ARCHIVED_LOG levert alle beschikbare start-SCN's op voor de gearchiveerde herhalingskopieën.

Dit is niet de enige complicatie bij het gebruik van Log Miner op deze manier. Afhankelijk van hoeveel informatie moet worden geretourneerd, kan het Logmminer-proces grote hoeveelheden PGA-geheugen toewijzen, wat, als de pga_aggregate_limit klein is, de volgende fout kan veroorzaken:

ORA-04036:PGA-geheugen dat door de instantie wordt gebruikt, is groter dan PGA_AGGREGATE_LIMIT

gelukkig is dit geen fatale fout. Omdat PGA-resources niet langer nodig zijn, kan geheugen worden vrijgegeven aan de database voor gebruik elders. Het kan echter iets langer duren dan gewenst om dat geheugen weer vrij te geven in de geheugenpool. Een optie is om de pga_aggregate_limit hoger in te stellen dan de som van de Log Miner-sessies, waardoor de fout kan worden voorkomen. Hoe weet je welk geheugen aan die sessies is toegewezen? Een weergave, V$PROCESS_MEMORY_DETAIL, is beschikbaar in de database. Maar een poging om deze weergave op te vragen zonder enige voorbereiding zal terugkeren:

geen rijen geselecteerd.

Dit is een relatief klein probleem, maar het vereist het gebruik van het oradebug-hulpprogramma. De volgende stappen laden gegevens in V$PROCESS_MEMORY_DETAIL:

---- Stel de huidige sessie-ID in-- oradebug setmypid---- Gebruik de PID van het gewenste proces-- dump de geheugengegevens---- Dit vult V$PROCESS_MEMORY_DETAIL--oradebug pga_detail_get - --- Vraag de weergave op om de gewenste gegevens te krijgen -- selecteer * Van v$process_memory_detail;---- Om de weergave opnieuw te vullen met nieuwere gegevens -- voer eenvoudig de oradebug pga_detail_get-- statement--oradebug pga_detail_get  uit   

Hieronder ziet u een script om deze acties uit te voeren:

---- De omgeving instellen voor oradebug-aanroepen--oradebug setmypidset echo off trimspool onset verifiëren offundefine p_1undefine p_2undefine s1undefine s2variable p1 numbervariable p2 numbercolumn sys_date new_value sysdt noprintselect to_charRRISSsyDDHH '24; -- Verkrijg proces-ID van de  sessie--kolom pid new_value p_1select pid van v$process waar addr in (selecteer paddr van v$session waar gebruikersnaam ='' en sid =(select max(sid) From v$session waar gebruikersnaam =''));begin :p1 :=&p_1;end;/---- Dump procesdetails naar v$process_memory_detail--oradebug dump pga_detail_get &p_1spool &p_1._pga_stats_&sysdt..log--- - Krijg sessie-informatie voor --COLUMN alme HEADING "Toegewezen MB" FORMAT 99999D9COLUMN usme HEADING "Used MB" FORMAT 99999D9COLUMN frme HEADING "Freeable MB" FORMAT 99999D9COLUMN mame HEADING "Max MB" FORMAT 99999D9COLUMNOL gebruikersnaam FORMAT a22COLUMN sid FORMAT a5COLUMN spid FORMAT a8column pid_remote format a12SET LINESIZE 300SELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) program, 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 =''ORDER BY pga_max_mem,logon_time;---- Slaap 30 seconden---- Sessie-informatie opnieuw ophalen--exec dbms_lock.sleep(30) kolom sid nieuwe_waarde s1 noprintSELECT s.gebruikersnaam, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) programma, 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 =''ORDER BY pga_max_mem,logon_time;exec dbms_lock.sleep(10)select max(sid) sid from v$session waar gebruikersnaam ='';---- Informatie over procesgeheugen ophalen--COLUMN categorie HEADING "Categorie"KOLOM toegewezen HEADING "Toegewezen bytes"KOLOM gebruikt HEADING "Gebruikte bytes"COLUMN max_allocated HEADING "Max. toegewezen bytes"SELECTEER pid, categorie, toegewezen, gebruikt, max_allocatedFROM v$process_memoryWHERE pid in (SELECT pid FROM v$process WHERE addr in (select paddr FROM v$session WHERE sid =&&s1));exec dbms_lock.sleep(10)SELECT pid, categorie, toegewezen, gebruikt, max_allocatedFROM v$process_memoryWHERE pid in (SELECT pid FROM v$process WHERE addr in (selecteer paddr FROM v$session WHERE sid =&&s1));exec dbms_lock.sleep(10)select pid uit v$process whe re addr in (selecteer paddr van v$session waar gebruikersnaam ='' en sid =(selecteer max(sid) van v$session waar gebruikersnaam =''));---- Bewaar eerste pas van pga stats--CREATE TABLE tab1 ASSELECT pid, categorie, naam, heap_name, bytes, allocatie_count, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detailWHERE pid =&p_1AND category ='Other';---- Verkrijg een tweede doorgang van pga stats-dumps--oradetail_get &p_1exec dbms_lock.sleep(120)---- Tweede pass van pga-statistieken opslaan--CREATE TABLE tab2 ASSELECT pid, categorie, naam, heap_name, bytes, allocatie_count, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detailWHERE pid ='Overig'AND; ---- Start eindrapporten---- PGA heap info--COLUMN categorie HEADING "Categorie"COLUMN name HEADING "Name"COLUMN heap_name HEADING "Heap name"COLUMN q1 HEADING "Memory 1st" Format 999.999.999.999COLUMN q2 HEADING "Geheugen " Formaat 999,999,999,9 99KOLOM diff HEADING "Verschil" Formaat 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.nameAND tab1.heap_name =tab2.heap_name en tab1.pid =tab2.pidAND tab1.bytes <> tab2.bytesORDER BY 1, 7 DESC;---- Logminer PGA info- -COLUMN heap_name HEADING "heap name"COLUMN name HEADING "Type"COLUMN allocation_count HEADING "Count"COLUMN bytes HEADING "Sum"COLUMN avg HEADING "Gemiddelde" FORMAT 99999D99SELECT pid, heap_name, name, allocatie_count,location_bytes, avg_name_ROMEREcount2bytes / zoals 'Logminer%';spool offdrop table tab1 purge;drop table tab2 purge;

Sla deze code op als een script en bewerk de tekst om de -tekenreeksen te vervangen door het gebruikersaccount waarop Log Miner wordt uitgevoerd. Het script is specifiek gericht op het Logminer-geheugen, zodat het kan worden gecontroleerd op toenames. Het kan ook worden aangepast om te zoeken naar andere probleemgeheugengebieden. Geef commentaar op de 'drop table'-opdrachten om tab1 en tab2 te behouden voor verder onderzoek, indien gewenst, omdat andere geheugengebieden van belang kunnen zijn. Controleer ook Oracle-ondersteuning voor bekende PGA-gerelateerde problemen. Dergelijke rapporten zullen waarschijnlijk vragen bevatten om specifieke probleemgebieden te onderzoeken met V$PROCESS_MEMORY_DETAIL. Voor het gemak kunnen die aanvullende vragen worden toegevoegd aan de hierboven getoonde code om te rapporteren over alle verdachte gebieden van het procesgeheugen. Deze gegevens zullen een belangrijke rol spelen bij het aantonen van de noodzaak van het toepassen van specifieke eenmalige patches op de database.

Log Miner kan een zeer nuttig hulpmiddel zijn bij het onderzoeken van huidige en relatief recente acties in het verleden aan de database. Het kan nodig zijn om PGA-toewijzingen te bewaken terwijl Log Miner-sessies actief zijn, zodat preventieve actie, zoals het verhogen van de pga_aggregate_limit, kan worden uitgevoerd en sessies niet abrupt worden beëindigd. "Een gewaarschuwd mens is van onderen", zoals het gezegde luidt, en ook al hebben DBA's geen vier armen, wetende wat er in het verschiet ligt, is altijd kennis die het waard is om te hebben.

Bekijk alle artikelen van David Fitzjarrell


  1. Wat is de database, waarom database?

  2. Een varchar-kolom upgraden naar enum-type in postgresql

  3. Hoe trage query-logboeken in AWS RDS MySQL in te schakelen

  4. Gebruik APP_NAME() om de toepassingsnaam van de huidige sessie in SQL Server op te halen