forensisches Löschen / Aktualisieren von Daten

15

Ich muss forensisch Daten aus Oracle entfernen. Wenn ich es nur lösche, sind die Daten meines Wissens immer noch in der Datendatei, bis dieser Speicherplatz wieder verwendet wird. Ich mache mir keine Sorgen um den Redo / Archive / Undo-Bereich, diese werden vernünftigerweise schnell veralten.

Gibt es Methoden, um sicherzustellen, dass Daten tatsächlich aus einer Datendatei entfernt werden?

Matthew Watson
quelle

Antworten:

15

Dies ist eine interessante Frage: Wann löscht Oracle Daten wirklich physisch?

Die Dateneinheit in Oracle ist ein Block. Mal sehen, was passiert, wenn wir eine Zeile löschen.

Hier ist ein Beispiel mit einer einfachen Tabelle zu 11gR2 (siehe " Oracle Data Block sichern "):

CREATE TABLE test_delete_data(id NUMBER,data VARCHAR2(100));
INSERT INTO test_delete_data VALUES (1, rpad('1', 100, '1'));
INSERT INTO test_delete_data VALUES (2, rpad('2', 100, '2'));
INSERT INTO test_delete_data VALUES (3, rpad('3', 100, '3'));
COMMIT;

SELECT dbms_rowid.rowid_to_absolute_fno(rowid, user, 'TEST_DELETE_DATA') fileno,
       dbms_rowid.rowid_block_number(rowid) blockno
  FROM test_delete_data;

-- replace with values from query
alter system dump datafile 4 block 16573;

Sie sollten am Ende der in Ihrem user_dump_destVerzeichnis erstellten Datei Folgendes erhalten :

data_block_dump,data header at 0x8b02264
===============
[...]
block_row_dump:
tab 0, row 0, @0x1f2d
tl: 107 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [100]
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
tab 0, row 1, @0x1ec2
tl: 107 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 03
col  1: [100]
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
tab 0, row 2, @0x1e57
tl: 107 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 04
col  1: [100]
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump

Wenn ich die zweite Zeile lösche, den gleichen Block festschreibe und entleere, erhalte ich ungefähr Folgendes:

block_row_dump:
tab 0, row 0, @0x1f2d
tl: 107 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 02
col  1: [100]
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
tab 0, row 1, @0x1ec2
tl: 2 fb: --HDFL-- lb: 0x2 
tab 0, row 2, @0x1e57
tl: 107 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 04
col  1: [100]
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump

Der Datensatz ist noch vorhanden (mit Dgesetztem Flag). Wenn wir uns die tatsächlichen Binärdaten ansehen (kurz vor dem block header dumpAbschnitt), sehen wir, dass die Daten noch nicht überschrieben wurden:

8B040C0 33336404 33333333 33333333 33333333  [.d33333333333333]
8B040D0 33333333 33333333 33333333 33333333  [3333333333333333]
        Repeat 4 times
8B04120 33333333 023C3333 03C10202 32323264  [333333<.....d222]
8B04130 32323232 32323232 32323232 32323232  [2222222222222222]
        Repeat 5 times
8B04190 02002C32 6402C102 31313131 31313131  [2,.....d11111111]
8B041A0 31313131 31313131 31313131 31313131  [1111111111111111]
        Repeat 4 times
8B041F0 31313131 31313131 31313131 30A30602  [111111111111...0]

Eine Möglichkeit, das tatsächliche Überschreiben von Daten zu erzwingen, besteht darin, sie vor dem Löschen der Zeile auf einen bedeutungslosen Wert zu aktualisieren. Dies würde bei Indizes nicht funktionieren, da Aktualisierungen zum Löschen und Einfügen in einen ab * tree-Index übersetzt werden.

Vincent Malgrat
quelle
+1 "Eine Möglichkeit, das tatsächliche Überschreiben von Daten zu erzwingen, besteht darin, sie vor dem Löschen der Zeile auf einen bedeutungslosen Wert zu aktualisieren."
Gute Antwort! Ich möchte hinzufügen, dass Sie das "Update vor dem Löschen" mit einem anstelle des Triggers implementieren können .
ora-600,
Wenn Sie sicherstellen möchten, dass auch Indexdaten überschrieben werden, können Sie die Tabelle verkleinern, alle Indizes (dieser Tabelle) neu erstellen, eine neue Tabelle mit PCT_FREE = 99 erstellen, die Sie erweitern, bis der gesamte freie Speicherplatz belegt ist, und diese Tabelle dann mit füllen Dummy-Zeilen. Schließlich können Sie den Tisch fallen lassen, um Speicherplatz freizugeben. Dies ist definitiv keine Aufgabe, die Sie nach jedem Löschen automatisch ausführen sollten. Denken Sie auch daran, die automatische Erweiterung zu deaktivieren, bevor Sie diesen Vorgang ausführen.
ora-600,
0

Ich glaube nicht, dass die Daten nach einem Löschvorgang bestehen bleiben, aber Sie haben Recht, dass der Speicherplatz von dieser Tabelle verwendet wird, bis er wieder aufgefüllt wurde. Die Spitzenplatznutzung in einer Tabelle wird als High Water Mark bezeichnet. Tom Kyte hat einen wirklich guten (nicht überraschenden) Beitrag dazu.

Sie reduzieren die High Water Mark, indem Sie die Tabelle neu erstellen:

alter table my_table_name move

oder durch Abschneiden; In einer aktiven Tabelle ist dies jedoch offensichtlich keine Option.

Ben
quelle
ISTBC, aber ich würde erwarten, dass die Daten nach einem Löschvorgang noch vorhanden sind (in "roher" Form). Es wird dort sein, es ist nur so, dass die Zeile von der Tabelle "gelöst" und der Platz als frei markiert wurde. Tom Kyte sagt dazu: "Wenn Sie also die Informationen löschen, ist der Block immer noch" ein Block ", es ist nur ein Block, der einmal aktive Zeilen hatte - aber nicht mehr." Da bin ich mir allerdings nicht hundertprozentig sicher, also keine Ablehnung. :)
@ cagcowboy, er sagt auch, "wir könnten viele Blöcke haben, die keine Daten mehr enthalten ". Ich habe dies immer so verstanden, dass der Speicherplatz für die zukünftige Verwendung beibehalten wird, die Daten jedoch nicht mehr vorhanden sind. Ich bin jedoch bereit, mich als falsch zu erweisen :-).
Ben
3
Ich verstehe dein Argument. Ich würde jedoch vermuten, dass er hätte schreiben können: "Wir haben möglicherweise viele Blöcke, die keine aktiven Daten mehr enthalten ." Grundsätzlich würde ich nicht erwarten, dass Oracle gelöschte Daten überschreibt - ich denke, dass es diese einfach nicht referenziert.