Saya menggunakan PostgreSQL 8.4.15. Saat menjalankan pg_dump
untuk membuat cadangan database, saya mendapatkan kesalahan berikut:
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)
Saat mencari pesan kesalahan ini, saya menemukan beberapa referensi (di sini dan di sini ) yang menyarankan untuk mengindeks ulang tabel. (Dalam diskusi ini, ada referensi ke kueri pg_class
tabel untuk menemukan nilai yang tepat pg_toast_XXXXXX
, tetapi sepertinya itu karena tidak ditampilkan dalam pesan kesalahan mereka. Saya melewatkan bagian ini karena saya memiliki nilai yang ditampilkan dalam pesan kesalahan Saya kira itu mungkin kenyamanan karena versi PostgreSQL yang lebih baru.)
Saya menjalankan yang berikut:
REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;
Saya sekarang dapat menggunakan pg_dump
tanpa kesalahan.
Apa pg_toast
dan apa yang sebenarnya dilakukan perintah ini? Apakah ini hanya tentang pembersihan sederhana atau bisakah mereka menyingkirkan beberapa baris di meja itu? Apa yang bisa menyebabkan masalah sejak awal?
Ada sekitar 300.000 baris dalam tabel ini, tetapi saya berharap hanya ada sekitar 250 baris baru sejak cadangan berhasil sebelumnya (tabel ini hanya digunakan untuk INSERT / SELECT, tidak ada UPDATE).
sumber
Jawaban:
Mengingat apa yang Anda lakukan adalah indeks ulang, yang mungkin terjadi adalah ia menggunakan pemindaian indeks untuk mencoba menemukan nilai-nilai panggang dalam tabel dan tidak bisa menemukannya. Ini terdengar seperti indeks yang rusak. Analisis vakum tidak mengubah tabel tetapi indeks ulang tidak dan perubahannya sangat kecil.
Cara untuk berpikir tentang ini adalah bahwa atribut TOASTed sebenarnya dipecah menjadi potongan-potongan berukuran sekitar 4k dan ini disimpan dalam baris. Mereka melihat ke atas dan diurutkan / dihubungkan kembali dengan baris utama pada waktu permintaan. Kedengarannya seperti indeks yang digunakan di sini rusak dan sehingga reindex memecahkan masalah.
Saya telah menemukan indeks yang rusak biasanya merupakan pertanda bahwa ada sesuatu yang tidak beres dengan server. Baik untuk memeriksa dan memastikan memori, CPU, dan hard drive semuanya senang dan tidak melaporkan masalah. Saya menemukan server yang terlalu panas cenderung rentan terhadap korupsi indeks dan jika indeks bisa rusak kita harus khawatir tentang data menjadi korup juga.
sumber