xóa pháp y / cập nhật dữ liệu


15

Tôi có nhu cầu xóa dữ liệu từ nhà tiên tri. Nếu tôi chỉ xóa nó, sự hiểu biết của tôi là dữ liệu sẽ vẫn thực sự nằm trong tệp dữ liệu cho đến khi không gian đó được sử dụng lại. Tôi không quan tâm đến việc làm lại / lưu trữ / hoàn tác không gian, những thứ đó sẽ nhanh chóng hợp lý.

Có phương pháp nào để đảm bảo dữ liệu thực sự bị xóa khỏi tệp dữ liệu không?

Câu trả lời:


15

Đâ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_destthư 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 Dbộ cờ). Nếu chúng ta nhìn vào dữ liệu nhị phân thực tế (ngay trước block header dumpphầ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.


+1 "Một cách để buộc dữ liệu thực sự bị ghi đè sẽ là cập nhật dữ liệu thành giá trị vô nghĩa trước khi xóa hàng."

Câu trả lời chính xác! Tôi muốn thêm rằng bạn có thể thực hiện "cập nhật trước khi xóa" bằng một thay vì kích hoạt .
ora-600

Nếu bạn muốn đảm bảo rằng dữ liệu chỉ mục cũng được ghi đè, bạn có thể thu nhỏ bảng, xây dựng lại tất cả các chỉ mục (của bảng đó), tạo một bảng mới với PCT_FREE = 99 mà bạn mở rộng cho đến khi nó tiêu tốn hết dung lượng trống và sau đó lấp đầy bảng này hàng giả. Cuối cùng, bạn có thể thả bảng vào không gian trống. Đây chắc chắn không phải là một nhiệm vụ bạn nên làm tự động sau mỗi lần xóa. Ngoài ra, hãy nhớ tắt autoextend trước khi thực hiện thao tác này.
ora-600

0

Tôi không nghĩ dữ liệu vẫn tồn tại sau khi xóa nhưng bạn chính xác rằng không gian sẽ được sử dụng bởi bảng đó cho đến khi nó được nạp lại. Việc sử dụng không gian hàng đầu trong một bảng được gọi là dấu nước cao. Tom Kyte có một bài viết thực sự tốt (không ngạc nhiên) về nó.

Bạn giảm cột nước cao bằng cách xây dựng lại bảng:

alter table my_table_name move

hoặc bằng cách cắt nó; mặc dù trong một bảng hoạt động, điều này rõ ràng không phải là một lựa chọn.


ISTBC, nhưng tôi hy vọng dữ liệu vẫn tồn tại (ở dạng "thô") sau khi xóa. Nó sẽ ở đó, chỉ là hàng đã được "hủy liên kết" khỏi bảng và không gian được đánh dấu là miễn phí. Tom Kyte nói điều này "Vì vậy, khi bạn xóa thông tin, khối vẫn là" một khối ", nó chỉ là một khối đã từng có hàng hoạt động - nhưng không còn nữa." Tôi không chắc chắn 100% về điều này, vì vậy không có downvote. :)

@cagcowboy, anh cũng nói "chúng tôi có thể có nhiều khối không còn chứa dữ liệu ". Tôi luôn lấy điều này có nghĩa là không gian được giữ lại để sử dụng trong tương lai nhưng dữ liệu không còn nữa. Tôi sẵn sàng để được chứng minh không chính xác mặc dù :-).
Ben

3
Tôi thấy điểm của bạn. Tuy nhiên, tôi sẽ phỏng đoán rằng anh ta có thể đã viết "chúng ta có thể có nhiều khối không còn chứa dữ liệu hoạt động ." Về cơ bản, tôi sẽ không mong đợi Oracle ghi đè lên dữ liệu đã bị xóa - tôi nghĩ rằng nó chỉ hủy bỏ nó.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.