CodeGym /Các khóa học /SQL SELF /Khôi phục dữ liệu với pg_restore

Khôi phục dữ liệu với pg_restore

SQL SELF
Mức độ , Bài học
Có sẵn

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ằng pg_dump với format custom hoặc directory

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

  1. 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
  1. 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
  1. 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
  1. 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.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION