backup

Backup dữ liệu trên PostgreSQL

Tản mạn: Tối hôm trước làm về sớm, thằng cùng chỗ làm rủ qua quán sashimi thịt ngựa. Không biết ăn thịt but đi ăn cùng cho vui. Nhắm mắt nuốt được vài miếng chấm toàn mù tạc xong tối về đau bụng cả đêm. Đúng là cái gì cũng phải có lửa mới hiệu quả được.
Xin lỗi các bạn thời gian vừa qua blog PostgreSQL Việt Nam hơi thiếu lửa.

Backup dữ liệu trên PostgreSQL

Hôm nay bocap sẽ tái khởi động với bài viết các cách thức backup dữ liệu trên PostgreSQL.
Có một số cách phân but về tổng quan backup trên PostgreSQL được chia làm 2 loại "offline backup", "online backup". Ngoài ra phân loại chi tiết hơn thì có thêm backup vật lý(backup data files) và backup logic(backup dữ liệu qua SQL). Đối với từng loại backup có những đặc điểm tốt xấu riêng. Hãy tìm hiểu và lựa chọn phương pháp phù hợp với môi trường của bạn.

Offline backup

Là hình thức backup dữ liệu khi PostgreSQL Server đã dừng hoạt động. Nên phương pháp này chỉ có thể backup theo phương pháp vật lý.
Sau khi dừng hoạt động từ server (pg_ctl stop -mf), chúng ta copy cả thư mục dữ liệu (database cluster). Nếu có sử dụng tablespace để lưu trữ dữ liệu ngoài thư mục dữ liệu thì phải backup cả những thư mục đó.
Đặc điểm của hình thức backup này.

  • Ảnh hưởng tới hệ thống: Phải stop database trước khi backup.
  • Phạm vi backup: Toàn bộ database cluster.
  • Thời điểm phục hồi khi restore: Thời điểm thực hiện sao lưu.

Chú ý:

  • Nếu database cluster sử dụng tính năng lưu trữ dữ liệu bên ngoài database cluster (tablespace), hoặc lưu trữ WAL ngoài database cluter, khi backup cũng phải backup các đối tượng này.

[bocap@localhost ~]$ pg_ctl stop -mf
waiting for server to shut down.... done
server stopped
[bocap@localhost ~]$ mkdir /mnt/backup/data_`date +"%m-%d-%y"`
[bocap@localhost ~]$ ls -l /mnt/backup/
合計 0
drwxrwxr-x. 2 bocap bocap 6 11月  1 12:50 data_11-01-17
[bocap@localhost ~]$ tar cvfz /mnt/backup/data_11-01-17/data.tar.gz $PGDATA 
[bocap@localhost ~]$ ll  /mnt/backup/data_11-01-17/
合計 130956
-rw-rw-r--. 1 bocap bocap 134096110 11月  1 12:53 data.tar.gz
[bocap@localhost ~]$ 

Online backup

Là hình thức backup dữ liệu khi PostgreSQL vẫn đang hoạt động và cho phép ảnh hưởng tới môi trường Database(ví dụ: ACCESS SHARE lock từ pg_dump hay ảnh hưởng I/O từ backup) của bạn ở một mức độ cho phép.
Hình thức backup này có thể thực hiện bởi cả 2 phương pháp backup vật lý và logic.

Online logic backup

