Tương tự như MySQL, bạn có thể dùng replication để backup. Nhưng cuộc đời lúc nào cũng có những nhu cầu ngoại lệ, thường thấy nhất là data cho môi trường staging hoặc development hoặc đơn giản chỉ là chép một bảng từ chỗ này qua chỗ kia để test cái này cái kia. Cách đơn giản, dễ xài, có thể lấy một phần dữ liệu đó là pg_dump, ta có thể dump một table, dump schema … dễ dàng với dữ liệu nhỏ. Nhưng thử nghĩ, data ngày một tăng dần và một bảng có khi tới vài GB thì giải quyết làm sao.

Lưu ý: Dump lock database trong quá trình thực hiện, luôn luôn dump trên slave database không phục vụ pubic user.

1. Dump SQL

Cách tiếp cận thông thường, dump ra sql và execute file đó trong postgres

> pg_dump db_name | gzip > db_name.sql.gz
> gunzip db_name.sql.gz
> psql db_name < db_name.sql

Hoặc chỉ lấy cái mình cần

> pg_dump -s db_name | gzip > db_name_schema.sql.gz # chỉ lấy schema của database
> pg_dump -a -t users -t products -t categories db_name | gzip > db_name_data.sql.gz # dump data của một số bảng

> pgsql db_name < db_name_schema.sql
> pgsql db_name < db_name_data.sql

Để ý là compress lúc dump thì phải uncompress lúc restore, ta có thể pipe uncompress trong quá trình restore luôn, kiểu như:

> zcat db_name.sql.gz | psql db_bamze

=> tiết kiệm được quá trình ghi ra đĩa.

2. Format dump

pg_dump mặc định export ra SQL file, postgresql cho phép export với một vài định dạng khác ví dụ custom hoặc directory [1]. Theo tài liệu thì mặc định trong quá trình export với custome và directory PostgreSQL đã hỗ trợ compress luôn, tương tự như cách pipe uncompress.

Ví dụ:

> pg_dump -Fc db_name > db_name_fc.gz
> pg_restore -C -d db_name db_name_fc.gz
> pg_dump -Fd -f db_name_fd db_name
> pg_restore -C -d db_name db_name_fd

Tuy nhiên lợi điểm lớn nhất của việc sử dụng custom hay directory format là parallel dump/restore, cách này giúp tăng tốc quá trình dump/restore trên dữ liệu lớn. PostgreSQL sẽ dump/restore nhiều table cùng một thời điểm, tất nhiên quá trình này sẽ ngốn một lượng lớn CPU dẫn tới tải cao trên server.

Ví dụ

> pg_dump -j 8 -Fd -f db_name_fd db_name
> pg_restore -j 8 -Fd -C db_name_fd

Hoặc exclude một vài table không cần thiết như cách ban đầu

> pg_dump -Fc db_name --exclude-table-data 'events' > db_name_fc.gz

3. Ref