borrado / actualización forense de datos

15

Tengo la necesidad de eliminar forensemente los datos de Oracle. Si solo lo elimino, entiendo que los datos todavía estarán en el archivo de datos hasta que se reutilice ese espacio. No estoy preocupado por el espacio de rehacer / archivar / deshacer, esos envejecerán razonablemente rápidamente.

¿Hay algún método para garantizar que los datos se eliminen de un archivo de datos?

Matthew Watson
fuente

Respuestas:

15

Esta es una pregunta interesante: ¿cuándo Oracle realmente elimina los datos físicamente?

La unidad de datos en Oracle es un bloque. Veamos qué sucede cuando eliminamos una fila.

Aquí hay un ejemplo con una tabla simple en 11gR2 (consulte " ¿Cómo volcar 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;

Debería obtener algo como esto al final del archivo creado en su user_dump_destdirectorio:

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

Si elimino la segunda fila, confirmo y vuelco el mismo bloque, obtendré algo como esto:

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

El registro todavía está allí (con un Dconjunto de banderas). Si miramos los datos binarios reales (justo antes de la block header dumpsección, vemos que los datos aún no se han sobrescrito:

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]

Una forma de forzar que los datos se sobrescriban realmente sería actualizarlos a un valor sin sentido antes de eliminar la fila. Esto no funcionaría con los índices ya que las actualizaciones se traducen para eliminar + insertar en el índice ab * tree.

Vincent Malgrat
fuente
+1 "Una forma de forzar que los datos se sobrescriban realmente sería actualizarlos a un valor sin sentido antes de eliminar la fila".
¡Gran respuesta! Me gustaría agregar que puede implementar la "actualización antes de eliminar" con un activador en lugar de .
ora-600
Si desea asegurarse de que los datos del índice también se sobrescriban, puede reducir la tabla, reconstruir todos los índices (de esa tabla), crear una nueva tabla con PCT_FREE = 99 que extienda hasta que consuma todo el espacio libre y luego llene esta tabla con filas falsas Finalmente, puede soltar la tabla en el espacio libre. Definitivamente, esta no es una tarea que debe hacer automáticamente después de cada eliminación. También tenga en cuenta deshabilitar la extensión automática antes de realizar esta operación.
ora-600
0

No creo que los datos persistan después de una eliminación, pero tiene razón en que esa tabla mantendrá el espacio en uso hasta que se haya rellenado. El uso de espacio superior en una tabla se conoce como la marca de límite superior. Tom Kyte tiene una publicación realmente buena (como era de esperar) al respecto.

Reduce la marca de agua alta reconstruyendo la tabla:

alter table my_table_name move

o truncándolo; aunque en una tabla activa esto obviamente no es una opción.

Ben
fuente
ISTBC, pero esperaría que los datos aún existan (en forma "en bruto") después de una eliminación. Estará allí, es solo que la fila ha sido "desvinculada" de la tabla y el espacio marcado como libre. Tom Kyte dice: "Entonces, cuando eliminas la información, el bloque sigue siendo" un bloque ", es solo un bloque que una vez tuvo filas activas, pero ya no lo tiene". Sin embargo, no estoy 100% seguro de esto, así que no hay voto negativo. :)
@cagcowboy, también dice "podríamos tener muchos bloques que ya no contienen datos ". Siempre he tomado esto para significar que el espacio se mantiene para uso futuro pero los datos se han ido. Sin embargo, estoy dispuesto a probar que soy incorrecto :-).
Ben
3
Te entiendo. Sin embargo, supongo que podría haber escrito "podríamos tener muchos bloques que ya no contienen datos activos ". Básicamente, no esperaría que Oracle sobrescribiera los datos eliminados, creo que simplemente no hace referencia a ellos.