Bırakılan veritabanından sonra disk alanı boşaltın


12

Bir dev sistemi üzerinde çalışıyorum ve dev amaçlar için kullandığım bir veritabanına, "foo" diyorum. Sapıklıklar üzerinde çalışırken, DROP DATABASE foo kullanıyorum. Ancak, diskimdeki tüm alanı yediğimi hemen fark ettim. Bok.

VACUUM FULL, farklı bir mantıksal veritabanından, daha önce bıraktığım veritabanından alan açıyor mu (foo)? Bunu farklı bir mantıksal veritabanından denedim ve boş alan geri kazanıldı, ancak yaptığım tüm CREATE DATABASE / DROP DATABASE çağrılarını hesaba katmak için yeterli olduğunu düşünmüyorum. Sadece çalıştırdığım mantıksal veritabanını VACUUM'lamış olabilir.

Toplam veritabanı başlangıcı yapmadan bu alanı geri almanın bir yolu olmalı?

DÜZENLE

Bu yüzden, kabaca bu adımları izleyerek veritabanını bir yedeklemeden yeniden başlattım . Geri yükleme işleminden sonra, diskte bir TON alan geri kazandım! Şimdilik işe yarıyor, ancak bırakılan bir veritabanının nasıl temizleneceğine ilişkin yardım yine de yararlı olacaktır.

DÜZENLEME 2

Bu konuda daha fazla bilgi toplamayı başardım ... Örnek olarak bulduğum şey:

Initial partition size:
                       Size   Used  Avail Use% Mounted on
                        25G   8.1G    16G  35% /apps1

After creating my new database and populating it:
                        25G    18G   6.4G  73% /apps1

After Dropping the database using "DROP database mydb" from a separate logical DB:
                        25G    13G    11G  56% /apps1

Bana öyle geliyor ki yeni DB diskte ~ 9.6 GB aldı. Ancak, bırakıldıktan sonra, geri kazanılan disk alanı sadece ~ 4.6G büyüdü. Neler olduğunu merak etmem için kabaca 5 GB alan var !?

Ve yeniden yarattığım, doldurduğum ve tekrar düştüğümde bu döngüye devam ediyor.

Herkes "DROP DATABASE" komutu verildikten sonra ne olduğunu düşünüyor mu?


Belki de arşivlemenin AÇIK olduğunu belirtmek gerekir. WAL arşiv dosyalarının yazıldığı konumun oldukça büyük olduğu anlaşılıyor. Onu yakından izlemiyorum. Belki de yukarıda listelenen aynı prosedürü deneyeceğim ve tüm alanın geri kazanılıp kazanılmadığını görmek için bu dizinde "du" çalıştıracağım. Rapor vereceğim.
Jmoney38

Vakum o zaman yardımcı olmuyor mu?
rogerdpack

Yanıtlar:


6

Deneyin sudo lsof| grep deletedve herhangi PostgreSQL süreci görünüp görünmediğini kontrol edin. Bu komut silinmiş dosyaları arar, ancak dosya tanımlayıcıları herhangi bir işlem tarafından hala açıktır. Başka bir yan etkisi de df -hve du -sh /farklıdır. Bunun nedeni du, dosya sistemine bakar ve tüm dosyaların boyutunu dftoplar ve fiziksel aygıta bakar.

Ben sadece herhangi bir alan sonra boş vermedi bir veritabanı ile ilgili bir sorun DROP tableoldu ve nedeni bu oldu.

Bildiğim tek çözüm veritabanını yeniden başlatmaktır. Belki yeniden yükleme (SIGHUP) göndermeyi deneyebilirsiniz.


2
lsof | grep deletedUç iyi bir oldu; buna ek olarak, yalnızca hangi postgresql oturumlarının hala etkin olduğunu belirlemeniz ve dosyaları serbest bırakmak için onları öldürmeniz gerektiğini ekleyin. Benim durumumda, neredeyse tamamı IDLE veya COMMIT'teki 500'den fazla etkin bağlantıdan, SELECT * FROM pg_stat_activitybir ANALYZE ile bulunan ve bir ANALYZE içinde kalmış tek bir kişiyi öldürmek , silinen dosyaları boşaltmak için yeterliydi. ! 00 GB boşaltıldı.
Alex North-Keys

5

Anladığım kadarıyla, bir veritabanını düşürdüğünüzde, o veritabanı ve onun dosyaları gitti.

Tablo alanları kullanmadığınız sürece, her veritabanı kendi verileri $ PGDATA / base altında kendi alt dizininde olmalıdır. Sunucularımdan birini örnek olarak kullanmak (postgres kullanıcısı olarak):

-bash-3.2$ cd $PGDATA/base

-bash-3.2$ ls | wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

Şimdi, yeni bir veritabanı oluşturursak, $ PGDATA / base altında bir alt dizin daha olmalıdır:

-bash-3.2$ createdb foo

-bash-3.2$ ls | wc -l
10

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
6.9M    83637
8.0K    pgsql_tmp

Gördüğümüz şey budur ($ PGDATA / base / 83637 yeni veritabanının alt dizini).

Bu veritabanını bırakmak veri dosyalarını da silmeli:

-bash-3.2$ dropdb foo

-bash-3.2$ ls wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

Beklediğimiz şey budur - $ PGDATA / base / 83637 dizini gitti, vakumlanacak bir şey olmamalı.

Disk alanınızı tüketen başka bir şey olmadığından emin misiniz? Diğer veritabanlarınızdan biri mi? log dosyaları?

Deneyebileceğiniz bir şey:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes

çeşitli veritabanı şeyler yapmak, oluşturmak, bırakmak, vb ve sonra:

-bash-3.2$ du -sh `ls` > ../post_sizes

disk alanının nereye gittiğine dair bir fikir edinmek için.


Sizinle aynı sonuçları görüyorum - tabloyu eklediğimde, yeni DB temel dizinde görünür ve kaldırdığımda gider. Ancak, bu dizinin tüm boyut farkını içermediği görülmemektedir (yani ~ 9,6 GB)
Jmoney38 21

@ Jmoney38 - Bu yüzden ls$ PGDATA dizinde "du-sh " hem veritabanı ekleme / bırakma yapmadan önce ve diğer dizinler hangi sıçramalar ve sınırlar büyüyor işaret gerekir gibi yapmayı tavsiye etti.
gsiems

@ Jmoney38 - Tahmin etmeliydim ki farkın $ PGDATA / pg_log ve / veya $ PGDATA / pg_xlog dizinlerinde bulunması gerektiğini söyleyebilirim. Günlük dosyaları küme içindir ve veritabanını bıraktığınızda kesilmez.
gsiems
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.