sql >> Databáze >  >> RDS >> Oracle

Použití LogMiner k nalezení aktuálních změn

Mohou nastat situace, kdy je nutné prozkoumat nedávné změny v databázi a nahlásit, co se změnilo, kdy a kým. Balíček DBMS_LOGMNR společnosti Oracle byl pro takové úkoly k dispozici již léta, ale jeho vyvolání nebyla plně pokryta. Konvenční metody používají proceduru ADD_LOGFILE() k přípravě Log Miner pro použití se základním voláním procedury START_LOGMNR. Tím se spustí nástroj s aktuálním SCN jako výchozím bodem. Existuje další způsob, jak spustit Log Miner, výběrem platného počátečního SCN a poskytnutím volání START_LOGMNR(). V tomto článku uvidíte, jak toho lze dosáhnout, a během tohoto procesu odhalíte možnou oblast zájmu s alokací PGA.

Když se podíváte na „plain vanilla“ skript pro spuštění Log Miner, provedou se obvyklá volání procedur, která spustí Log Miner s aktuálním SCN:

---- run_logmnr.sql---- Přidejte soubory protokolů a nastavte DBMS_LOGMNR na -- nepřetržité dolování archivních protokolů -- nastavení velikosti řádků 200 trimspool na velikosti stránky 0---- Přidejte existující soubory protokolů ---- Vynechejte soubory protokolů v pohotovostním režimu- -select 'exec dbms_logmnr.add_logfile('''||member||''')'z v$logfilewhere zadejte <> 'STANDBY'a člen v (vyberte min(člena) ze skupiny v$logfile group by group#)spool /tmp/add_logfiles.sql/spool off@/tmp/add_logfiles---- Spusťte protokol logmnr v režimu nepřetržitého dolování--exec dbms_logmnr.start_logmnr(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +DNUMS DBM_DNUMS_DBNUMS_DBNUMS_DUBM. 

Všimněte si, že všechny dostupné redo logy jsou přidány před spuštěním Log Miner. Existuje jiná metoda, která dodává počáteční SCN volání start_logmnr, pokud databáze běží v režimu ARCHIVELOG:

BEGIN DBMS_LOGMNR.START_LOGMNR( startScn => , endScn => , OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_LOGMNR.CONTINUUS);
 Zajímavé je, že koncové SCN není nutné ke spuštění relace Log Miner. Databáze musí být v režimu ARCHIVELOG, aby bylo možné zadat volbu CONTINUOUS_MINE, protože Log Miner automaticky přidá každý dostupný archivovaný soubor protokolu, když běží. Použití této metody umožňuje použít konkrétní SCN ke spuštění jakéhokoli vyhledávání; zadáním hledání koncových závorek SCN tak, aby se do pohledu V$LOGMNR_CONTENTS vrátila pouze omezená podmnožina dat a poskytla bod zastavení pro vyhledávání, takže dotaz pohledu může být ukončen.

Je to jednoduchý úkol sledovat postup Log Miner kontrolou protokolu výstrah databáze, protože jsou registrovány položky označené „LOGMINER“. Úplný záznam bude obsahovat řádek BEGIN a END, jak je znázorněno níže:

Po Oct 07 12:48:22 2019LOGMINER:Ukončení souboru protokolu těžby pro relaci -2147482111 vlákno 1 sekvence 9776, /oracle/archive/awcis/awcis_0000009776_0001_10082arcfile OginER:0001_1008254484071 session 2147482111 vlákno 1 sekvence 9777, /oracle/archive/awcis/awcis_0000009777_0001_1008544071.arcmon 07 12:48:36 2019LogMiner:End těžební logfile -2147482111 :48:36 2019LOGMINER:Zahájení těžby logfile pro relaci -2147482111 vlákno 1 sekvence 9778, /oracle/archive/awcis/awcis_0000009778_0001_1008544071.arc12.října 291718:07 konec log41file oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:Zahájení těžby logfile pro relaci -047911 vlákno, 00000000000011111111111111111111111111111111111111111110000000000000001111111111111100000000000 

Pro místní relace Oracle jsou čísla kladná celá čísla; pro vzdálené relace iniciované nástroji jako Perl, Python, C/C++ nebo jiné jazyky budou vidět záporná celá čísla (výše zobrazené položky byly iniciovány skriptem Python). Názvy souborů protokolu budou procházet online protokoly opakování a dostupnými archivovanými kopiemi.

Spuštění Log Miner tímto způsobem může také způsobit chyby, jako je „chybějící soubor protokolu“, když vybraný počáteční rozsah SCN nebo SCN již není k dispozici v opakovaném streamu. Dlouhé dotazy mohou narazit na takové chyby. Navíc, pokud je SCN mimo rozsah s ohledem na dostupné soubory protokolu Log Miner se nespustí a vyvolá:

CHYBA na řádku 1:ORA-01292:pro aktuální relaci LogMiner nebyl zadán žádný soubor protokoluORA-06512:na "SYS.DBMS_LOGMNR", řádek 58ORA-06512:na řádku 2

Chcete-li pomoci odstranit takové chyby, výběr FIRST_CHANGE# z pohledu V$LOG poskytne platné výchozí body pro relaci Log Miner; použití podobného dotazu proti V$ARCHIVED_LOG vrátí všechny dostupné počáteční SCN pro archivované opakované kopie.

Toto není jediná komplikace používání Log Miner tímto způsobem. V závislosti na tom, kolik informací má být vráceno, může proces Logmminer alokovat velké množství paměti PGA, což může, pokud je pga_aggregate_limit malý, způsobit následující chybu:

ORA-04036:Paměť PGA použitá instancí přesahuje PGA_AGGREGATE_LIMIT

naštěstí to není fatální chyba. Protože prostředky PGA již nejsou potřeba, lze paměť uvolnit zpět do databáze pro použití jinde. Uvolnění paměti zpět do paměťové oblasti však může trvat o něco déle, než je žádoucí. Možností je nastavit pga_aggregate_limit vyšší než součet relací Log Miner, což může zabránit výskytu chyby. Jak víte, jaká paměť je těmto relacím přidělena? V databázi je k dispozici pohled V$PROCESS_MEMORY_DETAIL. Ale pokus o dotaz na tento pohled bez přípravy vrátí:

nejsou vybrány žádné řádky.

Toto je relativně malý problém, ale vyžaduje použití nástroje oradebug. Následující kroky načtou data do V$PROCESS_MEMORY_DETAIL:

---- Nastavit identifikátor aktuální relace-- oradebug setmypid---- Použití PID požadovaného procesu-- vypsat data z paměti ---- Tím se vyplní V$PROCESS_MEMORY_DETAIL--oradebug pga_detail_get - --- Dotazujte se na pohled, abyste získali požadovaná data--vyberte * From v$process_memory_detail;---- Chcete-li znovu naplnit pohled novějšími daty-- jednoduše spusťte příkaz oradebug pga_detail_get---oradebug pga_detail_get    

Níže je uveden skript pro provedení těchto akcí:

---- Nastavte prostředí pro volání oradebug--oradebug setmypidset echo off trimspool zahájení ověření offundefine p_1undefine p_2undefine s1undefine s2proměnná p1 číslo proměnná p2 číslosloupce sys_date nová_hodnota sysdt noprint'výběr dat do-charakteru sysdt noprint'DHISS) -- Získejte id procesu relace  -- sloupec pid new_value p_1select pid z v$process where addr in (vyberte paddr z v$session kde uživatelské jméno ='' a sid =(vyberte max(sid) From v$session where username =''));begin :p1 :=&p_1;end;/---- Vypsat podrobnosti o procesu do v$process_memory_detail--oradebug dump pga_detail_get &p_1spool &p_1._pga_stats_&sysdt..log--- - Získejte informace o relaci pro --COLUMN alme HEADING "Alokované MB" FORMÁT 99999D9COLUMN usme HEADING "Použitý MB" FORMÁT 99999D9COLUMN frme HEADING "Uvolněný MB" FORMAT 99999D9COLUMN mame FORMÁT MB25COLUMN uživatelské jméno99999D9COLUMN mame MB25 HEADCUMNUM 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 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_ROM4$semsion) v$process pWHERE p.addr=s.paddrAND s.username =''ORDER BY pga_max_mem,logon_time;---- Spánek 30 sekund---- Znovu získat informace o relaci--exec dbms_lock.sleep(30) sloupec sid new_value s1 noprintSELECT 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;exec dbms_lock.sleep(10)select max(sid) sid z v$session where username ='';---- Získat informace o paměti procesu--COLUMN kategorie HEADING "Kategorie"COLUMN přiděleno HEADING "Alokované bajty"COLUMN used HEADING "Použité bajty"COLUMN max_allocated HEADING "Max alokovaných bajtů"SELECT pid, kategorie, alokované, použité, 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, kategorie, přiděleno, použité, 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 z v$process whe re addr in (vyberte paddr z v$session, kde uživatelské jméno ='' a sid =(vyberte max(sid) z v$session, kde uživatelské jméno =''));---- Uložte první průchod pga stats--CREATE TABLE tab1 ASSELECT pid, category, name, heap_name, bytes,location_count, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detailWHERE pid =&p_1AND category ='Ostatní';---- Získejte druhý průchod pgaradebug stats pgarade_details--o &p_1exec dbms_lock.sleep(120)---- Uložte druhý průchod statistik pga--CREATE TABLE tab2 ASSELECT pid, kategorie, název, název_hromady, bajty, počet_alokací, deskriptor_hromady, deskriptor_rodiče_heap_descriptorFROM v$process_memory_detail ='&p_1 pidO ---- Spustit závěrečné zprávy---- Informace o haldě PGA--Kategorie COLUMN HEADING "Kategorie"Název SLOUPCE HEADING "Name"COLUMN heap_name HEADING "Název haldy"COLUMN q1 HEADING "Paměť 1st" Formát 999,999,999,999,99999 Paměť "CUMOLN2HEADING" " Formát 999,999,999,9 99COLUMN diff HEADING "Rozdíl" Formát S999,999,999,999SET LINES 150SELECT tab2.pid, tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tab2.FHEffbytes tab dib tab1.category =tab2.categoryAND tab1.name =tab2.nameAND tab1.heap_name =tab2.heap_nameand tab1.pid =tab2.pidAND tab1.bytes <> tab2.bytesORDER BY 1, 7 DESC;---- Logminer PGA info- -COLUMN název_hromady HEADING "název_hromady"název_sloupce HEADING "Typ"COLUMNlocation_count HEADING "Počet"COLUMN bajtů HEADING "Součet"COLUMN průměr HEADING "Průměr" FORMAT 99999D99SELECT pid, heap_count_name, heap_name, jmeno_alokace, název_alokace, název_alokace like 'Logminer%';spool offdrop table tab1 purge;drop table tab2 purge;

Uložte tento kód jako skript a upravte text tak, aby byly řetězce nahrazeny uživatelským účtem, na kterém běží Log Miner. Skript se specificky zaměřuje na paměť Logminer, takže lze monitorovat její nárůsty. Může být také upraven tak, aby hledal jakékoli další problémové oblasti paměti. Zakomentujte příkazy „drop table“, abyste zachovali tab1 a tab2 pro další výzkum, pokud si to přejete, protože jiné oblasti paměti mohou být zajímavé. Zkontrolujte také podporu Oracle ohledně známých problémů souvisejících s PGA. Takové zprávy budou pravděpodobně obsahovat dotazy, které lze použít k prozkoumání konkrétních problémových oblastí pomocí V$PROCESS_MEMORY_DETAIL. Tyto dodatečné dotazy lze pro účelnost přidat do výše uvedeného kódu, aby se hlásily všechny podezřelé oblasti paměti procesu. Tato data budou nápomocná při prokázání nutnosti použití specifických jednorázových záplat na databázi.

Log Miner může být velmi užitečným nástrojem při zkoumání současných a relativně nedávných minulých akcí s databází. Může být nutné monitorovat alokace PGA, když jsou aktivní relace Log Miner, takže lze provést preventivní akci, jako je zvýšení pga_aggregate_limit, a relace nebudou náhle ukončeny. „Forewarned is forearmed“, jak se říká, a přestože DBA nemají čtyři paže, vědění, co může být před námi, vždy stojí za to mít.

Zobrazit všechny články od Davida Fitzjarrella


  1. Jak odstranit úlohu SQL Server Agent v Azure Data Studio

  2. SQL Server replikace databáze

  3. Jak zobrazit serverové řazení v SQL Server (T-SQL)

  4. Použití zobrazení SQL k přidání/úpravě dat v aplikaci Microsoft Access