PostgreSQL'de disk alanını nasıl geri alabilirim?


25

Cca olan birkaç tablo ile yerel 9.1 veritabanı kurulumum var. 300 milyon kayıt ve veri tabanı 20 GB'a çıktı. Daha sonra delete fromondan tüm kayıtları silmek için emir verdim (kullanmalıydım truncateama bunu bilmiyordum). Bu yüzden disk alanını yeniden kazanmak için db'm üzerinde tam bir boşluk bıraktım, ancak işe yaramıyor. Benim sorunum aynı görünüyor bu bir , ama sağlanan hiçbir çözüm yoktur. Bu konuyu ve belgelerini "disk alanını kurtarma" konusunda zaten kontrol ettim , ancak yine de bir çözüm bulamadım. Tüm tabloların boyutunu almak için bu kodu kullanıyorum

 SELECT nspname || '.' || relname AS "relation",
 pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
 FROM pg_class C
 LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE nspname NOT IN ('pg_catalog', 'information_schema')
 AND C.relkind <> 'i'
 AND nspname !~ '^pg_toast'
 ORDER BY pg_total_relation_size(C.oid) DESC
 LIMIT 15;

Ancak, toplam 1 GB’dan az

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database 

hala yaklaşık 20 GB gösterir. Herhangi bir tavsiye çok takdir etmek.


Peki, boyut sorgunuz hariçtir: dizinler, tabloları pg_catalogve tabloları information_schema. Bu WHEREmaddede belirtilen kısıtlamaları kaldırarak bunlardan herhangi biri olup olmadığını görmeyi deneyin . Lütfen tam PostgreSQL versiyonunuzu ( SELECT version()) ve "tam veritabanını doldurmak" için tam olarak ne yaptığınızı, yani tam komutunuzu gösterin . Mümkünse, çalıştırın VACUUM FULL VERBOSE;(bağımsız değişken yok) ve çıktıyı bir yere yapıştırın, sonra buraya bağlayın.
Craig Ringer

Veritabanını düşürmeyi dene. Ayrıca, veritabanını terk etmeyi deneyebilir ve daha sonra geri yüklemek çöpü bırakır.
jb.

1
jb Bu işe yarar, ama gerekli olmamalıydı. Sorunun ne olduğunu öğrenmek daha iyi.
Craig Ringer,

Yanıtlar:


22

Bunu söylememiş olsanız da, takip ettiğiniz belgelere yaptığınız referanslardan, veritabanında ve / veya etkilenen tablolarda bir VAKUM TAMI yaptığını farz ediyorum. Ayrıca hangi postgresql sürümünü kullandığınızı da belirtmediniz - bunun> 9.0 (VACUUM FULL, bundan önce farklı davrandığını) varsayacağım.

VAKUM DOLU etkilenen tabloları yeni dosyalara yeniden yazar ve ardından eski dosyaları siler. Ancak, herhangi bir işlem hala eski dosyayı açıyorsa, işletim sistemi dosyayı silmez - en son işlem kapanana kadar.

Mümkünse, veritabanını yeniden başlatmak tüm açık dosyaların kapanmasını sağlayacaktır.

Bu pratik değilse, o zaman bu sorunun sizin için olup olmadığını kontrol edebilir ve hangi işlemin açık dosyaları olduğunu görebilirsiniz.

Eğer Linux (ya da diğer Unix benzeri sistemler) kullanıyorsanız, tüm işlemlerde açık olan tüm dosyaların bir listesini almak için 'lsof' komutunu kullanabilirsiniz. Açık ancak o zamandan beri silinmiş olan dosyalar dosya adına '(silindi)' eklenir. Böylece, lsof'un çıktısını alıp silinmiş dosyaları arayarak şöyle yapabilirsiniz:

sudo lsof -u postgres | grep 'deleted'

Bu, hala eski dosyaları açık olan işlemleri tanımlarsa, bu işlemi sonlandırmak için pg_terminate_backend kullanabilirsiniz:

SELECT pg_terminate_backend(xxx);

burada xxx, işlemin PID'sidir, lsof çıktısında bulunur.

Windows kullanıyorsanız, aynı ilke geçerli olabilir, çünkü postgres, FILE_SHARE_DELETE bayrağını kullanarak dosyaları açar; bu, başka bir işlemde açık olan dosyaları silmesine izin verir. ' Handle ' komutu, lsof'un kaba karşılığıdır, ancak dosyaların silinip silinmediğini söyleyip söylemediğinizden emin değilim, bu yüzden bazı ek çalışmalar gerekli olabilir.

Bu tür işlemlerin neden eski dosya tanıtıcılarına asılacağına dair bir başka soru. Ancak içinde iplik Sorunuza alıntı Tom Lane bu olabilir ima etmek gibi görünüyor.


Acilen disk alanını geri almak zorunda kaldım, böylece veritabanını düşürdüm ve yedeklemeden geri yükledim. Bununla birlikte, bu sorunun nasıl çözüleceği “gelecekteki durumlar için hala çok değerli. Veritabanım 9.1, 8 64 bit kazanır, dosya isimlendirmesi (açık dosya halleri) linux ile aynı şekilde uygulanır mı?

@arcull Tamam, Windows kullandığınızı bilmiyordum. Bunun Windows'a nasıl uygulandığına ilişkin cevaba bazı bilgiler ekledim. Yararlı bir cevap olabileceğini düşünüyorsanız, lütfen başkalarının bulmasını kolaylaştıracağı için olumlu düşünün.
harmik
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.