Backup Data

Làm sao backup dữ liệu hàng ngày trong khi vẫn bảo toàn được dữ liệu toàn vẹn trong khi user đang hoạt động ?

Để backup dữ liệu hàng ngày mà vẫn bảo toàn toàn vẹn dữ liệu trong khi user đang hoạt động, bạn cần kết hợp giữa kỹ thuật backup và cơ chế đảm bảo tính nhất quán của database. Đây là các hướng tiếp cận mà một Senior Backend Engineer thường dùng:


1. Dùng Cơ Chế Backup Hỗ Trợ Bởi Database

Hầu hết RDBMS hiện đại (MySQL, PostgreSQL, SQL Server, Oracle) đều có cơ chế backup an toàn:

  • MySQL / MariaDB:

    • Dùng mysqldump --single-transaction để tránh lock bảng khi dump dữ liệu (áp dụng cho InnoDB).

    • Hoặc dùng Percona XtraBackup để tạo hot backup mà không khóa DB.

  • PostgreSQL:

    • Dùng pg_dump (không cần lock toàn DB).

    • Với dữ liệu lớn, dùng pg_basebackup kết hợp với WAL archiving để đảm bảo point-in-time recovery (PITR).

  • MongoDB / NoSQL:

    • Dùng mongodump hoặc snapshot filesystem (EBS snapshot, LVM snapshot).

👉 Ưu tiên dùng snapshot vật lý (filesystem-level snapshot) hoặc công cụ hỗ trợ transaction-consistent backup của DB để đảm bảo toàn vẹn.


2. Sử Dụng Transaction / Snapshot Isolation

  • Các DB có cơ chế MVCC (Multi-Version Concurrency Control) như PostgreSQL, MySQL-InnoDB:

    • Cho phép bạn đọc dữ liệu ở 1 snapshot nhất định mà không block user đang ghi.

    • Ví dụ: khi backup, bạn tạo transaction ở mức REPEATABLE READ hoặc SNAPSHOT ISOLATION, backup sẽ lấy toàn bộ dữ liệu ở trạng thái consistent tại thời điểm mở transaction.

  • Điều này đảm bảo: User vẫn thao tác bình thường, còn backup thì nhìn thấy một “bản copy cố định” tại thời điểm bắt đầu backup.


3. Point-In-Time Recovery (PITR)

  • Ngoài backup full hàng ngày, cần bật binlog (MySQL) hoặc WAL (PostgreSQL).

  • Cách làm:

    1. Hàng ngày backup full.

    2. Trong ngày, liên tục lưu trữ binlog/WAL.

    3. Khi cần khôi phục: restore từ bản full gần nhất + apply log đến thời điểm cần.

👉 Đây là cách vừa an toàn vừa tiết kiệm, thường áp dụng cho hệ thống có user hoạt động liên tục.


4. Backup Theo Kiểu Incremental / Differential

  • Thay vì full backup mỗi ngày → tốn thời gian và tài nguyên, có thể:

    • Full backup hàng tuần

    • Incremental backup hàng ngày (chỉ backup phần dữ liệu thay đổi).

  • Kết hợp với snapshot nhanh (ZFS, LVM, AWS EBS snapshot) để giảm thời gian backup.


5. Giải Pháp Thực Tế Triển Khai Trong Production

Ví dụ với PostgreSQL:

  • Bật WAL archiving.

  • Hàng ngày chạy pg_basebackup (full).

  • Hàng giờ/15 phút copy WAL logs sang storage khác.

  • Lưu giữ backup theo lịch: full 7 ngày, WAL 14 ngày.

Ví dụ với MySQL:

  • Bật binlog.

  • Dùng Percona XtraBackup để backup mà không khóa DB.

  • Lưu binlog để phục hồi point-in-time.


Tóm lại:

  • Nếu hệ thống nhỏ → dùng mysqldump --single-transaction hoặc pg_dump.

  • Nếu hệ thống lớn → dùng snapshot + WAL/binlog → hỗ trợ PITR.

  • User hoạt động liên tục thì chỉ có MVCC/snapshot backup mới đảm bảo dữ liệu toàn vẹn mà không khóa.


Last updated