司法删除/更新数据


15

我需要从甲骨文中取证删除数据。如果我只是删除它,我的理解是数据将实际上仍然存在于数据文件中,直到重新使用该空间为止。我不在乎重做/归档/撤消空间,那些空间会很快老化。

有什么方法可以确保实际上已从数据文件中删除数据?

Answers:


15

这是一个有趣的问题:Oracle何时真正真正删除数据?

Oracle中的数据单位是一个块。让我们看看删除行时会发生什么。

这是一个有关11gR2的简单表的示例(请参见“ 如何转储Oracle数据块? ”):

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;

您应该在user_dump_dest目录中创建的文件末尾看到类似以下内容:

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

如果删除第二行,提交并转储相同的块,我将得到以下内容:

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

记录仍然存在(已D设置标志)。如果我们查看实际的二进制数据(就在本block header dump节之前,我们会发现数据尚未被覆盖:

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]

强制实际覆盖数据的一种方法是在删除行之前将其更新为无意义的值。这不适用于索引,因为更新被转换为在ab * tree索引中删除+插入。


+1“强制实际覆盖数据的一种方法是在删除行之前将其更新为无意义的值。”

好答案!我想补充一点,您可以使用而不是触发器来实现“删除前更新” 。
ora-600

如果要确保索引数据也被覆盖,则可以缩小表,重建(该表的)所有索引,使用PCT_FREE = 99创建一个新表,并对其进行扩展直到其消耗所有可用空间,然后用该表填充虚拟行。最后,您可以将表放到可用空间中。绝对不是您要在每次删除后自动执行的任务。另外请记住在执行此操作之前禁用自动扩展。
ora-600

0

我认为删除后数据不会保留,但您是正确的,该空间将一直被该表使用,直到重新填充为止。表格中顶部空间的使用称为高水位线。汤姆·凯特(Tom Kyte)的帖子非常好(毫不奇怪)

您可以通过重建表来减少高水位线:

alter table my_table_name move

或通过截断;尽管在活动表中这显然不是一个选择。


ISTBC,但我希望删除后数据仍然存在(以“原始”形式)。它将在那里,只是该行已从表中“取消链接”,并且空间标记为空闲。汤姆·凯特(Tom Kyte)这样说:“因此,当您删除信息时,该块仍然是“一个块”,它只是一个曾经具有活动行的块-但不再存在。我不是对此有100%的把握,因此请不要投票。:)

@cagcowboy,他还说:“我们可能有许多不再包含数据的块”。我一直认为这是为了保留将来的空间而已,但数据已消失。我愿意被证明是不正确的:-)。
2012年

3
我明白你的意思了。但是,我想他可能写了“我们可能有很多不再包含活动数据的块”。基本上,我不希望Oracle 覆盖已删除的数据-我认为它只是取消引用它。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.