Berurusan dengan ruang disk penuh di postgresql

14

Saya memiliki aplikasi web Django dengan backend postgresql 9.3.10 (duduk di OS Linux). Saya mengalami kesalahan penuh disk, sehingga bahkan jika saya mencoba untuk memotong tabel, saya mendapatkan kesalahan semacam itu:

ERROR:  could not extend file "base/30137/33186048": No space left on device
HINT:  Check free disk space.

Saya tidak dapat dengan mudah menambahkan lebih banyak ruang disk ke server, saya juga tidak bisa menghapus hal-hal di VM ini. Namun ada beberapa tabel yang merupakan kandidat untuk pemotongan, tetapi sepertinya saya tidak dapat memotongnya sekarang juga.

Adakah yang bisa memberi saya saran tentang apa yang bisa saya lakukan di sini? Ini memukul server produksi saya dengan keras, dan saya sedikit DBA tidak sengaja di sini, jadi benar-benar bingung.

Hassan Baig
sumber
Anda dapat memperoleh kembali beberapa ruang jika Anda dapat (sementara) menjatuhkan indeks ... memotong tabel dan kemudian membuatnya kembali
joanolo

Jawaban:

9

Karena PostgreSQL harus menulis WAL sebelum membuat perubahan apa pun ke tabel, PostgreSQL perlu ruang disk kosong untuk menghapus sesuatu dan melepaskan lebih banyak ruang disk.

Jika Anda membiarkan disk terisi, Anda tidak dapat memulihkan dari dalam PostgreSQL. Bahkan TRUNCATEmasih harus menulis ke WAL.

Jadi, Anda harus mengosongkan ruang pada volume, atau memperluas volume. Jika file log PostgreSQL Anda ada di pg_logdalam direktori data, Anda dapat dengan aman menghapus beberapa dari mereka dan memulai kembali Pg.

Jangan tidak menghapus pg_xlogatau pg_clog. Ini bukan log kesalahan server, mereka adalah bagian penting dari database, log transaksi dan log komit.

Craig Ringer
sumber
Mengapa TRUNCATEharus menulis ke wal, dan seperti apa entri dalam WAL?
Evan Carroll
"truncate tidak mencatat data lengkap, hanya fakta bahwa truncate terjadi. Untuk dapat mengembalikannya, file yang mendasarinya tetap ada sampai transaksi dilakukan." [source] ( postgresql.org/message-id/… Jadi entri truncate di dinding sangat kecil. hanya byte. Jika itu keseluruhan dari ruang yang dibutuhkan, Anda mungkin bisa mendapatkannya dengan rm -rf /tmp/*atau menghapus vimrc Anda.
Evan Carroll
@EvanCarroll rm -rf /tmp/*... yang dapat menghapus hal-hal yang mungkin Anda inginkan juga, seperti soket aplikasi, dll. Lebih baik menjadi lebih selektif. Adapun ruang yang dibutuhkan, Anda benar, itu minimal - sebuah meja kosong 8k + beberapa kb entri WAL untuk truncate, alokasi xid, catatan komit, dll.
Craig Ringer