Backup nghe như cái ô trong ngày mưa ấy: bạn nghĩ nó sẽ cứu bạn khỏi mọi rắc rối. Nhưng nếu cái ô thủng lỗ thì bạn vẫn ướt như thường. Với backup và khôi phục cũng vậy: nếu có gì đó sai, bạn có thể mất dữ liệu hoặc tệ hơn là database bị hỏng. Vì vậy, hiểu lỗi và phòng tránh nó là cực kỳ quan trọng.
Vấn đề khi khôi phục dữ liệu
- Không tương thích phiên bản PostgreSQL
Một trong những vấn đề phổ biến và khó chịu nhất là cố gắng khôi phục dữ liệu tạo ở một phiên bản PostgreSQL này sang phiên bản khác (ví dụ, bạn thử khôi phục backup từ version 11 sang 15). PostgreSQL không đảm bảo tương thích ngược giữa các phiên bản.
Tại sao lại như vậy?
- Định dạng dữ liệu có thể thay đổi giữa các phiên bản.
- Một số function và parameter có thể bị xoá hoặc thay đổi.
Làm sao tránh?
- Luôn tạo backup bằng
pg_dump, đừng copy trực tiếp thư mục dữ liệu PostgreSQL.pg_dumptạo ra SQL script universal, có thể khôi phục trên bất kỳ version tương thích nào. - Kiểm tra tương thích version trước khi khôi phục. Có thể tìm info trong tài liệu chính thức PostgreSQL.
Lấy ví dụ nhé. Bạn tạo backup với PostgreSQL 14:
pg_dump -U user -d my_database -f backup.sql
Bây giờ thử khôi phục nó trên PostgreSQL 15:
psql -U user -d my_database -f backup.sql
Và bạn nhận được lỗi kiểu:
ERROR: unrecognized configuration parameter "old_function"
Giải pháp: update version PostgreSQL trên server hoặc dùng tool pg_upgrade để migrate.
- Thiếu WAL-file cần thiết
Đôi khi khôi phục database từ incremental hoặc differential backup có thể bị dừng đột ngột — tất cả là do thiếu WAL-file (Write-Ahead Logging). PostgreSQL dựa vào chúng để “apply” thay đổi sau bản full backup cuối cùng. Nếu thiếu file này hoặc bị hỏng, database không thể hoàn tất khôi phục.
Chuyện này xảy ra khi bạn chưa bật archive WAL-file, hoặc ai đó lỡ tay xoá folder để giải phóng dung lượng. Vì vậy, nếu bạn định dùng backup không đầy đủ, nhớ bật archive trong postgresql.conf:
archive_mode = on
archive_command = 'cp %p /path/to/wal_archive/%f'
Và đừng quên kiểm tra thường xuyên xem archive có hoạt động không, file có còn nguyên không. Đó là cái giá nhỏ để đảm bảo khôi phục không bị fail.
- Backup bị hỏng
File backup của bạn có thể bị hỏng, làm nó vô dụng cho việc khôi phục.
Tại sao lại như vậy?
- File bị lỗi integrity khi truyền hoặc lưu trữ.
- Lỗi bất ngờ khi tạo backup.
Làm sao tránh?
Dùng nén và checksum để kiểm tra integrity của backup. Ví dụ, tạo MD5-hash cho file sau khi tạo xong:
md5sum backup.sql > backup.sql.md5
Trước khi khôi phục, luôn kiểm tra file backup:
md5sum -c backup.sql.md5
Vấn đề và giải pháp
Bạn thử khôi phục file bị hỏng:
pg_restore -U user -d my_database backup.dump
Và thấy:
pg_restore: fatal error: input file appears to be a text file, but you are using the 'pg_restore' command-line tool; try using psql instead
Giải pháp: thử mở file bằng text editor và kiểm tra xem còn nguyên không. Nếu hỏng nhẹ, bạn có thể tự sửa file SQL bằng tay.
- Không đủ quyền user.
Đôi khi khi khôi phục bạn sẽ gặp lỗi do thiếu quyền, nhất là khi bạn dùng user bị hạn chế.
Tại sao lại như vậy?
User không đủ quyền để tạo table, schema hoặc object trong database.
Làm sao tránh?
Khôi phục bằng user có đủ quyền:
pg_restore -U postgres -d my_database backup.dump
- Ghi đè database đã tồn tại
Một lỗi phổ biến nữa là khôi phục database từ backup khi dữ liệu đã có sẵn. Nếu bạn lỡ “đè” lên record cũ thì không lấy lại được đâu.
Tại sao lại như vậy?
Bạn không dùng flag --clean, nên backup mới ghi đè lên dữ liệu cũ.
Làm sao tránh?
Khi khôi phục, dùng flag --clean để xoá cấu trúc cũ:
pg_restore --clean -U user -d my_database backup.dump
- Lỗi transaction chưa hoàn thành
Khi khôi phục dữ liệu có thể gặp vấn đề với dữ liệu bị “treo” trong transaction chưa hoàn thành. Đặc biệt với database lớn.
Tại sao lại như vậy?
Transaction bị “hỏng” do server bị crash.
Làm sao tránh?
Đảm bảo server PostgreSQL hoàn thành hết transaction sạch trước khi khôi phục. Nếu có vấn đề, hãy restart server bằng:
sudo service postgresql restart
Cách phòng tránh lỗi khôi phục
Chúng ta đã bàn về cách tránh lỗi cụ thể, nhưng còn có mấy chiến lược chung giúp bạn né được hầu hết lỗi:
Thường xuyên test khôi phục. Tạo một database test riêng và thử khôi phục dữ liệu vào đó.
Lưu nhiều bản backup. Dùng cloud service, lưu trữ local và server remote.
Tự động hoá việc tạo backup. Dùng cron hoặc tool tương tự để lên lịch backup.
Kiểm tra integrity file. Dùng checksum để chắc chắn backup không bị hỏng.
Giữ đồng bộ version PostgreSQL. Đừng trì hoãn update PostgreSQL, vì có thể gây ra lỗi không tương thích sau này.
Case thực tế và giải pháp
Case 1: Mất WAL-file. Server của bạn bị tắt đột ngột, và bạn phát hiện thiếu WAL-file cần thiết. Lúc này không thể khôi phục nếu không có full backup. Giải pháp đơn giản nhất là thường xuyên kiểm tra cấu hình archive WAL.
Case 2: Backup bị hỏng. Bạn upload backup lên server, nhưng kiểm tra thấy file trống. Trong trường hợp này hãy dùng backup từ chỗ lưu khác hoặc thử khôi phục từ bản backup bị hỏng một phần.
Case 3: Không tương thích version. Khi chuyển dữ liệu từ PostgreSQL 12 sang PostgreSQL 14 bạn gặp lỗi. Hãy dump dữ liệu bằng pg_dump và khôi phục bằng version mới.
GO TO FULL VERSION