OS'ye geri dönmek için tuşunu kullanın VACUUM FULL
. Sanırım o sırada koştun VACUUM FULL ANALYZE
. Ben kılavuzu alıntı :
FULL
Daha fazla yer kaplayabilen , ancak çok daha uzun süren ve yalnızca masayı kilitleyen "tam" vakumu seçer . Bu yöntem ayrıca tablonun yeni bir kopyasını yazdığı ve işlem tamamlanana kadar eski kopyayı serbest bırakmadığı için fazladan disk alanı gerektirir. Genellikle bu yalnızca tablonun içinden önemli miktarda alan geri kazanılması gerektiğinde kullanılmalıdır.
Cesur vurgu benim.
CLUSTER
bunu da teminat etkisi olarak başarır.
Plain VACUUM
normalde hedefinize ulaşmaz ( "tablonun sonunda bir veya daha fazla sayfa tamamen ücretsiz" ). Satırları yeniden sıralamaz ve fırsat ortaya çıktığında yalnızca boş sayfaların bu dosyanın fiziksel sonundan budamasını sağlar - manuel talimatlardaki alıntı gibi.
INSERT
Bir grup satır ve DELETE
diğer gruplara eklenmeden önce fiziksel dosyanın sonunda boş sayfalar alabilirsiniz. Ya da yeterince satır silinirse tesadüf olabilir.
VACUUM FULL
Alan geri kazanılmasını engelleyebilecek özel ayarlar da vardır . Görmek:
Test için tablonun sonunda boş sayfalar hazırlayın
Sistem sütunu ctid
, bir satırın fiziksel konumunu temsil eder. Bu sütunu anlamalısınız:
Bununla çalışabilir ve son sayfadaki tüm satırları silerek bir tablo hazırlayabiliriz:
DELETE FROM tbl t
USING (
SELECT (split_part(ctid::text, ',', 1) || ',0)')::tid AS min_tid
, (split_part(ctid::text, ',', 1) || ',65535)')::tid AS max_tid
FROM tbl
ORDER BY ctid DESC
LIMIT 1
) d
WHERE t.ctid BETWEEN d.min_tid AND d.max_tid;
Şimdi son sayfa boş. Bu, eşzamanlı yazma işlemlerini yoksayar. Ya bu tabloya yazacak tek kişi sizsiniz ya da paraziti önlemek için yazma kilidi almanız gerekir.
Sorgu, uygun satırları hızlı bir şekilde tanımlamak için optimize edilmiştir. tid
A'nın ikinci sayısı, imzasız olarak depolanan tuple indeksidir int2
ve 65535
bu tip ( 2^16 - 1
) için maksimum değerdir , bu nedenle güvenli üst sınır budur.
SQL Fiddle (basit bir tabloyu farklı bir durumdan tekrar kullanmak.)
Satır / tablo boyutunu ölçmek için araçlar:
Disk dolu
Bu işlemlerden herhangi biri için diskte kıpır kıpır boşluk gerekir. / pg_repack
İçin topluluk aracı da vardır . Özel kilitleri önler, ancak çalışmak için de boş alana ihtiyaç duyar. Kullanım kılavuzu:VACUUM FULL
CLUSTER
Hedef tablo (lar) ve dizinlerden iki kat daha büyük boş disk alanı gerektirir.
Son çare olarak, bir döküm / geri yükleme döngüsü çalıştırabilirsiniz. Bu, tüm şişkinliği tablolardan ve dizinlerden de kaldırır. Yakından ilgili soru:
Oradaki cevap oldukça radikal. Durumunuz buna izin veriyorsa (yabancı anahtarlar veya satır silme işlemlerini önleyen başka referanslar yok) ve tabloya eşzamanlı erişim yoksa, şunları yapabilirsiniz:
Bir bağlanırken diske tabloyu dökümü uzak bilgisayara sahip disk alanı bol ( -a
için --data-only
):
Uzak kabuktan tablo verilerini dökümü:
pg_dump -h <host_name> -p <port> -t mytbl -a mydb > db_mytbl.sql
Bir pg oturumunda TRUNCATE
tablo:
-- drop all indexes and constraints here for best performance
TRUNCATE mytbl;
Uzak kabuktan aynı tabloya geri yükleme:
psql -h <host_name> -p <port> mydb -f db_mytbl.sql
-- recreate all indexes and constraints here
Artık herhangi bir ölü sıra veya şişkinlik içermiyor.
Ama belki bu kadar basit olabilir mi?
İlişkisiz dosyaları silerek (taşıyarak) diskte yeterli alan açabilir misiniz?
Eğer Can VACUUM FULL
, ilk önce küçük masalar birer birer suretle yeterli disk alanı boşaltarak?
Şişirilmiş dizinlerden çalışabilir REINDEX TABLE
veya REINDEX INDEX
disk alanını boşaltabilir misiniz?
Ne yaparsan yap, döküntü olma . Şüpheniz varsa, önce her şeyi güvenli bir yere yedekleyin.