PostgreSQL: Ruang disk tidak dirilis setelah TRUNCATE

12

Saya punya TRUNCATEmeja besar (~ 120Gb) bernama files:

TRUNCATE files;
VACUUM FULL files;

Ukuran tabel adalah 0, tetapi tidak ada ruang disk yang dirilis. Adakah cara untuk mendapatkan kembali ruang disk saya yang hilang?

UPDATE: Ruang disk dirilis setelah ~ 12 jam, tanpa ada tindakan di pihak saya. Saya menggunakan server Ubuntu 8.04.

Adam Matan
sumber
Saya akan menyarankan "vakum itu!", Tetapi mengingat Anda baru saja melakukannya, saya akan menyarankan mengambil ini ke salah satu pg-hacker atau daftar pg-kinerja (dan menghubungkan kembali ke utas atau menjawab setelah Anda punya satu).
Denis de Bernardy
Apakah tautan ini ( postgresql.1045698.n5.nabble.com/... ) memberikan saran untuk Anda? Mungkin masih ada sesuatu yang mengakses tabel atau sejenisnya.
DrColossos
@DrColossos: Saya membaca komentar di sumber (komentar yang tidak dapat saya temukan sekarang) yang mengatakan PostgreSQL memberi tahu semua koneksi bahwa truncate akan terjadi, dan mengunci sumber daya yang diperlukan. (Ada beberapa, termasuk tabel itu sendiri, indeks, urutan, dan tabel roti panggang.) Saya cukup yakin saya menemukan komentar sebelumnya dengan menelusuri melalui ExecuteTruncate (), tapi saya tidak 100% positif tentang itu.
Mike Sherrill 'Cat Recall'

Jawaban:

12

Menurut komentar di sumber , truncatebuat file penyimpanan baru yang kosong, dan hapus file penyimpanan yang lama pada waktu komit. (Documents menyarankan "file penyimpanan" hanyalah file sejauh menyangkut OS, tapi saya mungkin salah paham tentang terminologi.)

Buat file penyimpanan kosong baru untuk relasi, dan tetapkan sebagai nilai relfilenode. File penyimpanan lama dijadwalkan untuk dihapus saat komit.

Karena tampaknya menghapus file, saya bisa membayangkan beberapa kasus di mana sistem operasi yang mendasarinya mungkin tidak segera membebaskan ruang itu. Saya membayangkan bahwa dalam beberapa kasus file penyimpanan mungkin berakhir di Keranjang Sampah di Windows, misalnya. Tetapi dalam kasus saya, memotong tabel di bawah PostgreSQL 9. sesuatu segera meningkatkan freespace di Windows.

Pemotongan juga dicatat dalam log WAL. Saya tidak tahu berapa banyak efek yang mungkin terjadi.

Mike Sherrill 'Cat Recall'
sumber
2
Bisa dibayangkan bahwa proses backend lain masih memiliki deskriptor file untuk file terbuka. Jika ini terjadi lagi, saya akan mencoba menghentikan semua proses backend lainnya, hanya untuk melihat apakah itu membuat perbedaan.
Peter Eisentraut
Saya cukup yakin saya membaca bahwa ExecuteTruncate () seharusnya memastikan itu tidak dapat terjadi. Semua bagian dari mengunci sumber daya yang diperlukan untuk akhirnya menghapus file penyimpanan lama. Tapi saya tidak tahu di mana saya menemukan itu di sumbernya. Saya hanya menjelajahinya secara online; mudah tersesat seperti itu.
Mike Sherrill 'Cat Recall'