Sebuah data page PostgreSQL dapat lebih besar daripada unit write atomik yang disediakan storage. Jika host gagal ketika sebuah page sedang ditulis, sebagian page tersebut dapat mencapai durable storage sementara bagian lain masih berasal dari versi yang lebih lama. Recovery tidak dapat dengan aman menerapkan change record biasa ke page yang struktur internalnya mungkin sudah tidak konsisten.
full_page_writes menangani mode kegagalan tersebut. Ketika setting ini diaktifkan, PostgreSQL mencatat image lengkap sebuah page ke write-ahead log (WAL) pada modifikasi pertama page tersebut setelah checkpoint. Selama crash recovery, image itu dapat menggantikan on-disk page yang torn sebelum WAL record berikutnya di-replay.
Mekanisme ini terkait erat dengan batas checkpoint. Hubungan tersebut memengaruhi keamanan recovery sekaligus jumlah WAL yang dihasilkan sistem dengan beban write tinggi.
WAL biasanya mencatat perubahan, bukan seluruh page
WAL PostgreSQL biasanya merepresentasikan perubahan database secara lebih ringkas daripada menyalin seluruh data page pada setiap modifikasi. Sebuah record dapat mendeskripsikan operasi yang diperlukan untuk memindahkan page dari satu state valid ke state valid berikutnya.
Pendekatan tersebut mengasumsikan recovery dimulai dari page yang dapat diinterpretasikan dengan benar. Partial page write merusak asumsi itu. Metadata, tuple data, line pointer, atau region page lainnya dapat mencerminkan momen waktu yang berbeda. Menerapkan operasi WAL normal ke campuran seperti itu tidak selalu merekonstruksi page yang valid.
Full page image menyediakan pengganti lengkap. Proses recovery dapat memulihkan image dari WAL lalu menerapkan record berikutnya secara berurutan.
Proteksi ini terpisah dari aturan dasar WAL bahwa log record harus menjadi durable sebelum dirty data page yang terkait diizinkan mencapai durable storage. Write-ahead ordering memastikan informasi recovery tersedia lebih dahulu; page image membuat informasi tersebut tetap memadai bahkan ketika write data page berikutnya mengalami torn write.
Perubahan pertama setelah checkpoint membawa image
PostgreSQL tidak perlu mencatat salinan lengkap untuk setiap update pada page yang sama. Dengan full_page_writes aktif, modifikasi pertama setelah checkpoint menyebabkan page image disertakan dalam WAL. Modifikasi berikutnya pada page tersebut dalam siklus checkpoint yang sama dapat kembali menggunakan WAL record biasa.
Pertimbangkan satu heap page yang dimodifikasi beberapa kali:
checkpoint
|
+-- first update to page 42 -> full page image + change record
|
+-- second update to page 42 -> ordinary WAL
|
+-- third update to page 42 -> ordinary WALSetelah checkpoint berikutnya, page 42 kembali memenuhi syarat untuk full page image pada modifikasi berikutnya.
Checkpoint menetapkan batas recovery yang membuat mekanisme ini cukup. Crash recovery dimulai dari checkpoint dan me-replay WAL ke depan. Jika write sebuah page yang dilakukan selama interval tersebut terputus, WAL record pertama yang menyentuh page itu setelah checkpoint dapat menyediakan image lengkap sebelum perubahan berikutnya diterapkan.
Ini juga berarti frekuensi checkpoint memengaruhi volume full-page-image. Checkpoint yang lebih sering menciptakan lebih banyak kesempatan bagi page yang sering dimodifikasi untuk kembali menjadi page first-touch.
Torn page berbeda dari stale page
Stale page valid secara internal tetapi belum memuat seluruh perubahan durable. WAL replay dirancang untuk memajukan page seperti itu melalui operasi yang belum diterapkan.
Torn page memiliki masalah berbeda: page itu sendiri dapat berisi bagian-bagian dari versi yang berbeda. Replay biasa bergantung pada struktur page yang valid sehingga tidak dapat memperlakukan konten parsial sembarang sebagai titik awal yang dapat dipercaya.
Perbedaan ini menjelaskan peran full page image. Mekanisme tersebut bukan terutama bentuk replay yang lebih cepat dan bukan salinan kedua dari setiap write. Ia menyediakan state page lengkap yang diketahui pada titik tempat WAL berorientasi perubahan dapat dilanjutkan dengan aman.
Data checksum dapat mendeteksi banyak bentuk korupsi page, termasuk kerusakan yang menghasilkan checksum mismatch, tetapi deteksi saja tidak menyediakan konten page yang diperlukan untuk perbaikan. Full page writes menyediakan material recovery, bukan sekadar sinyal integritas.
Checkpoint dapat menghasilkan lonjakan volume WAL
Checkpoint mereset kondisi first-change pada seluruh page. Workload yang berulang kali memodifikasi working set yang luas karena itu dapat menghasilkan banyak full page image segera setelah checkpoint.
Efeknya bergantung pada pola akses. Page yang berubah sekali dalam satu siklus checkpoint dapat membawa satu image. Hot page yang berubah ribuan kali dalam siklus yang sama tetap hanya membutuhkan image pada modifikasi pertamanya setelah checkpoint, lalu menggunakan WAL biasa untuk perubahan berikutnya.
Interval checkpoint yang lebih pendek dapat meningkatkan jumlah full page image yang dihasilkan dari waktu ke waktu karena page aktif yang sama lebih sering melewati batas first-change. Interval yang lebih panjang dapat mengurangi sumber WAL tersebut, meskipun setting checkpoint juga memengaruhi durasi recovery, flushing dirty page, tekanan retensi WAL, dan perilaku operasional lainnya.
wal_compression dapat mengurangi biaya storage full page image ketika compression diaktifkan. Compression mengubah representasi di WAL, bukan jaminan recovery: replay melakukan decompression pada image sebelum menggunakannya.
Full page writes melindungi batas crash tertentu
Setting ini aktif secara default karena menonaktifkannya dapat membuat recovery tidak memiliki cukup informasi untuk memperbaiki page yang hanya tertulis sebagian ketika terjadi kegagalan sistem.
Jaminan tersebut memiliki scope yang spesifik. Full page writes tidak menggantikan fsync, storage ordering, durability WAL, backup, replication, atau checksum. Setiap mekanisme melindungi bagian berbeda dari durability atau integritas database.
Mekanisme ini juga tidak berarti setiap page PostgreSQL terus-menerus disalin ke WAL. Image tambahan dikaitkan dengan modifikasi pertama setelah checkpoint, sehingga membatasi biaya sambil mempertahankan titik awal recovery yang lengkap untuk siklus checkpoint tersebut.
Karena itu, mematikan full_page_writes bukan sekadar pilihan tuning volume WAL. Tindakan tersebut mengubah asumsi yang dapat dibuat PostgreSQL ketika melakukan recovery dari partial data-page write. Storage stack harus memberikan jaminan yang cukup kuat untuk membuat mode kegagalan tersebut tidak relevan sebelum proteksi ini dapat dihapus dengan aman.
Volume WAL dan keamanan recovery berbagi batas yang sama
Full page writes menghubungkan batasan storage tingkat rendah dengan pola operasional yang terlihat. Kemungkinan partial page write membutuhkan image recovery lengkap, sementara batas checkpoint menentukan kapan PostgreSQL harus mencatat image tersebut lagi.
Akibatnya, peningkatan generasi WAL setelah checkpoint bukan bookkeeping insidental. Itu adalah biaya untuk membangun kembali material recovery tingkat page bagi siklus checkpoint berikutnya. Tuning cadence checkpoint atau WAL compression dapat mengubah biaya tersebut, tetapi kebutuhan dasarnya tetap sama: recovery memerlukan satu state page lengkap sebelum WAL berorientasi perubahan dapat dilanjutkan dengan aman.