법 의학적 데이터 삭제 / 업데이트


15

오라클에서 데이터를 법 의학적으로 제거해야합니다. 방금 삭제하면 공간이 재사용 될 때까지 데이터가 실제로 데이터 파일에 남아 있다는 것을 이해합니다. 리두 / 아카이브 / 실행 취소 공간에 대해 걱정하지 않습니다.

데이터가 실제로 데이터 파일에서 제거되도록하는 방법이 있습니까?

답변:


15

이것은 흥미로운 질문입니다. 오라클은 언제 실제로 데이터를 실제로 삭제합니까?

Oracle의 데이터 단위는 블록입니다. 행을 삭제하면 어떻게되는지 봅시다.

다음은 11gR2에 간단한 테이블이있는 예입니다 ( " 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;

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 인덱스에서 delete + insert로 변환되므로 인덱스에서는 작동하지 않습니다.


+1 "데이터를 실제로 덮어 쓰는 한 가지 방법은 행을 삭제하기 전에 데이터를 의미없는 값으로 업데이트하는 것입니다."

좋은 대답입니다! 트리거 대신 "삭제 전 업데이트"를 구현할 수 있다고 덧붙이고 싶습니다 .
ora-600

인덱스 데이터를 덮어 쓰려면 테이블을 축소하고 해당 테이블의 모든 인덱스를 다시 작성하고 모든 여유 공간을 사용할 때까지 확장 한 PCT_FREE = 99로 새 테이블을 만든 다음이 테이블을 더미 행. 마지막으로 여유 공간을 확보하기 위해 테이블을 삭제할 수 있습니다. 각 삭제 후 자동으로 수행해야하는 작업은 아닙니다. 또한이 작업을 수행하기 전에 자동 확장을 비활성화해야합니다.
ora-600

0

삭제 후에도 데이터가 유지되지 않는다고 생각하지만 리필 될 때까지 해당 테이블에서 공간을 계속 사용하는 것이 맞습니다. 테이블의 최상위 공간 사용량을 최고 워터 마크라고합니다. Tom Kyte는 그것에 대해 정말로 좋은 소식을 가지고 있습니다.

테이블을 다시 작성하여 높은 워터 마크를 줄입니다.

alter table my_table_name move

또는 잘림으로써; 활성 테이블에서는 분명히 옵션이 아닙니다.


ISTBC, 그러나 삭제 후 데이터가 여전히 "원시"형식으로 존재할 것으로 예상합니다. 거기에있을 것입니다. 행이 테이블에서 "연결 해제"되었고 빈 공간으로 표시되었습니다. Tom Kyte는 이렇게 말합니다. "정보를 삭제할 때 블록은 여전히"블록 "입니다. 블록은 한 번만 활성 행을 가졌지 만 더 이상 그렇지 않습니다." 나는 이것을 100 % 확신하지 못하므로 downvote는 없습니다. :)

@cagcowboy는 또한 "우리는 더 이상 데이터를 포함하지 않는 많은 블록을 가질 수있다 "고 말했다. 나는 항상 공간을 나중에 사용하기 위해 유지하지만 데이터는 사라 졌다는 것을 의미하기 위해 이것을 취했습니다. :-) 그래도 틀린 것으로 판명되었습니다.

3
너의 의도를 알 겠어. 그러나 그는 "우리는 더 이상 활성 데이터를 포함하지 않는 많은 블록을 가질 수 있습니다"라고 쓸 수 있다고 생각 합니다. 기본적으로 오라클이 삭제 된 데이터 를 덮어 쓰지 않을 것이라고 생각합니다. 단지 참조하지 않는 것 같습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.