Bir tablo alanından mantıksal alanı kurtarma


11

DATA adlı bir tablo alanı var ve yanlış olarak otomatik genişletme ile ayarlanır. Bu tablo alanı iki veri dosyasına sahiptir ve 350 GB fiziksel alan kaplayacak şekilde ayarlanmıştır.

Bir hafta önce user_tablespaces ve dba_data_files dosyalarını sorguladım ve% 20 kullanılabilir mantıksal alana sahip olduğunu fark ettim. Sonra bir temizleme ile ilan ve bu tablo alanındaki tablolardan birçok kayıt kaldırıldı. Mevcut alanda büyük bir artış görmeyi umuyorduk. Ne yazık ki görüşlerini sorgulamak zaman kullanılabilir alan şimdi% 20.5 olduğunu fark ettim.

Bunun nedeni veri parçalanması olabilir mi? Tablo alanını bir şekilde "birleştirebilir" ve kayıp alanı kurtarabilir miyiz? Yoksa sıfırdan tablo alanını yeniden mi oluşturmamız gerekiyor?

Yanıtlar:


14

Kayıtları sildiğinizde, segmenti otomatik olarak sıkıştıran hiçbir şey yoktur, bu nedenle alanı geri kazanmak için bir segment küçültme yapmanız gerekecektir. 11.2 Yönetici İsraf Alanını Geri Kazanma Kılavuzundan alıntı :

Zaman içinde, bir tablo alanındaki nesnelerdeki güncellemeler ve silmeler, yeni veriler için tek tek yeniden kullanılacak kadar büyük olmayan boş alan cepleri oluşturabilir. Bu tür boş alan parçalanmış boş alan olarak adlandırılır.

Parçalanmış boş alana sahip nesneler çok fazla boşa neden olabilir ve veritabanı performansını etkileyebilir. Bu alanı birleştirmenin ve geri almanın tercih edilen yolu, çevrimiçi segment küçültme yapmaktır. Bu işlem, yüksek su işaretinin altındaki parçalanmış boş alanı birleştirir ve segmenti sıkıştırır. Sıkıştırmadan sonra, yüksek su işareti taşınır ve yüksek su işaretinin üzerinde yeni boş alan oluşur. Daha sonra yüksek su işaretinin üzerindeki boşluk yeniden yerleştirilir. Segment, işlemlerin çoğu sırasında sorgular ve DML için kullanılabilir durumdadır ve fazladan disk alanı ayrılmasına gerek yoktur.

Daha sonra aynı sayfada bunu okuyabilirsiniz:

Segment küçültme çevrimiçi, yerinde bir işlemdir. DML işlemleri ve sorguları, segment küçültmenin veri taşıma aşamasında verilebilir. Büzülme işleminin sonunda, alan yeniden yerleştirildiğinde eşzamanlı DML işlemleri kısa bir süre engellenir. Büzülme işlemi sırasında endeksler korunur ve işlem tamamlandıktan sonra kullanılabilir kalır. Segment küçültme için ek disk alanı ayrılması gerekmez.

Segment küçültme, yüksek su işaretinin üstünde ve altında kullanılmayan alanı geri kazanır. Buna karşılık, boşluk dağıtımı, kullanılmayan alanı sadece yüksek su işaretinin üzerinde geri kazanır. Shrink işlemlerinde, veritabanı varsayılan olarak segmenti sıkıştırır, yüksek su işaretini ayarlar ve geri kazanılan alanı serbest bırakır.

Sayfa, örnekler dahil olmak üzere konu hakkında çok daha fazla bilgi içermektedir.

"Segment Uzay ve Yüksek Su Mark" Concepts bölüm Kılavuzu da yararlı olabilir.


9

Evet, bunun nedeni parçalanmadır.

Alanı geri kazanmak için, ilk önce aşağıdaki sorguyla tablo alanında tabloların bir listesini alın (bölümleri yoksayma - kullanıyorsanız sorunuzu düzenleyin):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Ardından her tablo için satır hareketini etkinleştirin:

alter table TABLEINDATAPARTITION enable row movement;

Daha sonra tabloyu küçültebilirsiniz:

alter table TABLEINDATAPARTITION shrink space;

Sonra veri dosyalarını küçültün:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Veri dosyası adları DBA_DATA_FILES, önceden bildiğiniz görünümden edinilebilir .


Mükemmel, pratik bir cevap. +1
Leigh Riffel
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.