Dành cho ai
Bạn chạy một server PostgreSQL, trên VPS hoặc một cái máy để trong góc nhà, và backup của bạn là một lệnh pg_dump mỗi đêm. Cách đó cứu được bạn khi mất ổ đĩa. Nó không giúp gì khi ai đó chạy DELETE FROM orders quên mất WHERE lúc 10:15 và bạn mới phát hiện lúc 10:40. Bản dump đêm qua kéo bạn lùi 12 tiếng. Point-in-time recovery kéo bạn về 10:14.
pgBackRest và Barman là những công cụ đầy đủ tính năng, và học chúng mất cả buổi chiều. Với một server nhỏ, bộ kit này là bản gọn: script bash, một archive, một cluster, không giấu gì.
Nó làm được gì
- Lưu WAL liên tục và được thiết lập an toàn: không bao giờ ghi đè file, báo lỗi to rõ khi ổ đĩa đầy hoặc chỉ đọc, và phát hiện archive đang lỗi trước khi ổ đĩa đầy.
- Base backup được kiểm tra bằng
pg_verifybackupsau khi tạo, được đóng gói và đối chiếu checksum. - Retention tính ra cái cần xóa dựa trên base backup cũ nhất mà bạn còn giữ, nên không thể xóa nhầm WAL mà một bản backup còn giữ vẫn cần.
- Restore về một mốc thời gian, một LSN, một restore point có tên, hoặc WAL mới nhất trong archive, vào một thư mục mới, và phần xử lý timeline đã được làm sẵn.
- Một cron monitor kiểm tra tuổi của segment vừa archive và độ tồn đọng, gửi cảnh báo qua Telegram hoặc webhook, không lặp lại và có báo khi mọi thứ trở lại bình thường.
- Một buổi diễn tập: tạo dữ liệu, backup, cố tình gây lỗi, phá hủy server rồi restore trên một container sạch, sau đó so số dòng và checksum.
Dùng hằng ngày trông thế nào
Đây là các lệnh dùng hằng ngày và khi khẩn cấp. Script chỉ là bash thường, bạn đọc được từng cái.
./backup-base.sh && ./prune.sh # nightly
./check-archive.sh # every 5 minutes, exit code plus alert
./verify-archive.sh # daily: is the WAL chain complete?
# the bad DELETE happened around 10:15 UTC
./restore-to-time.sh --target-dir /srv/restore/r1 \
--time "2026-11-09 10:14:59+00" --start --port 5433
psql -h /tmp -p 5433 -d postgres # look around, then copy back what you need
Các mục tiêu khác: --name before_migration (một restore point bạn tự tạo), --lsn 0/5000060, và restore-latest.sh cho khôi phục thảm họa thông thường. Tùy chọn --pause dừng quá trình recovery tại mục tiêu để bạn xem dữ liệu ở chế độ chỉ đọc trước khi quyết định.
Những việc nó từ chối làm
Phần lớn công sức dồn vào những chuyện không được phép hỏng một cách âm thầm.
- Thiếu một segment WAL ở giữa archive. Restore dừng lại, nêu tên segment đó và thoát với exit code khác không. Trong test, ép chạy tiếp thì chỉ lấy lại được 200 trên 410 dòng mà không báo lỗi nào, và đó chính là lý do mặc định nó từ chối.
- Mốc thời gian đích sớm hơn base backup đầu tiên, restore đè lên một thư mục data không rỗng hoặc lên chính thư mục đang chạy, và chạy bằng root.
- Ghi đè một file đã archive, kể cả khi server vừa restore bắt đầu đánh số timeline lại.
- Xóa WAL mà một base backup đang giữ còn cần.
- Tablespace. Script backup dừng lại thay vì tạo ra thứ không restore được.
Số đo
Một lần chạy trên máy ARM64 cỡ laptop, PostgreSQL với cấu hình mặc định.
Thời gian restore (phá hủy server, restore trên một container sạch)
| Nhỏ | Lớn | |
|---|---|---|
| Dữ liệu | 200,000 dòng ở bảng chính, 78 MB | 5,000,000 dòng, 989 MB |
| Restore, tổng cộng | 2.4 s | 42.0 s |
| trong đó khởi động và replay WAL | 2.0 s | 36.1 s |
| Số dòng và checksum | khớp | khớp |
Có thể mất bao nhiêu
20 insert mỗi giây, sau đó kill -9 và restore chỉ từ archive. "Mất" nghĩa là những commit đã được xác nhận nhưng sau đó không còn.
archive_timeout | Đã xác nhận | Khôi phục được | Mất |
|---|---|---|---|
| 10 s | 794 | 764 | 30 (commit mất mới nhất mới hơn trạng thái đã khôi phục 1.9 s) |
| 10 s | 513 | 400 | 113 (6.1 s) |
| 60 s | 1,896 | 1,175 | 721 (36.0 s) |
| 0 (mặc định của PostgreSQL) | 740 | 0 | mọi thứ từ sau base backup |
Dòng cuối là dòng cần nhớ. Với archive_timeout mặc định và một server vắng request, mất ổ đĩa là mất mọi thứ từ lần base backup gần nhất. Hướng dẫn giải thích tùy chọn này và cái giá của nó: mỗi lần ép chuyển segment sẽ archive nguyên một file 16 MiB, trừ khi bạn nén.
Chi phí phát sinh
pgbench, năm vòng đan xen: trung vị là 5,156 tps khi tắt archive, 5,112 khi archive có gzip và 5,167 khi không nén. Chênh lệch nằm trong biên độ 2% giữa các vòng: trên máy này không thấy chi phí nào do archive.
Đã test thế nào
122 phép kiểm tự động trên PostgreSQL 15 (gói của Debian) rồi lặp lại trên PostgreSQL 17 (PGDG), trong container Debian 12 sạch, cộng với buổi diễn tập phá hủy rồi restore bằng hai container cho mỗi bản. Chúng gồm: archive lỗi thì WAL không bị tái sử dụng, lệnh archive tới đích cục bộ và SFTP, base backup có một file bị làm hỏng, mọi kiểu mục tiêu restore, lần recovery thứ hai trên một timeline mới, retention, và tất cả các trường hợp từ chối ở trên.
Yêu cầu
Debian 12 với PostgreSQL đóng gói theo kiểu Debian, một cluster, bash, curl để gửi cảnh báo, và openssh-client nếu bạn archive qua SFTP. Cần quyền root để cài đặt, mọi việc còn lại chạy bằng user postgres.
Câu hỏi hay gặp
Tôi đang dùng pgBackRest rồi. Có cần cái này không?
Không nhất thiết. pgBackRest là công cụ đầy đủ tính năng. Bộ này dành cho lúc bạn muốn thứ đủ nhỏ để đọc hết, hoặc muốn hiểu pgBackRest đang làm gì giúp bạn.
Restore riêng một bảng được không?
Bạn restore cả cluster vào một thư mục mới ở thời điểm bạn chọn, rồi copy bảng cần dùng ra khỏi đó. Buổi diễn tập dùng đúng cách này.
Có chạy với Docker hay Postgres managed không?
Không. Nó cần truy cập vào config và file của server. Với dịch vụ managed, hãy dùng tính năng point-in-time recovery của chính nhà cung cấp.
Tốn bao nhiêu ổ đĩa?
Tùy lượng ghi và archive_timeout. Hướng dẫn có số liệu dung lượng WAL cho vài kiểu tải và các số đo về nén mà chúng tôi đã đo.
Giấy phép
Dùng trên server của bạn và của công ty bạn. Xin đừng bán lại hay phân phối lại các file.
Lịch sử thay đổi
- 0.1.0: bản đầu tiên.
Bài liên quan
- Restore PostgreSQL to a timestamp with recovery_target_time (tiếng Anh)
- PostgreSQL WAL archiving from scratch on a single Debian VPS (tiếng Anh)
- How much data a disk failure costs with WAL archiving (tiếng Anh)
- pg_dump vs physical backup vs PITR: which to use (tiếng Anh)
Mua sản phẩm này
Polar lo thanh toán, thuế và hóa đơn (họ là merchant of record). Thanh toán xong bạn nhận link tải ngay.