डेटा को फॉरेंसिकली डिलीट / अपडेट करना


15

मुझे ओरेकल से डेटा को फॉरेंसिक रूप से हटाने की आवश्यकता है। यदि मैं इसे हटाता हूं, तो मेरी समझ अभी भी डेटा वास्तव में डेटा फ़ाइल में रहेगी जब तक कि उस स्थान का पुन: उपयोग नहीं किया जाता है। मैं फिर से / संग्रह / पूर्ववत स्थान के बारे में चिंतित नहीं हूं, वे जल्दी से उचित उम्र के होंगे।

क्या वास्तव में डेटा फ़ाइल से डेटा को हटाने के लिए कोई तरीका है?

जवाबों:


15

यह एक दिलचस्प सवाल है: ओरेकल वास्तव में शारीरिक रूप से डेटा कब हटाता है?

ओरेकल में डेटा की इकाई एक ब्लॉक है। देखते हैं कि जब हम किसी पंक्ति को हटाते हैं तो क्या होता है।

यहां 11gR2 पर एक साधारण तालिका के साथ एक उदाहरण है (देखें " ओरेकल डेटा ब्लॉक कैसे डंप करें? ")।

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]

डेटा को वास्तव में अधिलेखित करने के लिए बाध्य करने का एक तरीका यह होगा कि पंक्ति को हटाने से पहले इसे एक व्यर्थ मान में अपडेट किया जाए। यह अनुक्रमणिकाओं के साथ काम नहीं करेगा क्योंकि अपडेट्स का अनुवाद एब * ट्री इंडेक्स में + डालने के लिए किया जाता है।


+1 "वास्तव में ओवरराइट करने के लिए डेटा को बाध्य करने का एक तरीका पंक्ति को हटाने से पहले इसे एक व्यर्थ मान में अपडेट करना होगा।"

बहुत बढ़िया जवाब! मैं यह जोड़ना चाहता हूं कि आप ट्रिगर के बजाय "डिलीट से पहले अपडेट" को लागू कर सकते हैं ।
ora-600

यदि आप यह सुनिश्चित करना चाहते हैं कि इंडेक्स डेटा भी ओवरराइट हो गया है, तो आप टेबल को सिकोड़ सकते हैं, सभी इंडेक्स (उस तालिका में से) का पुनर्निर्माण कर सकते हैं, PCT_FREE = 99 के साथ एक नई तालिका बनाएँ, जो आप तब तक बढ़ाते हैं जब तक कि वह सभी खाली जगह का उपभोग न कर लें और फिर इस तालिका को भरें। डमी पंक्तियाँ। अंत में आप टेबल को खाली स्थान पर छोड़ सकते हैं। यह निश्चित रूप से एक कार्य नहीं है जिसे आपको प्रत्येक हटाने के बाद स्वचालित रूप से करना चाहिए। इस ऑपरेशन को करने से पहले ऑटोएक्स्टेंड को अक्षम करने का भी ध्यान रखें।
ora-600

0

मुझे नहीं लगता कि डेटा डिलीट होने के बाद भी कायम है, लेकिन आप सही हैं कि जब तक इसे रिफिल नहीं किया गया है, तब तक स्पेस को उस टेबल के उपयोग में रखा जाएगा। किसी तालिका में शीर्ष स्थान उपयोग को उच्च जल चिह्न के रूप में जाना जाता है। टॉम Kyte इसके बारे में एक बहुत अच्छा (अनिश्चित) पोस्ट है।

आप तालिका का पुनर्निर्माण करके उच्च जल चिह्न को कम करते हैं:

alter table my_table_name move

या इसे काटकर; हालांकि एक सक्रिय तालिका में यह स्पष्ट रूप से एक विकल्प नहीं है।


ISTBC, लेकिन मैं उम्मीद करूंगा कि डेटा अभी भी मौजूद है ("कच्चे" रूप में) डिलीट होने के बाद। यह वहाँ होगा, यह सिर्फ यह है कि पंक्ति को टेबल से "अनलिंक" किया गया है और रिक्त स्थान को मुफ्त में चिह्नित किया गया है। टॉम कायटे कहते हैं, "इसलिए, जब आप जानकारी हटाते हैं, तो ब्लॉक अभी भी" एक ब्लॉक "है, यह सिर्फ एक ब्लॉक है जिसमें एक बार सक्रिय पंक्तियाँ थीं - लेकिन अब नहीं है। मैं इस बारे में 100% सुनिश्चित नहीं हूँ, लेकिन कोई डाउनवोट नहीं है। :)

@cagcowboy, वह यह भी कहते हैं "हमारे पास कई ब्लॉक हो सकते हैं जिनमें अब डेटा नहीं है "। मैंने हमेशा इसका मतलब यह निकाला है कि भविष्य के उपयोग के लिए स्थान रखा गया है लेकिन डेटा चला गया है। मैं गलत साबित होने को तैयार हूँ, हालांकि :-)।
बेन

3
में तुम्हारी बात समझ रहा हूँ। हालांकि, मैं यह सुनिश्चित करूंगा कि वह लिख सकता है "हमारे पास कई ब्लॉक हो सकते हैं जिनमें अब सक्रिय डेटा नहीं है।" मूल रूप से, मैं ओरेकल को हटाए गए डेटा को अधिलेखित करने की उम्मीद नहीं करूंगा - मुझे लगता है कि यह सिर्फ इसे संदर्भित करता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.