Đây là một câu hỏi thú vị: Khi nào Oracle thực sự xóa dữ liệu vật lý?
Đơn vị dữ liệu trong Oracle là một khối. Hãy xem điều gì xảy ra khi chúng ta xóa một hàng.
Đây là một ví dụ với một bảng đơn giản trên 11gR2 (xem " Cách đổ khối dữ liệu 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;
Bạn sẽ nhận được một cái gì đó như thế này ở cuối tập tin được tạo trong user_dump_dest
thư mục của bạn :
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
Nếu tôi xóa hàng thứ hai, cam kết và kết xuất cùng một khối, tôi sẽ nhận được một cái gì đó như thế này:
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
Bản ghi vẫn còn đó (với một D
bộ cờ). Nếu chúng ta nhìn vào dữ liệu nhị phân thực tế (ngay trước block header dump
phần này, chúng ta sẽ thấy rằng dữ liệu chưa bị ghi đè:
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]
Một cách để buộc dữ liệu thực sự bị ghi đè sẽ là cập nhật nó thành một giá trị vô nghĩa trước khi xóa hàng. Điều này sẽ không hoạt động với các chỉ mục vì các bản cập nhật được dịch để xóa + chèn vào chỉ mục ab * cây.