Cara mendapatkan kembali ruang yang diambil oleh indeks yang sebagian dibangun dan diakhiri oleh pemadaman listrik

9

Saya menjalankan postgres (postgis) 9.4.2 di mac (10.10.4).

Saya punya beberapa meja besar (beberapa TB).

Selama pembuatan indeks berdasarkan salah satu dari mereka yang membutuhkan waktu sekitar satu minggu, saya menyaksikan penurunan ruang HD yang tersedia seperti yang Anda harapkan mendekati titik di mana indeks akan selesai ketika pemadaman listrik berlangsung lebih lama daripada unit baterai dan sistem turun. Saya memiliki buffer, dan fillfactor=100selama pembangunan karena ini merupakan sumber data statis. Saat reboot, ruang yang tersedia yang tersisa di drive persis di mana ia berada di akhir indeks. Analisis vakum tidak membebaskan ruang.

Saya mencoba menjatuhkan meja dan menelan kembali, dan itu tidak menjatuhkan ruang. Sekarang saya berada di tempat di mana saya tidak memiliki cukup ruang untuk membangun indeks.

Apakah file yang dihasilkan selama pembangunan indeks terjebak dalam beberapa limbo di mana mereka tidak dapat dihapus oleh sistem karena cara mesin turun selama pemadaman listrik?

Ketika saya melihat ukuran tabel + indeks dalam db (yang merupakan satu-satunya data pada drive itu) mereka menambahkan hingga sekitar 6TB . Drive adalah 8TB , dan ada kurang dari 500GB yang tersisa di drive, jadi sepertinya ada sekitar 1.5TB yang hilang di suatu tempat yang kira-kira seukuran indeks.

Ada ide?

dkitchel
sumber
Apakah indeks masih terdaftar dengan permintaan seperti ini? 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
Tidak, itu tidak muncul di hasil dari permintaan itu.
dkitchel
1
Apakah Anda memiliki sesuatu dalam daftar yang SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;memberi Anda?
dezso
Tidak, itu muncul kosong.
dkitchel

Jawaban:

5

Biasanya kami berharap bahwa ketika postgres dimulai kembali, proses pemulihan crash akan menghapus file yang terkait dengan indeks rollback dari direktori data.

Mari kita asumsikan bahwa itu tidak berfungsi, atau setidaknya itu harus diperiksa secara manual.

Daftar file yang harus di datadir dapat dibuat dengan kueri seperti ini:

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

reltablespace=0adalah untuk tablespace default. Jika indeks bermasalah dibuat di tablespace non-default, ini 0harus diganti dengan OID-nya di pg_tablespace.

i, r, t, S, m relkindmasing-masing sesuai dengan indeks, tabel, ruang roti, urutan, pandangan terwujud. Semua objek ini memiliki datanya dalam file yang namanya cocok pg_relation_filenode(oid).

Pada disk, file data berada di bawah $PGDATA/base/oid/mana oidadalah oiddatabase yang diperoleh select oid,datname from pg_database. Jika kita tidak berbicara tentang tablespace default, gantinya basediganti PG_version_somelabel.

Daftar dan urutkan file yang cocok dengan relfilenodes di direktori itu:

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

(yang sebenarnya hanya menyimpan segmen pertama untuk hubungan yang lebih besar dari 1Gb. Jika ada segmen yang tersisa yang tidak terikat pada apa pun, mereka harus dipertimbangkan secara terpisah)

dan diff file itu dengan hasil query di atas.

Jika ada file data yang tersisa yang tidak sesuai dengan objek yang diketahui db, mereka akan muncul di diff itu.

Daniel Vérité
sumber
Luar biasa! Saya menemukan 1 file di datadir yang tidak muncul di daftar pilih. Bisakah saya menghapus file itu dengan aman?
dkitchel
Sebenarnya itu sesuai dengan sekitar 800 file dengan iterasi setelah titik - semua seperti 499807.484 dll. Dapatkah saya menghapus file-file itu dengan aman?
dkitchel
@ Gitchel: itu akan menjadi segmen 1Gb masing-masing untuk indeks besar. Mungkin periksa bahwa stempel waktu mereka bertepatan dengan saat indeks buat berjalan. Sedangkan untuk menghapusnya, saya harap alasan saya di atas benar, tapi ini data Anda, jadi akhirnya itu keputusan Anda!
Daniel Vérité
Ya, stempel waktu konsisten dengan kapan indeks dibuat, dan jumlah ukuran file tentang sesuai dengan seberapa besar indeks seharusnya. Alasanmu tampaknya solid. Saya akan mencobanya dengan keyakinan tinggi. Terima kasih banyak.
dkitchel
Hanya menindaklanjuti sehingga orang lain yang menemukan diri mereka dalam kesulitan yang sama dapat menggunakan solusi @ DanielVerite dengan percaya diri. Solusinya memang bekerja dengan baik untuk saya.
dkitchel