menghapus / memperbarui data secara forensik

15

Saya memiliki kebutuhan untuk secara forensik menghapus data dari oracle. Jika saya hanya menghapusnya, pemahaman saya adalah data akan tetap benar-benar ada dalam file data sampai ruang itu digunakan kembali. Saya tidak peduli dengan ruang redo / arsip / undo, mereka akan keluar dengan cepat dengan cepat.

Apakah ada metode untuk memastikan data benar-benar dihapus dari file data?

Matthew Watson
sumber

Jawaban:

15

Ini adalah pertanyaan yang menarik: Kapan Oracle benar-benar menghapus data secara fisik?

Unit data dalam Oracle adalah blok. Mari kita lihat apa yang terjadi ketika kita menghapus satu baris.

Berikut ini contoh dengan tabel sederhana di 11gR2 (lihat " Cara membuang 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;

Anda harus mendapatkan sesuatu seperti ini di akhir file yang dibuat di user_dump_destdirektori Anda :

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

Jika saya menghapus baris kedua, komit dan buang blok yang sama, saya akan mendapatkan sesuatu seperti ini:

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

Rekor masih ada (dengan Dset bendera). Jika kita melihat data biner yang sebenarnya (tepat sebelum block header dumpbagian, kita melihat bahwa data belum ditimpa:

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]

Salah satu cara untuk memaksa data untuk ditimpa sebenarnya adalah dengan memperbaruinya ke nilai yang tidak berarti sebelum menghapus baris. Ini tidak akan berfungsi dengan indeks karena pembaruan diterjemahkan untuk menghapus + menyisipkan indeks ab * tree.

Vincent Malgrat
sumber
+1 "Salah satu cara untuk memaksa data agar benar-benar ditimpa adalah dengan memperbaruinya ke nilai yang tidak berarti sebelum menghapus baris."
Jawaban bagus! Saya ingin menambahkan bahwa Anda dapat menerapkan "pembaruan sebelum menghapus" dengan pemicu .
ora-600
Jika Anda ingin memastikan bahwa data indeks juga ditimpa, Anda dapat mengecilkan tabel, membangun kembali semua indeks (dari tabel itu), membuat tabel baru dengan PCT_FREE = 99 yang Anda perpanjang hingga menghabiskan semua ruang kosong dan kemudian mengisi tabel ini dengan baris boneka. Akhirnya Anda bisa menjatuhkan meja ke ruang kosong. Ini jelas bukan tugas yang harus Anda lakukan secara otomatis setelah setiap penghapusan. Ingat juga untuk menonaktifkan autoextend sebelum melakukan operasi ini.
ora-600
0

Saya tidak berpikir data tetap ada setelah dihapus tetapi Anda benar bahwa ruang akan tetap digunakan oleh tabel itu sampai telah diisi ulang. Penggunaan ruang atas dalam sebuah tabel dikenal sebagai tanda air tinggi. Tom Kyte memiliki postingan yang sangat bagus (tidak mengejutkan) tentang itu.

Anda mengurangi tanda air tinggi dengan membangun kembali tabel:

alter table my_table_name move

atau dengan memotongnya; meskipun dalam tabel aktif ini jelas bukan pilihan.

Ben
sumber
ISTBC, tapi saya berharap data masih ada (dalam bentuk "mentah") setelah dihapus. Itu akan ada di sana, hanya saja baris tersebut telah "dihapus tautannya" dari tabel dan ruang yang ditandai sebagai bebas. Tom Kyte mengatakan ini, "Jadi, ketika Anda menghapus informasi, blok tersebut masih" sebuah blok ", itu hanya sebuah blok yang dulu memiliki baris aktif - tetapi tidak lagi melakukannya." Saya tidak 100% yakin akan hal ini, jadi jangan downvote. :)
@cagcowboy, ia juga mengatakan "kami mungkin memiliki banyak blok yang tidak lagi berisi data ". Saya selalu menganggap ini berarti bahwa ruang tersebut disimpan untuk digunakan di masa depan tetapi datanya hilang. Saya bersedia terbukti salah :-).
Ben
3
Saya mengerti maksud Anda. Namun, saya menduga dia bisa menulis "kami mungkin memiliki banyak blok yang tidak lagi berisi data aktif ." Pada dasarnya, saya tidak akan mengharapkan Oracle untuk menimpa data yang dihapus - saya pikir itu hanya referensi.