Sự cố thì đủ kiểu: hỏng phần cứng, mất điện, bug trong code hoặc, khá thường xuyên, admin lơ đãng xóa nhầm database khi muốn dọn "cái gì đó cũ". Trong mấy tình huống này, backup và quy trình khôi phục chuẩn chỉnh chính là "cây đũa thần" của bạn đó.
Giờ tụi mình cùng mổ xẻ quy trình khôi phục từng bước, giống như ráp tủ IKEA: không hoảng loạn, cứ theo hướng dẫn mà làm thôi.
Bước 1. Phân tích nguyên nhân sự cố
Trước khi lao vào khôi phục dữ liệu, quan trọng là phải hiểu chuyện gì vừa xảy ra.
Lỗi ứng dụng hay database?
Kiểm tra log của app và PostgreSQL (thường nằm ở/var/log/postgresql/hoặc thư mục tương tự tùy OS của bạn). Tìm các chỉ báo lỗi.Hỏng phần cứng?
Nếu server bị hỏng vật lý (ví dụ ổ cứng có vấn đề), trước tiên hãy chắc chắn phần cứng còn ổn. Nếu ổ cứng die rồi, gắn ổ khác vào và khôi phục từ đó.Vấn đề mạng hoặc truy cập?
Nếu sự cố do mạng — server của bạn chắc chưa cần khôi phục đâu.Lỗi do người dùng:
Thú nhận đi... ai vừa chạyDROP DATABASE? Nếu có, vẫn còn cơ hội khôi phục từ backup nha.
Nhớ là hiểu rõ nguyên nhân sự cố sẽ giúp tránh lặp lại trong tương lai.
Bước 2. Kiểm tra backup có sẵn không
Đến lúc kiểm tra xem mình có backup chuẩn chưa. Tìm bản backup database mới nhất mà bạn tạo bằng pg_dump hoặc pg_basebackup. Kiểm tra tính toàn vẹn của nó. Nếu chưa biết làm sao, đây là nhắc nhanh:
- Dùng lệnh
ls -lđể kiểm tra kích thước file. Nếu file nhỏ bất thường, có thể có vấn đề đó. - Kiểm tra file bằng lệnh
file. Ví dụ:
Bạn sẽ thấy info về file, báo đây là SQL dump.file backup_file.sql
Với file tar thì kiểm tra giải nén được không:
tar -tf backup.tar
Không lỗi gì chứ? Tuyệt! Tiếp tục thôi.
Bước 3. Dừng PostgreSQL
Trước khi khôi phục, nhớ dừng server PostgreSQL để đảm bảo an toàn. Làm như này (chạy bằng quyền admin server):
sudo systemctl stop postgresql
Dừng database đảm bảo không có process nào phá đám quá trình khôi phục.
Bước 4. Chuẩn bị database mới để khôi phục
Nếu database của bạn bị xóa hoặc hỏng hoàn toàn, hãy tạo lại nó trước. Ví dụ lệnh:
createdb -U postgres new_database
Thay new_database bằng tên database của bạn nha.
Bước 5. Khôi phục từ backup
Có hai kịch bản khôi phục chính:
Nếu bạn dùng backup SQL (
pg_dump): Để khôi phục, dùng lệnh nàypsql -U username -d new_database -f backup_file.sql
username— user PostgreSQL của bạn.new_database— database sẽ import dữ liệu vào.backup_file.sql— file backup của bạn.
- Nếu bạn dùng backup dạng binary (
pg_basebackuphoặcpg_dumpvớicustom):
Để khôi phục, dùng:
Lưu ý là mấy backup này không phải text mà là dữ liệu "đóng gói".pg_restore -U username -d new_database backup_file.dump
Bổ sung:
- Nếu backup chỉ có dữ liệu, thêm
--data-only. - Nếu chỉ muốn khôi phục cấu trúc, thêm
--schema-only.
Bước 6. Khởi động PostgreSQL và kiểm tra
Sau khi chạy lệnh khôi phục, khởi động lại server:
sudo systemctl start postgresql
Giờ cần test thử. Thử kết nối vào database vừa khôi phục bằng psql hoặc pgAdmin. Chạy vài truy vấn để kiểm tra dữ liệu có ổn không:
SELECT * FROM your_table_name LIMIT 10;
Nếu mọi thứ ổn, chúc mừng: dữ liệu đã được khôi phục!
Bước 7. Kiểm tra tính toàn vẹn dữ liệu
Sau khi khôi phục, nhớ kiểm tra dữ liệu có toàn vẹn không. Ví dụ:
So sánh số dòng trong bảng với backup:
SELECT COUNT(*) FROM your_table_name;So kết quả với bản backup (nếu có).
Dùng checksum: Nếu trước đó bạn từng tạo checksum cho bảng, giờ là lúc so lại:
md5sum backup_file.sqlKiểm tra liên kết giữa các bảng: Đảm bảo các liên kết FOREIGN KEY đã khôi phục hoạt động chuẩn.
Bước 8. Test ứng dụng
Giờ hãy kiểm tra app của bạn dùng database này. Chạy qua các chức năng chính. Có lỗi gì không? Dữ liệu hiển thị ổn không?
Ví dụ lỗi thực tế khi khôi phục
Giờ cùng xem vài case thực tế để tránh gặp lỗi nhé:
Không tương thích version PostgreSQL.
Giả sử backup tạo ở version 12, mà server đã lên version 15. Khi khôi phục sẽ bị lỗi.
Cách giải quyết: dùng đúng version PostgreSQL như lúc backup, hoặc đọc tài liệu về compatibility: PostgreSQL Documentation.Backup bị hỏng . Nếu backup bị lỗi, một phần dữ liệu có thể mất.
Cách giải quyết: dùng backup replication (ví dụ lưu nhiều version backup).Lỗi khi khôi phục bảng cụ thể.
Nếu bạn chỉ khôi phục một bảng, mà các phụ thuộc (ví dụ foreign key) không có, quá trình có thể fail.
Cách giải quyết: luôn khôi phục bảng theo thứ tự đúng, bắt đầu từ bảng cha.
GO TO FULL VERSION