verileri adli olarak silme / güncelleme


15

Verileri kehanetten adli olarak çıkarmaya ihtiyacım var. Sadece silersem, bu alan yeniden kullanılıncaya kadar verilerin gerçekte veri dosyasında kalacağını anlıyorum. Yinele / arşivle / geri al alanından endişe duymuyorum, bunlar hızlı bir şekilde yaşlanacak.

Verilerin bir veri dosyasından gerçekten kaldırılmasını sağlamak için herhangi bir yöntem var mı?

Yanıtlar:


15

Bu ilginç bir soru: Oracle verileri ne zaman fiziksel olarak siler?

Oracle'daki veri birimi bir bloktur. Bir satırı sildiğimizde ne olacağını görelim.

İşte 11gR2'de basit bir tablo içeren bir örnek (bkz. " Oracle Veri Bloğu nasıl dökülür ? "):

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;

Dizininizde oluşturulan dosyanın sonunda böyle bir şey almalısınız 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

Ben ikinci satırı silmek, taahhüt ve aynı blok dökümü, ben böyle bir şey alacak:

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

Kayıt hala orada (bir Dbayrak seti ile). Gerçek ikili verilere bakarsak ( block header dumpbölümden hemen önce , verilerin henüz üzerine yazılmadığını görürüz:

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]

Verilerin üzerine yazılmaya zorlamanın bir yolu, satırı silmeden önce verileri anlamsız bir değere güncellemektir. Güncellemeler ab * ağaç dizinindeki delete + insert'e çevrildiğinden, bu dizinlerle çalışmaz.


+1 "Verilerin üzerine yazılmaya zorlamanın bir yolu, satırı silmeden önce verileri anlamsız bir değere güncellemektir."

Mükemmel cevap! Ben tetikleyici yerine "silmeden önce güncelle" uygulayabilirsiniz eklemek istiyorum .
ora-600

Dizin verilerinin de üzerine yazıldığından emin olmak istiyorsanız, tabloyu küçültebilir, tüm dizinleri (o tablonun) yeniden oluşturabilir, tüm boş alanı tüketene kadar genişlettiğiniz PCT_FREE = 99 ile yeni bir tablo oluşturabilir ve ardından bu tabloyu kukla satırlar. Sonunda boş alan için masayı düşürebilirsiniz. Bu kesinlikle her silme işleminden sonra otomatik olarak yapmanız gereken bir görev değildir. Ayrıca, bu işlemi gerçekleştirmeden önce otomatik uzamı devre dışı bırakmayı unutmayın.
ora-600

0

Silme işleminden sonra verilerin devam ettiğini düşünmüyorum, ancak yeniden dolduruluncaya kadar alanın bu tablo tarafından kullanımda olacağından eminsiniz. Bir tablodaki en üst alan kullanımı yüksek su işareti olarak bilinir. Tom Kyte hakkında gerçekten iyi (şaşırtıcı olmayan) bir yazı var.

Masayı yeniden inşa ederek yüksek su işaretini azaltırsınız:

alter table my_table_name move

veya keserek; ancak aktif bir tabloda bu bir seçenek değildir.


ISTBC, ancak bir silme işleminden sonra verilerin hala var olmasını beklerim ("ham" formda). Orada olacak, sadece satırın tablodan "bağlantısı kaldırılmış" ve boş olarak işaretlenmiş alan var. Tom Kyte bunu söylüyor: "Yani, bilgiyi sildiğinizde, blok hala" bir blok ", sadece bir zamanlar aktif satırları olan bir blok - ama artık yok." Buna rağmen% 100 emin değilim, bu yüzden aşağı oy yok. :)

@cagcowboy, " artık veri içermeyen birçok bloğumuz olabilir" diyor . Bunu her zaman alanın gelecekteki kullanım için saklandığı, ancak verilerin kaybolduğu anlamına geldim. Yine de yanlış kanıtlanmaya hazırım :-).
Ben

3
Senin değinmek istediğin noktayı anlıyorum. Ancak, "artık aktif veri içermeyen birçok bloğumuz olabilir" yazabilirdi . Temel olarak, Oracle'ın silinen verilerin üzerine yazmasını beklemezdim - bence sadece referans veriyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.