Vận hành PostgreSQL đo thật: sao lưu, PITR, replication, failover

Sê-ri 12 phần cho lập trình viên backend phải tự vận hành PostgreSQL: sao lưu và khôi phục, WAL và PITR, streaming replication và độ trễ, failover và timeline, logical replication, VACUUM và bloat, đổi schema không downtime, pooling kết nối. Mỗi phần là một tình huống dựng thật trên container PostgreSQL 16, đo thời gian, kích thước, độ trễ và số dòng mất hay giữ được.

4/12 phần đã đăng Lập trình
1 Sao lưu PostgreSQL đo thật: pg_dump và pg_basebackup trên cùng 613 MB — dump nén 69 MB mất 2,9 giây, basebackup 651 MB mất 0,9 giây, tải đang chạy giảm 9% đến 15%, và dump chụp lúc bắt đầu còn basebackup nhất quán lúc kết thúc Hai kiểu sao lưu khác bản chất, đo trên một cơ sở dữ liệu 613 MB với pgbench và một bảng một triệu dòng md5. Sáu biến thể: pg_dump SQL thuần 407 MB trong 0,89 giây, custom nén 69 MB trong 2,92 giây, thư mục song song 4 tiến trình 2,33 giây; pg_basebackup thư mục 651 MB trong 0,89 giây, tar gzip 100 MB trong 6,1 giây. Dưới tải pgbench 8 client, dump làm TPS giảm 9%, basebackup gzip giảm 15%, không khoá bảng nào. Chèn 1.000 dòng trong lúc sao lưu: dump giữ 1.000 dòng lúc bắt đầu, basebackup giữ 1.200 dòng lúc kết thúc chép, và container mới khởi động từ bản basebackup trong 758 ms. 22/09/2026 · 8 phút đọc 2 Khôi phục từ pg_dump đo thật: 80% thời gian là COPY, index và khoá ngoại được dựng lại chứ không được chép, -j nhanh 1,3 lần khi một bảng chiếm 73% và 1,77 lần với tám bảng đều, planner đoán sai 5 lần tới khi ANALYZE, và một role thiếu là một lỗi Khôi phục bản dump custom 75 MB của cơ sở dữ liệu 613 MB vào CSDL trống: 2,85 giây tuần tự, 2,18 giây với -j, không nhanh hơn vì một bảng chiếm 73%; tám bảng bằng nhau thì -j4 nhanh 1,77 lần rồi chạm trần. Tách theo section: pre-data 25 ms, COPY 2,27 giây, dựng index và khoá ngoại 731 ms. Sau khôi phục planner ước lượng 5.000 dòng cho truy vấn trả 1.001 và chọn Bitmap Scan, ANALYZE 254 ms sửa thành Index Scan với 943. work_mem đặt ở mức database biến mất, sequence giữ nguyên 4000, và khôi phục vào cụm trống báo đúng một lỗi role không tồn tại, nạp pg_dumpall --globals-only trước thì 0 lỗi. 22/09/2026 · 8 phút đọc 3 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. 22/09/2026 · 8 phút đọc 4 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. 22/09/2026 · 8 phút đọc

Còn 8 phần nữa sẽ lần lượt được đăng.