Es kommt des öfteren vor, dass Benutzer aus Versehen falsche oder zu viele Datensätze löschen, Einträge mit einem falschen Wert updaten oder den verkehrten Index löschen.
Wenn Sie nun im Besitz eines aktuellen logischen Backups (Export) sind, dann könnten Sie diese Fehler möglicherweise beheben.
Wenn nicht, hat man eigentlich nur die Möglichkeit eines unvollständigen Recoveries. Aber es gibt da noch eine 3. Möglichkeit:
Den LogMiner.
Der Oracle LogMiner ist ein Package (DBMS_LOGMNR), mit dem Sie den Inhalt von RedoLog-Dateien abfragen und analysieren können. Die Ergebnisse werden in einer View (v$LOGMNR_CONTENTS) dargestellt und können mittels SQL-Befehlen betrachtet werden.
Mit Hilfe des LogMiners können Sie unter anderem folgende Informationen aus den RedoLog-Dateien sichtbar machen:
In den RedoLog Dateien werden die einzelnen Tabellenname, Spaltenname, Objektnamen unter einer internen Object-ID und die Spalten- oder Vergleichswerte in Hexadezimal-Code gespeichert. Damit der LogMiner diese Informationen auch vollständig übersetzten kann, benötigt er den Zugriff auf das Dictionary. Dies kann man durch folgende Möglichkeiten bewerkstelligen:
Im folgenden werden wir nur die 1. Möglichkeit ( Dictionary in einem Flat-File) verfolgen ...
Anwendung des LogMiners
Zum Analysieren der RedoLog-Dateien mit Hilfe des LogMiners müssen Sie folgendermaßen vorgehen:
1. Dictionary erstellen
2. Die zu analysierenden RedoLog-Dateien auswählen und registrieren
3. Die Analyse starten
4. Das Ergebnis über die View V$LOGMNR_CONTENTS abfragen
5. Die LogMiner-Session beenden
Dictionary erstellen (Extrahieren in ein Flat-File)
Überprüfen Sie den Parameter UTL_FILE_DIR, und setzen Sie ihn gegebenenfalls auf das Verzeichnis, in dem Sie die Dictionary-Datei erstellen wollen. (z. B. UTL_FILE_DIR = /oracle/logs)
Achtung: Nach Änderung dieses Parameters muss die Datenbank durchgestartet werden!
Hinweis: Ab Version 9.2 muss für eine vollständige Überwachung der DML Befehle folgendes Kommando einmalig in der Datenbank abgesetzt werden:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Erst danach werden auch die Updates vollständig im LogMiner dokumentiert!
Erstellen Sie das Data Dictionary:
BEGIN
DBMS_LOGMNR_D.BUILD(
DICTIONARY_FILENAME => 'dictionary.ora',
DICTIONARY_LOCATION => '/oracle/logs');
END;
/
Die zu analysierenden Logfiles registrieren:
Hinweis: Die aktuell benutzte Log-Datei erhalten Sie durch:
SELECT member FROM v$logfile WHERE group#=(
select group# FROM v$log WHERE status='CURRENT');
BEGIN
/* Erste Log-Datei zur Auswahl hinzufügen*/
DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME => '/oracle/logs/log1.f',
OPTIONS => dbms_logmnr.NEW);
/* Zweite Log-Datei zur Auswahl hinzufügen*/
DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME => '/oracle/logs/log2.f',
OPTIONS => dbms_logmnr.ADDFILE);
END;
/
/* Optional kann die letzte Datei wieder aus der Auswahl entfernt werden*/
BEGIN
DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME => '/oracle/logs/log2.f',
OPTIONS => dbms_logmnr.REMOVEFILE);
END;
/
Mit Hilfe der Prozedur ADD_LOGFILE können Sie nun die Liste der Logfiles bearbeiten. Sie können Logfile hinzufügen (ADDFILE) oder auch von der Liste entfernen (REMOVEFILE).
Die Analyse starten
BEGIN
DBMS_LOGMNR.START_LOGMNR(
DICTFILENAME =>'/oracle/logs/dictionary.ora');
END;
/
Durch das Aufrufen der Prozedur START_LOGMNR wird nun die Analyse der Logfiles gestartet und die Ergebnisse werden über die View V$LOGMNR_CONTENTS dargestellt.
Wenn Sie auch DDL Statements in den Log-Files nachvollziehen möchten, müssen Sie bevor die DDL Befehle absetzen folgendes Kommando ausführen:
BEGIN
DBMS_LOGMNR.START_LOGMNR (OPTIONS => DBMS_LOGMNR.DDL_DICT_TRACKING);
END;
/
Ergebnisse der Abfragen:
Die Informationen können nun aus der V$LOGMNR_CONTENTS ausgelesen werden. Bevor die Prozedur START_LOGMNR ausgeführt wurde ist diese View leer.
Die Analyse von RedoLog-Dateien mit Hilfe des LogMiners gilt immer nur auf Session-Ebene. Beenden Sie ihre Session, gehen auch ihre Analyse-Ergebnisse in der V$LOGMNR_CONTENTS verloren.
Beispielabfrage (Welche Änderungen wurden in der letzten Stunde auf Objekten von Benutzer Scott durchgeführt):
SELECT scn,timestamp,sql_redo,sql_undo,row_id,seg_name,seg_owner,username
FROM sys.v$logmnr_contents
WHERE seg_owner='SCOTT'
AND timestamp between sysdate-1/24 and sysdate;
Beschreibung der v$logmnr_contents Tabelle:
V$LOGMNR_CONTENTS:
Name Type Description/comments
--------------- ------------ ---------------------------------------------------
SCN NUMBER System Change Number des Redo Records
TIMESTAMP DATE Geschätzte Zeit des Redo Records
THREAD# NUMBER Redo log Thread (für OPS oder RAC)
LOG_ID NUMBER Log Sequence Number innerhalb des redo thread
XIDUSN NUMBER Rollback Segment Number in der die txn sich aufhält
XIDSLT NUMBER Slot in der RBSs txn table in der die txn sich aufhält
XIDSQN NUMBER Sequenz Nummer des Times slot in txn table in RBS reused
RBASQN NUMBER Log sequence number der Redo Byte Address (RBA)
RBABLK NUMBER Block innerhalb der Redolog-datei
RBABYTE NUMBER Byte offset innerhalb 512-byte block der Redolog-datei
UBAFIL NUMBER Datei ID # innerhalb Rollback Segment
UBABLK NUMBER Block ID # innerhalb rollback Segment
UBAREC NUMBER Slot # innerhalb des Rollback-Blocks
UBASQN NUMBER # of times slot within block within RBS reused
ABS_FILE# NUMBER Absolute file ID # der Daten
REL_FILE# NUMBER Relative file ID # der daten
DATA_BLK# NUMBER Block ID # innerhalb der Datendatei
DATA_OBJ# NUMBER OBJECT_ID in DBA_OBJECTS
DATA_OBJD# NUMBER DATA_OBJECT_ID in DBA_OBJECTS
SEG_OWNER VARCHAR2(32) Schema Name des Objekt-Eigentümers
SEG_NAME VARCHAR2(32) Objektname
SEG_TYPE NUMBER Objekttyp
SEG_TYPE_NAME VARCHAR2(32) Segment-Typ-Name
TABLE_SPACE VARCHAR2(32) Name des Tablespace in dem das Objekt liegt
ROW_ID VARCHAR2(19) ROWID
SESSION# NUMBER Wert der Spalte V$SESSION.SID der Transaktion
SERIAL# NUMBER Wert der Spalte V$SESSION.SERIAL# der Transaktion
USERNAME VARCHAR2(32) Benutzername der die Transaktion ausführt
SESSION_INFO VARCHAR2(4000) Zusätzliche Informationen
ROLLBACK NUMBER 0 = Transaktion commited, 1 = Transaktion rolled back
OPERATION VARCHAR2(32) Typ der SQL Operation
SQL_REDO VARCHAR2(4000) Text des SQL statement (um es nochmal auszuführen)
SQL_UNDO VARCHAR2(4000) Text des SQL statement (um es rückgängig zu machen)
RS_ID VARCHAR2(32) Name des Rollback segments
SSN NUMBER SQL Sequence number
CSF NUMBER SQL continuation flag (0 = not continued)
INFO VARCHAR2(32) Zusätzliche Informationen
STATUS NUMBER txn status
Weitere Information zum Log-Miner erhalten Sie in unserem Backup & Recovery und in unserem DBA III Kurs. Wir freuen uns auf Sie!
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.