Sử dụng lệnh pg_dump (backup theo đơn vị bảng, schema, .., database), hoặc pg_dumpall (backup toàn bộ dữ liệu của database cluster) để backup dữ liệu. Các câu lệnh này sẽ connect tới PostgreSQL và lấy dữ liệu theo dạng logic (SQL) và lưu trữ dưới dạng text hoặc tar(zip). Các câu lệnh này cũng restore dữ liệu về thời điểm chạy câu lệnh pg_dump/pg_dumpall.
Bắt đầu từ phiên bản PostgreSQL 9.3 pg_dump/pg_restore(9.2~) có thêm chức năng backup/restore dữ liệu song song (sử dụng nhiều connections). Trong những môi trường nhiều CPU và Disk có tính năng tốt có thể sử dụng chức năng này một cách hiệu quả.
Đặc điểm của hình thức backup này.

  • Ảnh hưởng tới hệ thống: Có thể backup khi database đang hoạt động.
  • Phạm vi backup: bảng, schema, ..database hoặc toàn bộ database cluster.
  • Thời điểm phục hồi khi restore: Thời điểm thực hiện sao lưu.

Chú ý:

  • pg_dump/pg_dumpall sẽ lần lượt lock tất cả các đối tượng backup (tables) ở chế độ AccessShareLock, nên cần chú ý khi thực hiện các thao tác có lock xung đột. Tham khảo thêm PostgreSQL Locks
  • Backup với định dạng text có thể restore bằng psql. Ở các định dạng khác, ta restore bằng lệnh pg_restore.
  • Với option -Z, pg_dump có thể nén dữ liệu backup với nhiều mức độ (0-9, mặc định là 6). But khi mức độ nén cao tỷ lệ CPU cũng sẽ cao theo. Nên cân đối hợp lý giữa CPU và dung lượng lưu trữ.

DangnoMacBook-Pro:~ bocap$ psql -c "select * from testtbl"
 id 
----
  1
(1 row)

DangnoMacBook-Pro:~ bocap$ pg_dump --table testtbl -f /tmp/testdump
DangnoMacBook-Pro:~ bocap$ cat /tmp/testdump | grep -v -e SET -e "\-" -e "^$"
CREATE TABLE testtbl (
    id integer
);
ALTER TABLE testtbl OWNER TO postgres;
COPY testtbl (id) FROM stdin;
1
\.
DangnoMacBook-Pro:~ bocap$ 

Online backup vật lý

Là cách tạo 1 basebackup (sử dụng lệnh pg_basebackup hoặc function pg_start_backup/pg_stop_backup) kết hợp với việc xuất archive log (transaction log được lưu trữ thông qua parameter archive_command). Khi restore ta tạo file recovery.conf trong thư mục data (basebackup), điền nội dung restore WAL từ đâu (parameter restore_command) sau đó khởi động database từ thư mục basebackup.
Dữ liệu backup sẽ được phục hồi tới thời điểm archive_command chạy lần cuối cùng (lệnh chỉ định trong archive_command sẽ được chạy khi dung lượng transaction đủ 16MB, hoặc quá thời gian chỉ định trong archive_timeout từ lần archive trước).
Đặc điểm của hình thức backup này.

  • Ảnh hưởng tới hệ thống: Có thể backup khi database đang hoạt động.
  • Phạm vi backup: bảng, schema, ..database hoặc toàn bộ database cluster.
  • Thời điểm phục hồi khi restore: Thời điểm thực hiện sao lưu.

Chú ý:

  • Xử lý tạo một basebackup giống như copy hoàn toàn một database cluster. Nên nếu dữ liệu lớn sẽ mất nhiều thời gian.
  • Khi pg_basebackup chạy lệnh này sẽ thực hiện một CHECKPOINT, mặc định CHECKPOINT này chạy ở chế độ chậm spread (có thể chậm hơn so với thông thường = checkpoint_completion_target * checkpoint_timeout = 2.5 phút). Nên cất nhắc chạy ở chế độ nhanh (-c fast) nếu muốn pg_basebackup diễn ra nhanh hơn. But cũng nên chú ý workload lớn khi CHECKPOINT nhanh có thể ảnh hưởng tới hệ thống database.
  • pg_basebackup mặc định không copy WAL (transaction log) sinh ra trong lúc chạy lệnh. Sử dụng option -x nếu muốn tạo một pg_basebackup sử dụng trong cấu hình replication.

