การลบ / ปรับปรุงข้อมูลทางนิติเวช


15

ฉันต้องการลบข้อมูลทางนิติเวชออกจาก oracle หากฉันเพิ่งลบมันความเข้าใจของฉันคือข้อมูลจะยังคงอยู่ในไฟล์ข้อมูลจนกว่าจะนำพื้นที่นั้นกลับมาใช้ใหม่ ฉันไม่ได้กังวลเกี่ยวกับการทำซ้ำ / เก็บถาวร / เลิกพื้นที่เหล่านั้นจะหมดอายุเร็วพอสมควร

มีวิธีใดที่จะทำให้แน่ใจว่าข้อมูลถูกลบออกจากไฟล์ข้อมูลจริงหรือไม่?

คำตอบ:


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 *


+1 "วิธีหนึ่งในการบังคับให้เขียนทับข้อมูลจริงคือการอัปเดตเป็นค่าที่ไม่มีความหมายก่อนที่จะลบแถว"

คำตอบที่ดี! ฉันต้องการที่จะเพิ่มให้คุณสามารถใช้ "การปรับปรุงก่อนที่จะลบ" กับแทนของทริกเกอร์
ora-600

หากคุณต้องการตรวจสอบให้แน่ใจว่าข้อมูลดัชนีถูกเขียนทับคุณสามารถลดขนาดตารางสร้างดัชนีทั้งหมด (ของตารางนั้น) สร้างตารางใหม่ด้วย PCT_FREE = 99 ที่คุณขยายจนเต็มพื้นที่ว่างทั้งหมดจากนั้นเติมตารางนี้ด้วย แถวจำลอง ในที่สุดคุณสามารถวางตารางเพื่อเพิ่มพื้นที่ว่าง นี่ไม่ใช่งานที่คุณควรทำโดยอัตโนมัติหลังจากลบแต่ละครั้ง โปรดทราบว่าให้ปิดใช้งานการขยายข้อความอัตโนมัติก่อนที่จะดำเนินการนี้
ora-600

0

ฉันไม่คิดว่าข้อมูลจะยังคงอยู่หลังจากลบ แต่คุณถูกต้องว่าพื้นที่นั้นจะถูกใช้งานโดยตารางนั้นจนกว่าจะมีการเติมใหม่ การใช้พื้นที่บนโต๊ะเป็นที่รู้จักกันในชื่อเครื่องหมายน้ำสูง ทอม Kyte มีดีจริงๆ (แปลกใจ) โพสต์เกี่ยวกับเรื่องนี้ดีมาก

คุณลดเครื่องหมายน้ำสูงโดยการสร้างตารางใหม่:

alter table my_table_name move

หรือโดยการตัดทอนมัน; แม้ว่าในตารางที่ใช้งานอยู่จะเห็นได้ชัดว่าไม่ใช่ตัวเลือก


ISTBC แต่ฉันคาดว่าข้อมูลจะยังคงอยู่ (ในรูปแบบ "ดิบ") หลังจากลบ มันจะอยู่ตรงนั้นแถวนั้นถูก "ยกเลิกการเชื่อมโยง" จากตารางและพื้นที่ว่างที่ทำเครื่องหมายว่าว่าง Tom Kyte กล่าวว่า "ดังนั้นเมื่อคุณลบข้อมูลบล็อกนั้นยังคงเป็น" บล็อก "มันเป็นเพียงบล็อกที่ครั้งหนึ่งเคยมีแถวที่ใช้งานอยู่ แต่ไม่มีอีกต่อไปแล้ว" แม้ว่าฉันจะไม่แน่ใจ 100% ดังนั้นจึงไม่มีการลงคะแนน :)

@ccowcowboy เขายังบอกด้วยว่า "เราอาจมีหลายบล็อคที่ไม่มีข้อมูลอีกต่อไป " ฉันใช้สิ่งนี้เสมอเพื่อหมายความว่าพื้นที่ถูกเก็บไว้สำหรับการใช้งานในอนาคต แต่ข้อมูลหายไป ฉันยินดีที่จะพิสูจน์ว่าไม่ถูกต้องแม้ว่า :-)
เบ็น

3
ฉันเห็นประเด็นของคุณ อย่างไรก็ตามฉันจะคาดเดาได้ว่าเขาสามารถเขียน "เราอาจมีหลายบล็อกที่ไม่มีข้อมูลที่ใช้งานอยู่ " โดยทั่วไปฉันไม่คาดหวังว่า Oracle จะเขียนทับข้อมูลที่ถูกลบ - ฉันคิดว่ามันเป็นเพียงการอ้างอิง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.