Tidak ada perintah atau alat pemeriksaan konsistensi bawaan di PostgreSQL.
Pandangan umum adalah bahwa seseorang seharusnya tidak perlu, karena korupsi dan inkonsistensi seharusnya tidak dimungkinkan pada tumpukan perangkat keras / perangkat lunak yang berkualitas. Jika masalah memang muncul, tidak ada jaminan segala jenis pemeriksaan konsistensi akan menemukan mereka, jadi itu hanya akan menciptakan rasa aman yang salah. Saya tidak setuju dengan sentimen itu, tapi sepertinya ini keluar ketika ini dibahas secara berkala pada pgsql-hacker.
Seperti biasa, masalah yang mendasarinya adalah bahwa tidak ada seorang pun yang secara khusus membutuhkan alat pemeriksa konsistensi untuk memenuhi kebutuhan mereka yang mendesak, jadi tidak ada yang menghabiskan waktu untuk menulis satu untuk menggaruk rasa gatal dan tidak ada yang mendanai pengembangannya berdasarkan kontrak komersial atau in-house-based. Kesukarelaan? : p
PostgreSQL (hingga 9.3) tidak mendukung checksum level blok. Jadi salah satu hal utama yang biasa Anda verifikasi tidak ada dan karenanya tidak dapat diverifikasi. Alat untuk memindai semua hubungan dan memvalidasi checksum tidak ada di PostgreSQL 9.3, tetapi akan diinginkan untuk ditambahkan dan mungkin muncul di versi masa depan. Sementara itu yang dapat Anda lakukan adalah SELECT *
dari masing-masing relasi secara individual - tetapi karena PostgreSQL menggunakan cache buffer sistem operasi untuk membaca, tidak ada jaminan yang benar-benar akan memaksa pembacaan blok disk yang mendasarinya. Alat baru akan diperlukan untuk melakukan ini.
PostgreSQL cenderung menghindari penyimpanan informasi yang berlebihan jika memungkinkan, jadi seringkali tidak ada yang perlu diperiksa, hanya satu sumber otoritatif. Pemeriksa konsistensi tidak dapat berbuat banyak kecuali informasi yang sama muncul, atau dapat diturunkan dari, beberapa tempat berbeda.
Sangat sulit untuk melakukan pengecekan yang berguna secara bersamaan, pada basis data yang masih sibuk dan aktif. Sebagian besar instalasi tidak akan mau mengunci seluruh basis data, atau setidaknya beberapa hubungan utama sekaligus, untuk menjalankan semacam pemeriksaan konsistensi. Jadi pemeriksa harus dapat beroperasi pada database yang dapat dimodifikasi secara bersamaan, membuatnya lebih sulit untuk ditulis dan mampu mendeteksi lebih sedikit masalah dengan andal.
Masih banyak yang dapat dilakukan alat validator jika ada yang ditulis, terutama jika diizinkan untuk mengambil beberapa kunci eksklusif hubungan:
Periksa apakah semua tablespace ada pada disk.
Periksa bahwa setiap pg_class
entri memiliki file yang sesuai dengan yang ada relfilenode
di tablespace yang benar.
Periksa peta visibilitas, peta ruang bebas, dll, memastikan mereka hadir ketika seharusnya, dapat dibaca, dan tampaknya cocok dengan hubungan mereka.
Laporkan file file pada disk yatim piatu. (Ini normal karena DDL transaksional dan pemutusan tautan yang malas, tetapi pemeriksa bisa memaksakan penghapusan tautan dan mengunci semua hubungan sebelum menjalankan pemeriksaan).
Baca setiap blok dari setiap relasi dan cari masalah yang jelas. Untuk tumpukan hubungan itu akan menjadi hal-hal seperti:
- sebuah
xmin
lebih besar dari xmax
(setelah mempertimbangkan xid wrap-around)
- Tuples dibuat oleh transaksi di masa depan
- rantai HOT rusak / rantai ctid rusak
- struktur tuple yang gagal untuk mencocokkan atribut tabel
- Datum apa pun yang tidak bolak-balik
_in
dan _out
fungsinya tidak berubah atau melempar kesalahan
NULL
bidang bitmap ditetapkan pada NOT NULL
atribut tabel
- Pengerjaan ulang
CHECK
kendala gagal
Periksa kembali kunci asing dan batasan pengecualian setelah mengunci semua tabel yang terlibat
... dan mungkin lebih banyak lagi yang saya tidak cukup tahu tentang nyali Pg untuk mencari tahu, seperti upaya untuk mendeteksi halaman yang sobek, validasi struktur b-tree, memeriksa kewarasan indeks GIN dan GiST, memeriksa kewarasan pg_control
, dan banyak lagi saya tidak akan tahu harus mulai dari mana.
Jika Anda ingin memiliki alat seperti itu, hal terbaik untuk dilakukan adalah belajar cukup banyak untuk menghasilkan proposal yang konkret tentang bagaimana itu harus bekerja - dan luangkan waktu untuk mengerjakannya, atau untuk mendanai orang lain untuk menghabiskan waktu pada alat tersebut. pengembangan.
Secara pribadi saya akan sangat senang memiliki sesuatu yang dapat memeriksa cluster database yang dihentikan menggunakan mode startup khusus untuk postgres
backend, jadi saya dapat (agak) memvalidasi salinan database fisik yang diambil dengan pg_basebackup
, dengan pg_start_backup()
, rsync dan pg_stop_backup
, dengan tingkat sistem file snapshot atom, dll.
Sebagai alternatif, Anda dapat melakukan apa yang dilakukan sebagian besar orang lain: Pastikan tumpukan perangkat keras dan perangkat lunak Anda kuat dan terkonfigurasi dengan baik, simpan cadangan yang baik, dan pantau log Anda. Tidak ada pengganti untuk pengujian yang tepat dari seluruh tumpukan sebelum commissioning server - dan untuk cadangan yang baik, baik fisik (streaming / PITR) dan logis (kesedihan). Lakukan pengujian plug-pull pada basis data yang dimuat - berulang kali - sebelum ditayangkan untuk memastikan subsistem I / O yang seharusnya andal. Gunakan beberapa bentuk cadangan.