Kapitel 18
Recovery-Szenarien für Experten
442
18.6 Der Oracle LogMiner
Der LogMiner ist ein sehr nützliches Werkzeug, das viel zu selten eingesetzt wird.
Häufig wurde die etwas umständliche Bedienung kritisiert. Inzwischen liefert
Oracle endlich eine bessere Unterstützung, insbesondere durch den Enterprise
Manager. Egal für welche Art der Bedienung Sie sich entscheiden, der LogMiner
bietet viele Möglichkeiten für die Wiederherstellung oder ein nachträgliches Audi-
ting (CSI Oracle). Vor allem, wenn ein Recovery mit den vorhandenen Log-Dateien
nicht funktioniert, bietet der LogMiner die Möglichkeit, Transaktionen auszule-
sen. Aber auch wenn nur bestimmte Objekte und nicht die gesamte Datenbank
wiederhergestellt oder zurückgerollt werden sollen, ist der LogMiner eine hervor-
ragende und effektive Alternative. Letztendlich ist er an keine Retention Policy
gebunden und kann soweit zurückgehen, wie Archived Redo Log-Dateien vorhan-
den sind.
Das folgende Beispiel zeigt, wie der LogMiner eingesetzt werden kann, um Verän-
derungen in der Tabelle hr.employess nachträglich auszulesen. Führen Sie dazu die
folgenden Schritte durch:
1. Schalten Sie Supplemental Logging ein. Zumindest sollte Primary Key Logging
aktiviert werden. Das Einschalten kann für einzelne Tabellen oder die gesamte
Datenbank erfolgen.
2. Weisen Sie dem Benutzer, der das Log Mining durchführen soll, Ausführungs-
rechte für das Paket DBMS_LOGMNR zu. In diesem Fall ist das der User MITP.
Weiterhin benötigt der Benutzer die Rolle EXECUTE_CATALOG_ROLE.
DECLARE
devtype VARCHAR2(256);
done BOOLEAN;
BEGIN
devtype := DBMS_BACKUP_RESTORE.DEVICEALLOCATE();
DBMS_BACKUP_RESTORE.APPLYSETDATAFILE;
DBMS_BACKUP_RESTORE.APPLYDATAFILETO(4);
DBMS_BACKUP_RESTORE.APPLYBACKUPPIECE('/opt/oracle/flash_recovery_area/MITP2/
backupset/2014_04_06/o1_mf_nnnd1_TAG20080406T173540_3zkvgl7v_.bkp',done=>done);
DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE;
END;
PL/SQL procedure successfully completed.
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Datenbank wurde geändert.
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
Datenbank wurde geändert.
18.6
Der Oracle LogMiner
443
3. Wählen Sie die Archived Redo Log-Dateien nach dem Zeitraum aus, den Sie
untersuchen wollen.
4. Teilen Sie die benötigten Log-Dateien dem LogMiner mit.
5. Starten Sie die LogMiner-Sitzung und verwenden Sie den Online-Katalog. Der
Datenbankkatalog wird benötigt, um die Einträge in die Redo Log-Dateien in
lesbarer Form darzustellen. Damit werden unter anderem den Objektnummern
die entsprechenden Namen zugeordnet.
6. Durch Abfrage des Views V$LOGMNR_CONTENTS kann ermittelt werden,
wer zu welchem Zeitpunkt Änderung in der Tabelle vorgenommen hat.
SQL> GRANT EXECUTE ON sys.dbms_logmnr TO mitp;
Benutzerzugriff (Grant) wurde erteilt.
SQL> GRANT execute_catalog_role TO mitp;
Benutzerzugriff (Grant) wurde erteilt.
SQL> SELECT name,first_time,next_time
2 FROM v$archived_log
3 WHERE first_time >= TO_DATE('28.03.2014 15:10:00','dd.mm.yyyy
hh24:mi:ss');
NAME FIRST_TIME NEXT_TIME
-------------------------------------------- ------------------- ----------
/opt/oracle/archive/MITP/1_70_656607753.dbf 28.03.2014 15:10:45 28.03.2014
15:22:23
SQL> BEGIN
2 SYS.DBMS_LOGMNR.ADD_LOGFILE
3 ('/opt/oracle/archive/MITP/1_70_656607753.dbf ');
4 END;
5 /
PL/SQL-Prozedur erfolgreich abgeschlossen.
SQL> BEGIN
2 SYS.DBMS_LOGMNR.START_LOGMNR(
3 options=>dbms_logmnr.dict_from_online_catalog);
4 end;
5 /
PL/SQL-Prozedur erfolgreich abgeschlossen.
SQL> SELECT username, timestamp, seg_type_name, seg_name
2 FROM v$logmnr_contents
3 WHERE table_name = 'EMPLOYEES'
4 AND seg_owner = 'HR'
5 AND operation = 'UPDATE';
Kapitel 18
Recovery-Szenarien für Experten
444
7. Weitere Informationen zur Session, die diese Veränderungen vorgenommen
hat, finden Sie in der Spalte »SESSION_INFO«.
8. Um festzustellen, welche Änderungen vorgenommen wurden, können die
Spalten SQL_REDO und SQL_UNDO ausgelesen werden. Der LogMiner liefert
komplette SQL-Anweisungen, die für ein Recovery oder ein Zurückrollen ver-
wendet werden können.
Der LogMiner liefert gefilterte Informationen über die Änderungen durch Trans-
aktionen und kann ein nachträgliches Auditing liefern, falls es nicht entsprechend
eingerichtet wurde. So kann mithilfe der folgenden SQL-Anweisung eine über-
sichtliche Auflistung der geänderten Werte erfolgen.
USERNAME TIMESTAMP SEG_TYPE_NAME SEG_NAME
------------ ------------------- -------------- ------------
SYS 28.03.2014 15:21:37 TABLE EMPLOYEES
SQL> SELECT session_info FROM v$logmnr_contents
2 WHERE table_name = 'EMPLOYEES'
3 AND seg_owner = 'HR'
4 AND operation = 'UPDATE';
SESSION_INFO
----------------------------------------------------------------------------
login_username=SYS client_info= OS_username=Lap6\lutz
Machine_name=WORKGROUP\LAP6 OS_terminal=Ls.exe
SQL> SELECT sql_redo, sql_undo
2 FROM v$logmnr_contents
3 WHERE table_name = 'EMPLOYEES'
4 AND seg_owner = 'HR'
5 AND operation = 'UPDATE';
SQL_REDO SQL_UNDO
----------------------------------- -----------------------------------
update "HR"."EMPLOYEES" set "SALARY update "HR"."EMPLOYEES" set "SALARY
" = '24016' where "EMPLOYEE_ID" = ' " = '12008' where "EMPLOYEE_ID" = '
205' and "SALARY" = '12008' and ROW 205' and "SALARY" = '24016' and ROW
ID = 'AAAWT8AAEAAAz8/AAH'; ID = 'AAAWT8AAEAAAz8/AAH';
SQL> SELECT a.first_name, a.last_name,
2 DBMS_LOGMNR.MINE_VALUE(redo_value,'HR.EMPLOYEES.SALARY') NEU,
3 DBMS_LOGMNR.MINE_VALUE(undo_value,'HR.EMPLOYEES.SALARY') ALT
4 FROM v$logmnr_contents b, hr.employees a
5 WHERE table_name = 'EMPLOYEES'
6 AND operation = 'UPDATE'
7 AND DBMS_LOGMNR.COLUMN_PRESENT(undo_value,'HR.EMPLOYEES.SALARY') = 1
8 AND DBMS_LOGMNR.COLUMN_PRESENT(redo_value,'HR.EMPLOYEES.SALARY') = 1
9 AND a.rowid = b.row_id;

Get Oracle 12c - Das umfassende Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.