Sau khi bạn, với vai trò là admin database có trách nhiệm, đã tạo xong bản backup, thì đến lúc quan trọng nhất: khôi phục dữ liệu. Và đây là lúc nhân vật chính xuất hiện — lệnh pg_restore. Nếu pg_dump là siêu anh hùng backup của bạn, thì pg_restore là đồng đội giúp hồi sinh dữ liệu từ bản backup đã tạo.
pg_restore được dùng để khôi phục dữ liệu từ các file được tạo bởi pg_dump ở dạng binary (custom hoặc directory). Nếu database của bạn bị lỗi, hoặc bạn muốn chuyển dữ liệu sang server mới, thì tool này đúng là cứu cánh luôn đó.
Tại sao bạn cần pg_restore:
- Nó cho phép bạn khôi phục toàn bộ database hoặc chỉ từng phần (schema, bảng, dữ liệu... tuỳ ý).
- Đây là tool mạnh cho các trường hợp khôi phục phức tạp, khi bạn muốn kiểm soát chi tiết quá trình restore.
Cú pháp cơ bản của lệnh
Bắt đầu với pg_restore là phải biết cú pháp cơ bản:
pg_restore -U username -d database_name backup_file.dump
Các tham số của lệnh:
-U username: chỉ định tên user PostgreSQL để kết nối.-d database_name: tên database mà bạn muốn khôi phục dữ liệu vào.backup_file.dump: file backup đã tạo trước đó bằngpg_dumpvới formatcustomhoặcdirectory
Ví dụ, nếu bạn muốn khôi phục database university từ file backup.dump với user postgres, lệnh sẽ như sau:
pg_restore -U postgres -d university backup.dump
Khi chạy lệnh này, pg_restore sẽ bắt đầu quá trình khôi phục và trả lại dữ liệu cho database!
Các loại backup và tính tương thích
Không phải backup nào cũng giống nhau đâu nhé. Bạn còn nhớ khi tạo backup bằng pg_dump mình có thể chọn nhiều format khác nhau không? Một số format thì dùng được với pg_restore, còn một số thì không.
| Định dạng backup | Mô tả | Được pg_restore hỗ trợ |
|---|---|---|
plain (text) |
SQL script chứa các lệnh khôi phục. | ❌ Không |
custom |
Backup nén theo định dạng riêng của PostgreSQL. | ✅ Có |
directory |
Backup lưu dưới dạng thư mục với nhiều file. | ✅ Có |
tar |
Archive theo định dạng TAR. | ✅ Có |
Lưu ý là với backup dạng text (plain) bạn không thể dùng pg_restore. Những file này phải khôi phục thủ công bằng lệnh psql. Ví dụ:
psql -U username -d database_name -f backup.sql
Sự linh hoạt của pg_restore: các tham số khôi phục
Một trong những lý do pg_restore được ưa chuộng là vì nó cực kỳ linh hoạt. Bạn có thể khôi phục toàn bộ database hoặc chỉ từng phần nhỏ.
Khôi phục cấu trúc dữ liệu. Nếu bạn chỉ muốn khôi phục cấu trúc database (schema bảng, index, trigger, v.v.), hãy dùng flag --schema-only:
pg_restore -U postgres -d university --schema-only backup.dump
Cái này hữu ích khi bạn muốn phân tích cấu trúc database hoặc tạo bản copy "trống".
Chỉ khôi phục dữ liệu. Nếu bạn chỉ quan tâm tới dữ liệu (không cần cấu trúc), dùng tham số --data-only:
pg_restore -U postgres -d university --data-only backup.dump
Cách này hợp lý khi cấu trúc đã có sẵn, bạn chỉ cần nạp lại nội dung bảng thôi.
Xoá trước khi khôi phục. Đôi khi bảng hoặc schema đã tồn tại trong database. Để xoá chúng trước khi khôi phục, dùng flag --clean:
pg_restore -U postgres -d university --clean backup.dump
Với tham số này, pg_restore sẽ xoá các object cũ trước, rồi mới khôi phục dữ liệu từ backup.
Lọc object. pg_restore cho phép bạn chọn object nào trong backup sẽ được khôi phục. Dùng flag --table:
pg_restore -U postgres -d university --table=students backup.dump
Ví dụ này chỉ khôi phục bảng students thôi nhé.
In SQL ra console
Nếu bạn muốn xem trước những gì sẽ được thực thi khi khôi phục mà chưa muốn thay đổi database, hãy dùng flag --list:
pg_restore -l backup.dump
Còn nếu muốn lấy các lệnh SQL text sẽ chạy, thêm --verbose:
pg_restore -U postgres --verbose --schema-only backup.dump
Ví dụ khôi phục
- Khôi phục toàn bộ database.
Trường hợp phổ biến nhất: bạn muốn khôi phục toàn bộ database từ backup:
pg_restore -U postgres -d university backup.dump
- Khôi phục một bảng cụ thể.
Ví dụ, nếu bạn chỉ mất dữ liệu ở bảng courses, hãy khôi phục riêng bảng đó:
pg_restore -U postgres -d university --table=courses backup.dump
- Khôi phục schema database.
Để chỉ khôi phục cấu trúc bảng (không có dữ liệu):
pg_restore -U postgres -d university --schema-only backup.dump
- Khôi phục và ghi đè object cũ.
Nếu bạn cần ghi đè dữ liệu đã có:
pg_restore -U postgres -d university --clean backup.dump
Lỗi thường gặp khi khôi phục và cách tránh
Không tương thích version. Nếu bạn tạo backup ở một version PostgreSQL rồi khôi phục ở version khác (đặc biệt là version cũ hơn), có thể sẽ gặp lỗi không tương thích. Cách giải quyết: cố gắng dùng cùng version PostgreSQL cho cả backup và restore.
Lỗi "Role does not exist". Nếu trong backup có role (user) mà server mới chưa có, bạn sẽ gặp lỗi này. Cách giải quyết: tạo trước các role cần thiết trên server mới.
Lỗi "Table already exists". Lỗi này xảy ra khi bạn khôi phục bảng đã tồn tại. Dùng
--cleanđể tránh bị conflict.
GO TO FULL VERSION