Kullanılabilir disk alanı olmadan VACUUM FULL çalıştırmam gerekiyor


27

Sunucumuzda hd alanın% 90'ını kaplayan bir masaya sahibim. Yer açmak için birkaç sütun bırakmaya karar verdim. Ancak alanı işletim sistemine döndürmem gerekiyor. Ancak, asıl sorun, VAKUM TAMINI çalıştırırsam ve tablonun bir kopyasını çıkarmak için yeterli boş alan yoksa ne olacağını bilmiyorum.

VAKUM DOLU kullanılmaması gerektiğini anlıyorum ama bu senaryoda en iyi seçenek olduğunu düşündüm.

Herhangi bir fikir takdir edilecektir.

PostgreSQL 9.0.6 kullanıyorum

Yanıtlar:


19

Bir boşluk çalıştırmak veya yeniden oluşturmak için yeterli alanınız olmadığından, postgresql veritabanlarınızı geri yükleyerek her zaman yeniden oluşturabilirsiniz. Veritabanlarını, tabloları, dizinleri geri yüklemek, alanı boşaltacaktır. Daha sonra, veritabanlarınızı düzenli olarak doldurmak için otomatik bakım ayarlayabilirsiniz.

1 postgresql sunucunuzdaki tüm veritabanlarını yedekleyin

Tüm veritabanlarınızı yeterli alana sahip bir bölüme yedeklemek isteyeceksiniz. Linux'taysanız, yer kazanmak için yedeklemeyi daha da sıkıştırmak için gzip kullanabilirsiniz.

su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz

2 Yapılandırma dosyalarınızı yedekleyin

cp /path/to/postgresql/data_directory/*.conf /some/partition/

3 Durdurma Sonrası

pg_ctl -D /path/to/postgresql/data_directory stop

4 veri dizininin içeriğini sil

rm -Rf /path/to/postgresql/data_directory/*

5 Veri dizininizi yeniden düzenlemek için initdb'yi çalıştırın.

initdb -D /path/to/postgresql/data_directory

6 Yapılandırma dosyalarını geri yükleyin

cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 

7 Başlat Postgresql

pg_ctl -D /path/to/postgresql/data_directory start

8 Yaptığınız tüm veritabanlarının dökümünü geri yükleyin

gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out

1
Teşekkürler, yaptığım şey bu, birkaç farkla. Veritabanını yedekledikten sonra düştüm. Sonra yeni bir tane yarattı ve geri yükledi.
Justin,

Rica ederim. Veri dizininin içeriğini kaldırmanın ve initdb yapmanın yeterli olacağını düşündüm.
Craig Efrein,

Harika çalıştı, gzipzaman kazanmak için sadece parçayı atlamanızı tavsiye ederim .
Rafael Barbosa,

17

NOT: Bunu 9.1'de test ettim. Buralarda hiç 9.0 sunucum yok. 9 da olsa çalışacağına eminim önceden eminim.


DİKKAT (@erny tarafından yorumlarda belirtildiği gibi):

Note that high CPU load due to I/O operations may be expected.

Geçici bir masa boşluğu kullanarak hemen hemen hiç çalışma yapmadan bunu yapabilirsiniz. Arıza süresi özel kilitler şeklinde olacaktır. Ama sadece masada süpürge yapıyorsun. Dolayısıyla, gerçekleşecek olan tek şey, müşteri sorgularının söz konusu tabloya erişmeleri durumunda kilidin alınmasını beklemektir . Mevcut bağlantıları kapatmanıza gerek yok.

Dikkat edilmesi gereken bir şey, masayı hareket ettirmenin ve boş olanı önce özel bir kilit beklemelerinin gerekmesidir!


İlk önce, belli bir miktar ek depolamaya ihtiyacınız var. Yorumlarda da belirtildiği gibi Stéphane, söz konusu tablonun VACUUM FULLtam kopya olarak en az iki katı büyüklükte olması gerekir . Şanslıysanız ve makineye dinamik olarak bir disk ekleyebiliyorsanız, bunu yapın. En kötü durumda, sadece bir USB disk takabilirsiniz (yine de riskli ve yavaş)!

Ardından, yeni cihazı bağlayın ve tablo alanı olarak kullanılabilir duruma getirin:

CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';

Aşağıdaki tabloları kullanarak aşağıdaki tabloları kolayca listeleyebilirsiniz:

\db

Tablonuzun geçerli tablo alanını iki kez kontrol edin (nereye geri götüreceğinizi bilmeniz gerekir):

SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';

Eğer öyleyse NULL, varsayılan tablo alanında olacaktır:

SHOW default_tablespace;

Eğer o ise NULLde, bu olasılığı artacaktır pg_default(kontrol resmi belgeler değiştiyse durumunda).

Şimdi masaya geç.

ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT;  -- if autocommit is off

Vakumla:

VACUUM FULL mytable;

Geri taşı:

-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT;  -- if autocommit is off

Geçici boşluğu kaldırın:

DROP TABLESPACE tempspace;

Not: hareket orijinal veri dizininde daha fazla disk alanı kullanıyor gibi görünüyor ...
Chris Withers

9.3'te test ettim ve çekicilik gibi çalışıyor.
Bartek Jablonski

9.1'de üretimde başarıyla kullanılmıştır. Tablo alanını değiştirdikten sonra kullanılan orijinal alan serbest bırakılır. G / Ç işlemleri nedeniyle yüksek CPU yükünün beklenebileceğini unutmayın.
erny

2
Şaşırtıcı ipuçları, bu ayrıntılı açıklama için teşekkürler. Not geçici tablo üzerinde size en azından gerekeceğini size of table x 2beri, VACUUM FULLmasanın tam bir kopyasını yapıyor.
Stéphane

Teşekkürler @ Stéphane. Bilgileri ana gövdeye ekledim.
exhuma

2

Hızlı ve kirli:

  • Postgres durdurun
  • Ana veritabanı dizinini, vakumlama için yeterli alanın olduğu başka bir diske taşıyın
  • Ana konumun orijinalinde, yeni konuma bir bağlantı ekleyin
  • Vakum
  • İşaret bağlantısını silin ve ana dizini orijinal konumuna geri getirin
  • Postgres Başlat

Örneğin,:

$ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start


0

Bir dökümü yapmak ve geri yüklemek için disk alanınız varsa, bir vacuumdb --full yapacak disk alanınız olmalıdır. Sorun şu, vacuumdb --full dosyasının tüm veri dosyasının bir kopyasını çıkarmasıdır. Yani, yapabilecekleriniz:

  1. büyük tabloyu tutan dosyaları farklı bir sürücüye, örneğin daha yavaş, daha büyük bir sürücüye kopyalayın.
  2. Orijinal konumdan diğer sürücüdeki yeni yere sembolik bağlantılar kurun.
  3. vacuumdb --full komutunu çalıştırın, şimdi diğer diskteki verileri okumalı ve son tabloyu orijinal veri diskinize yazmalıdır.
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.