Bir elektrik kesintisi ile kısmen inşa edilmiş ve sonlandırılmış bir dizin tarafından alınan alan nasıl geri kazanılır


9

Mac'te postgres (postgis) 9.4.2 kullanıyorum (10.10.4).

Birkaç büyük masa (birkaç TB) var.

Bunlardan birinde yaklaşık bir hafta süren bir dizin oluşturma sırasında, elektrik kesintisi pil biriminden ve sistemden daha uzun sürdüğünde, dizinin neredeyse biteceği noktaya kadar beklediğiniz gibi kullanılabilir HD alan düşüşünü izledim. aşağı gitti. Tamponlarım vardı ve fillfactor=100derleme sırasında statik bir veri kaynağı olduğundan. Yeniden başlatıldığında, sürücüde kalan kullanılabilir alan tam olarak dizin oluşturma işleminin neredeyse sonundadır. Vakum analizi alanı boşaltmaz.

Masayı düşürmeyi ve tekrar yutmayı denedim ve bu alanı bırakmadı. Şimdi dizini oluşturmak için yeterli alanımın olmadığı bir yerdeyim.

Dizin oluşturma sırasında oluşturulan dosyalar, elektrik kesintisi sırasında makinenin düşme şekli nedeniyle sistem tarafından kaldırılamayan bir limboda sıkışmış mı?

Tablo boyutları + db (bu sürücüdeki tek veri) dizinleri baktığınızda yaklaşık 6 TB kadar ekleyin . Sürücü 8 TB , ve sürücüde 500 GB'den daha az kaldı, bu yüzden bir yerde yaklaşık 1.5 TB kayıp var gibi görünüyor ki bu indeksin boyutu hakkında.

Herhangi bir fikir?


Dizin hala böyle bir sorgu ile listeleniyor mu? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
Kassandry

Hayır, bu sorgudan elde edilen sonuçlarda görünmüyor.
dkitchel

1
Listede SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;size veren bir şey var mı?
dezso

Hayır, boş çıkıyor.
dkitchel

Yanıtlar:


5

Normalde postgres yeniden başlatıldığında, kilitlenme kurtarma işleminin veri dizininden geri alma diziniyle ilgili dosyaları kaldırmasını beklerdik.

Diyelim ki işe yaramadı ya da en azından manuel olarak kontrol edilmesi gerekiyor.

Datadir içinde olması gereken dosyaların listesi aşağıdaki gibi bir sorgu ile oluşturulabilir:

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0varsayılan tablo alanı içindir. Sorunlu dizin varsayılan olmayan bir tablo alanında oluşturulmuşsa, bunun 0yerine OID değeri kullanılmalıdır pg_tablespace.

i, r, t, S, m relkindsırasıyla indekslere, tablolara, tost boşluğuna, sekanslara, materyalize görünümlere karşılık gelir. Tüm bu nesnelerin adları, adları eşleşen dosyalarda bulunur pg_relation_filenode(oid).

Diskte, veri dosyaları altında $PGDATA/base/oid/nerede oidolduğu oidveritabanının ile elde select oid,datname from pg_database. Varsayılan tablo alanından bahsetmiyoruz, onun yerine onun baseyerini alıyor PG_version_somelabel.

Bu dizindeki relfilenodes ile eşleşen dosyaları listeleyin ve sıralayın:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(bu aslında 1 Gb'den büyük ilişkiler için sadece ilk segmenti tutar. Hiçbir şeye bağlı olmayan kalan segmentler varsa, bunlar ayrı olarak ele alınmalıdır)

ve bu dosyayı yukarıdaki sorgunun sonucuyla değiştirir.

Db'nin bildiği herhangi bir nesneye karşılık gelmeyen kalan veri dosyaları varsa, bu farkta görünmelidir.


Müthiş! Veri dizininde seçim listesinde gösterilmeyen 1 dosya buldum. Bu dosyayı güvenle kaldırabilir miyim?
dkitchel

Aslında noktadan sonra iterasyonlarla yaklaşık 800 dosyaya karşılık geliyor - hepsi 499807.484 vb.Gibi dosyaları güvenle kaldırabilir miyim?
dkitchel

@dkitchel: bu büyük dizin için her biri 1 Gb'lik segmentler olurdu. Belki zaman damgalarının oluşturma dizini çalıştığında çakışıp çakışmadığını kontrol edin. Onları silmeye gelince, umarım yukarıdaki mantığım doğrudur, ancak bu sizin verilerinizdir, sonuçta sizin kararınızdır!
Daniel Vérité

Evet, zaman damgaları dizinin ne zaman oluşturulduğuyla tutarlıdır ve ilgili dosya boyutlarının toplamı dizinin ne kadar büyük olması gerektiğine karşılık gelir. Akıl yürütmen sağlam görünüyor. Yüksek bir güvenle vereceğim. Bir ton teşekkürler.
dkitchel

Kendilerini aynı çıkmazda bulan diğer kişilerin @ DanielVerite'nin çözümünü güvenle kullanabilmelerini sağlamak için. Onun çözümü benim için gerçekten işe yaradı.
dkitchel
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.