DangnoMacBook-Pro:~ bocap$ grep replication $PGDATA/pg_hba.conf | grep -v "#"
host    replication     postgres        127.0.0.1/32            trust
host    replication     postgres        ::1/128                 trust
DangnoMacBook-Pro:~ bocap$ grep -e max_wal_senders -e wal_level -e archive_ $PGDATA/postgresql.conf
wal_level = replica			# minimal, replica, or logical
archive_mode = on		# enables archiving; off, on, or always
archive_command = 'test ! -f /mnt/archivedir/%f && cp %p /mnt/archivedir/%f'
archive_timeout = 30s		# force a logfile segment switch after this
max_wal_senders = 10		# max number of walsender processes
#max_standby_archive_delay = 30s	# max delay before canceling queries
DangnoMacBook-Pro:~ bocap$ ll /mnt/archivedir/
DangnoMacBook-Pro:~ bocap$ ll /mnt/data
DangnoMacBook-Pro:~ bocap$ pg_basebackup -D /mnt/data -h localhost
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
DangnoMacBook-Pro:~ bocap$ ll /mnt/data 
total 96
-rw-------   1 bocap  wheel      4 Nov  1 20:45 PG_VERSION
-rw-------   1 bocap  wheel    208 Nov  1 20:45 backup_label
drwx------   5 bocap  wheel    170 Nov  1 20:45 base
drwx------  56 bocap  wheel   1904 Nov  1 20:45 global
drwx------   3 bocap  wheel    102 Nov  1 20:45 pg_clog
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_commit_ts
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_dynshmem
-rw-------   1 bocap  wheel   4469 Nov  1 20:45 pg_hba.conf
-rw-------   1 bocap  wheel   1636 Nov  1 20:45 pg_ident.conf
drwx------   4 bocap  wheel    136 Nov  1 20:45 pg_logical
drwx------   4 bocap  wheel    136 Nov  1 20:45 pg_multixact
drwx------   3 bocap  wheel    102 Nov  1 20:45 pg_notify
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_replslot
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_serial
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_snapshots
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_stat
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_stat_tmp
drwx------   3 bocap  wheel    102 Nov  1 20:45 pg_subtrans
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_tblspc
drwx------   2 bocap  wheel     68 Nov  1 20:45 pg_twophase
drwx------   3 bocap  wheel    102 Nov  1 20:45 pg_xlog
-rw-------   1 bocap  wheel     88 Nov  1 20:45 postgresql.auto.conf
-rw-------   1 bocap  wheel  22320 Nov  1 20:45 postgresql.conf
DangnoMacBook-Pro:~ bocap$ ll /mnt/archivedir/
total 65544
-rw-------  1 bocap  wheel  16777216 Nov  1 20:45 000000010000000000000014
-rw-------  1 bocap  wheel  16777216 Nov  1 20:45 000000010000000000000015
-rw-------  1 bocap  wheel       305 Nov  1 20:45 000000010000000000000015.00000028.backup
DangnoMacBook-Pro:~ bocap$ 

Một số lưu ý khi backup

Khi backup, đối với từng hệ thống khác nhau, sẽ có những yêu cầu khác nhau. Thường khi backup users cần để ý tới những quan điểm bên dưới để đối ứng với yêu cầu hệ thống.

  • Cần restore dữ liệu về thời điểm nào.
    Ví dụ: Khi hệ thống bị trouble, muốn restore về thời điểm gần nhất thì nên sử dụng phương pháp Online backup vật lý.
  • Dung lượng dữ liệu backup.
    Ví dụ: Cần backup dữ liệu với dung lượng thấp thì nên sử dụng Online logic backup
  • Mức độ ảnh hưởng tới hệ thống.
    Ví dụ: Tính năng ổ cứng không tốt, không muốn xuất archive log để giảm Disk I/O thì không nên sử dụng phương pháp Online backup vật lý.  
Đăng kí nhận RSS - backup