kryminalistyczne usuwanie / aktualizacja danych

15

Mam potrzebę kryminalistycznego usuwania danych z Oracle. Jeśli go po prostu usunę, rozumiem, że dane nadal będą znajdować się w pliku danych, dopóki to miejsce nie zostanie ponownie wykorzystane. Nie martwię się o przestrzeń do ponawiania / archiwizacji / cofania, szybko się zestarzeją.

Czy istnieją metody zapewnienia, że ​​dane zostaną faktycznie usunięte z pliku danych?

Matthew Watson
źródło

Odpowiedzi:

15

To interesujące pytanie: kiedy Oracle naprawdę usuwa dane fizycznie?

Jednostką danych w Oracle jest blok. Zobaczmy, co się stanie, gdy usuniemy wiersz.

Oto przykład z prostą tabelą na 11gR2 (patrz „ Jak zrzucić Oracle Data Block? ”):

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;

Powinieneś dostać coś takiego na końcu pliku utworzonego w twoim user_dump_destkatalogu:

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

Jeśli usunę drugi wiersz, zatwierdzę i zrzucę ten sam blok, otrzymam coś takiego:

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

Rekord wciąż tam jest (z D ustawioną flagą). Jeśli spojrzymy na rzeczywiste dane binarne (tuż przed block header dumpsekcją, zobaczymy, że dane nie zostały jeszcze nadpisane:

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]

Jednym ze sposobów wymuszenia faktycznego zastąpienia danych byłoby zaktualizowanie ich do nieistotnej wartości przed usunięciem wiersza. Nie działałoby to z indeksami, ponieważ aktualizacje są tłumaczone na usuwanie + wstawianie do indeksu drzewa ab *.

Vincent Malgrat
źródło
+1 „Jednym ze sposobów wymuszenia zastąpienia danych byłoby zaktualizowanie ich do nieistotnej wartości przed usunięciem wiersza”.
Świetna odpowiedź! Chciałbym dodać, że możesz wdrożyć „aktualizację przed usunięciem” zamiast wyzwalacza .
ora-600,
Jeśli chcesz mieć pewność, że dane indeksu również zostaną nadpisane, możesz zmniejszyć tabelę, odbudować wszystkie indeksy (tej tabeli), utworzyć nową tabelę z PCT_FREE = 99, którą rozszerzysz, aż zajmie całą wolną przestrzeń, a następnie zapełnij tę tabelę obojętne rzędy. Wreszcie możesz upuścić stół na wolne miejsce. To zdecydowanie nie jest zadanie, które powinieneś wykonywać automatycznie po każdym usunięciu. Pamiętaj również, aby wyłączyć automatyczne przedłużanie przed wykonaniem tej operacji.
ora-600,
0

Nie sądzę, że dane są usuwane po usunięciu, ale masz rację, że przestrzeń będzie używana przez tę tabelę, dopóki nie zostanie ponownie wypełniona. Wykorzystanie największej przestrzeni w tabeli jest znane jako znak wysokiej wody. Tom Kyte ma naprawdę dobry (nie zaskakujący) post na ten temat.

Zmniejszasz znak wysokiej wody, odbudowując stół:

alter table my_table_name move

lub przez obcięcie; chociaż w aktywnej tabeli nie jest to oczywiście opcja.

Ben
źródło
ISTBC, ale oczekiwałbym, że dane nadal będą istnieć (w postaci „surowej”) po usunięciu. Będzie tam, po prostu wiersz został „odłączony” od stołu, a miejsce oznaczone jako wolne. Tom Kyte mówi to „Tak więc, kiedy usuwasz informacje, blok nadal jest„ blokiem ”, jest to tylko blok, który kiedyś miał aktywne wiersze - ale już nie ma”. Nie jestem tego jednak w 100% pewien, więc nie głosuj negatywnie. :)
@cagcowboy mówi także, że „możemy mieć wiele bloków, które już nie zawierają danych ”. Zawsze uważałem, że oznacza to, że przestrzeń jest przechowywana do wykorzystania w przyszłości, ale danych już nie ma. Jestem jednak skłonny udowodnić, że się mylę :-).
Ben,
3
Rozumiem co masz na myśli. Przypuszczam jednak, że mógł napisać „możemy mieć wiele bloków, które nie zawierają już aktywnych danych”. Zasadniczo nie spodziewałbym się, że Oracle zastąpi usunięte dane - myślę, że to po prostu nie powoduje odniesienia.