Cơ sở dữ liệu 22/09/2026 6 phút

WAL và checkpoint trong PostgreSQL: vì sao UPDATE 100k dòng sinh 48 MB WAL

Mọi thay đổi ghi vào WAL trước để đảm bảo độ bền; checkpoint dồn các trang bẩn ra đĩa. Đo thật: cùng một UPDATE 100k dòng sinh 48 MB WAL ngay sau checkpoint (2606 full-page image) nhưng chỉ 28 MB khi lặp lại — chênh 20 MB là chi phí full-page image. Và cách đọc checkpoints_req để biết max_wal_size quá nhỏ. PostgreSQL 16.

Lập trình 22/09/2026 6 phút

WAL trong PostgreSQL: vì sao ghi log trước khi ghi dữ liệu, và đo lượng WAL mỗi thao tác sinh ra

Độ bền của PostgreSQL đến từ WAL (write-ahead log): mọi thay đổi ghi vào log tuần tự và fsync xuống đĩa trước, trang dữ liệu ghi sau. Bài này đo thật trên pg-lab lượng WAL sinh ra: INSERT 10.000 hàng tạo 861 kB, COPY cùng dữ liệu chỉ 357 kB, UPDATE nặng nhất 1.645 kB, còn SELECT không sinh WAL. Kèm đánh đổi fsync và synchronous_commit.

Lập trình 22/09/2026 8 phút

WAL và checkpoint đo thật: một dòng UPDATE ngay sau checkpoint tốn 6.160 byte nhật ký, lần hai 120 byte; full_page_writes chiếm 84% WAL của pgbench; max_wal_size 64 MB gây 66 checkpoint trong 40 giây, TPS giảm 39% và WAL gấp đôi

Đo WAL bằng pg_current_wal_lsn trước và sau từng lệnh trên PostgreSQL 16: insert 160 byte mỗi dòng, có index 226, update ngay sau checkpoint 381 so với 243 lần hai, đổi khoá index 453. Ở mức một dòng: update đầu tiên sau checkpoint ghi 6.160 byte vì chụp cả trang 8 KB, update thứ hai cùng trang 120 byte. pgbench 10 giây sinh 390 MB WAL với full_page_writes bật và 62 MB khi tắt. Bốn cấu hình checkpoint dưới cùng tải 40 giây: mặc định 10.632 TPS với 2 checkpoint; max_wal_size 64 MB gây 66 checkpoint, 6.483 TPS và 2.133 MB WAL; completion target 0.1 giữ TPS trung bình nhưng có giây tụt còn 2.966.

Lập trình 22/09/2026 8 phút

PITR đo thật: khôi phục về một giây trước câu DELETE nhầm lấy lại đủ 1.500 dòng trong 1,9 giây, lệch sang một giây sau thì chỉ còn 100 dòng, mốc có tên dừng đúng chỗ không cần đoán giờ, đích trước basebackup không báo lỗi mà dừng ở điểm nhất quán

Dựng thật trên PostgreSQL 16: basebackup 700 MB qua mạng trong 1,05 giây, 15 giây chèn 100 dòng mỗi giây với pgbench chạy nền, đặt restore point, DELETE nhầm 1.500 dòng lúc 08:22:48,63, chèn tiếp 1.000 dòng, 50 segment WAL lưu trữ. Năm lần khôi phục vào container mới: đích một giây trước DELETE cho 1.500 dòng trong 1,9 giây với 29 segment; một giây sau cho 100 dòng; recovery_target_name dừng đúng mốc; đích trước lúc basebackup không lỗi mà dừng ở commit đầu tiên sau khi nhất quán; không đích thì replay hết 48 segment trong 3 giây và DELETE vẫn còn. Replay 250 đến 440 MB mỗi giây.