Hướng dẫn export và restore schema PostgreSQL bằng pg_dump và psql
Cách export và restore schema PostgreSQL chỉ gồm cấu trúc bảng, index, constraint bằng pg_dump và psql — không kèm dữ liệu, kèm xử lý các lỗi thường gặp.
Khi cần dựng database test, môi trường staging hoặc chuyển cấu trúc bảng sang một server khác, ta thường chỉ cần cấu trúc mà không cần dữ liệu. PostgreSQL hỗ trợ việc này bằng cờ --schema-only của pg_dump.
Bài viết này walkthrough trọn quy trình: export schema public, tạo database đích, rồi restore bằng psql — kèm các lỗi thường gặp và cách xử lý.
Bối cảnh: khi nào cần export schema
Dựng môi trường test/staging: Copy cấu trúc bảng, index, constraint, view, function từ database dev sang database mới.
Chuẩn bị dữ liệu mẫu: Tạo schema đúng như production rồi mới import dữ liệu đã lọc.
Di chuyển cấu trúc sang server khác: Đặt schema vào Git để review thay đổi trước khi áp dụng.
Tái tạo môi trường lỗi: Dựng lại schema tối thiểu để reproduce lỗi.
Bước 1: Export schema
pg_dump -h localhost -p 5432 -U postgres -d ten_database \
--schema-only -n public -f schema_public.sqlGiải thích tham số
-h
Host kết nối
-p
Port của PostgreSQL server
-U
User kết nối
-d
Tên database nguồn cần export
--schema-only (-s)
Chỉ xuất cấu trúc, không xuất dữ liệu
-n public
Chỉ xuất schema public, bỏ trống để xuất tất cả
-f
Tên file đầu ra
Các biến thể hữu ích
Bước 2: Tạo database đích
Bước 3: Restore schema
Bắt buộc: File phải nằm đúng thư mục hiện tại, hoặc chỉ định đường dẫn đầy đủ.
-v ON_ERROR_STOP=1: Dừng ngay khi gặp lỗi đầu tiên, tránh để lại schema dở dang mà không biết chỗ nào hỏng.
Restore khi PostgreSQL chạy trong Docker
Bước 4: Kiểm tra kết quả
Ngoài ra có thể kiểm tra nhanh số lượng bảng, view và function:
Các lỗi thường gặp
schema "public" already exists
Database mới luôn có sẵn schema public
Bỏ qua — không dùng ON_ERROR_STOP cho phần này
role "xxx" does not exist
File dump chứa câu lệnh OWNER TO xxx
Tạo role trước CREATE ROLE xxx; hoặc dump lại với --no-owner --no-privileges
Thiếu extension (uuid-ossp, pg_trgm, postgis…)
Dump với -n public không kèm lệnh tạo extension
Tạo trước: CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Sai encoding hoặc mất dấu tiếng Việt
PowerShell dùng > có thể ghi file ở dạng UTF-16
Dùng -f thay vì redirect >
pg_restore: error: input file appears to be a text format dump
Dùng pg_restore cho file plain SQL
Chuyển sang dùng psql
Lưu ý khi chạy trên Windows
Thay
16bằng phiên bản PostgreSQL đang cài đặt.Nếu
pg_dumpkhông có trongPATH, dùng đường dẫn đầy đủ như trên.Nên thêm
pg_dumpvàoPATHthay vì gõ đường dẫn mỗi lần.
Mẹo bổ sung
Nhập mật khẩu không tương tác: dùng
PGPASSWORD=matkhautrên Linux/macOS,$env:PGPASSWORD="matkhau"trong PowerShell, hoặc lưu vào file~/.pgpassvới quyền600.Muốn có cả schema lẫn dữ liệu: bỏ
--schema-only.Chỉ muốn dữ liệu: dùng
--data-only.Luôn restore với
-v ON_ERROR_STOP=1để dễ tìm và xác định lỗi.Kiểm tra trước khi áp dụng lên production: dump bằng
--no-owner --no-privileges, commit file SQL vào Git và review trước khi chạy.
Tóm tắt
Quy trình chỉ gồm 3 bước:
Dump schema →
pg_dump --schema-only -n public -f schema_public.sqlTạo DB đích →
createdb ten_database_moiRestore bằng
psql→psql -d ten_database_moi -v ON_ERROR_STOP=1 -f schema_public.sql
Tài liệu tham khảo:
Cập nhật lần cuối
Nội dung này có hữu ích không?