Chỉ sao lưu thường xuyên cơ sở dữ liệu PostgreSQL của bạn là không đủ cho quá trình khôi phục thảm họa - bạn cần đảm bảo rằng các tệp sao lưu có thể truy cập được và lành mạnh nếu và khi được yêu cầu đối với quy trình khôi phục. Đọc tiếp để xem một số ví dụ về cách thiết lập kiểm tra tự động các bản sao lưu PostgreSQL.
Sao lưu được Tạo bằng pg_basebackup
pg_basebackup bản sao lưu chứa toàn bộ thư mục dữ liệu cho một cụm dữ liệu. Thư mục này thường được đóng gói thành một tarball, đôi khi có thêm tarball cho các tệp WAL đã được tạo từ khi bắt đầu backup.
Để kiểm tra một pg_basebackup như vậy tarball, trước tiên hãy giải nén tarball vào thư mục mới. Nếu có một tệp tin WAL riêng biệt, hãy giải nén tệp đó vào pg_wal
thư mục bên trong thư mục mới:
$ mkdir backup-test
$ cd backup-test
$ tar --no-same-owner xvf /path/to/base.tar.gz
$ mkdir -p pg_wal
$ cd pg_wal
$ tar --no-same-owner xvf /path/to/pg_wal.tar.gz
Bây giờ bạn có thể bắt đầu quy trình máy chủ PostgreSQL cho thư mục này:
$ pg_ctl -D path/to/backup-test start
(Lưu ý: pg_ctl là một công cụ dòng lệnh được bao gồm trong bản phân phối Postgres tiêu chuẩn. Nó có sẵn ở mọi nơi mà bản thân Postgres cũng có, tương tự như các công cụ đi kèm như psql và pg_dump . Tìm hiểu thêm về pg_ctl tại đây.)
Nếu đã có máy chủ PostgreSQL được cài đặt / đang chạy trên máy này, có thể bạn sẽ muốn bắt đầu trên một cổng khác với cổng 5432 mặc định:
$ pg_ctl -D path/to/backup-test -o "-p 6000 -k /tmp" start
Nếu mọi thứ thành công cho đến nay, bạn sẽ muốn kiểm tra xem dữ liệu bên trong cơ sở dữ liệu được lưu trữ của bạn có tốt hay không. Nếu bạn có các tập lệnh kiểm tra tự động để chạy cơ sở dữ liệu của bạn, bây giờ sẽ là thời điểm tốt để khởi chạy ít nhất một tập hợp nhỏ các thosetest dựa trên cơ sở dữ liệu đã được khôi phục này. Nếu không, bạn có thể kết hợp một số kiểm tra nhanh bằng psql:
$ psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
Lệnh trên thực hiện một truy vấn đơn giản đối với một bảng sẽ tồn tại. Đoạn mã psql sẽ cho bạn biết truy vấn có thành công hay không. Tất nhiên, bạn có thể chạy các truy vấn phức tạp hơn hoặc chạy tệp .sql hoặc thậm chí là một chỉ số kiểm tra riêng biệt sẽ kết nối với cơ sở dữ liệu này và chạy các bài kiểm tra.
Khi hoàn tất quá trình kiểm tra, bạn có thể dừng quy trình của máy chủ Postgres bằng:
$ pg_ctl -D path/to/backup-test stop
Và dọn dẹp toàn bộ thư mục cụm cơ sở dữ liệu đã giải nén:
$ rm -rf path/to/backup-test
Đây là cách nó trông như thế nào khi tất cả được ghép lại với nhau:
#!/bin/bash
# exit immediately if any step fails
set -eo pipefail
# fetch the latest backup
# TODO: copy out base.tar.gz and pg_wal.tar.gz of latest backup
# create a directory to work in
BACKUP_DIR=/tmp/backup-test
rm -rf $BACKUP_DIR
mkdir $BACKUP_DIR
# unpack the backup archives
tar -C $BACKUP_DIR --no-same-owner xvf /path/to/base.tar.gz
mkdir -p $BACKUP_DIR/pg_wal
tar -C $BACKUP_DIR/pg_wal --no-same-owner xvf /path/to/pg_wal.tar.gz
# start a new Postgres server for the cluster on port 6000
pg_ctl -D $BACKUP_DIR -o "-p 6000 -k /tmp" start
# perform a simple test
psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
# shutdown the server
pg_ctl -D $BACKUP_DIR stop
# cleanup the files
rm -rf $BACKUP_DIR /path/to/base.tar.gz /path/to/pg_wal.tar.gz
Sao lưu được Tạo bằng pg_dump
pg_dump công cụ (docs) cũng có thể được sử dụng để tạo bản sao lưu - điều này linh hoạt hơn ở chỗ bạn tùy ý chọn cơ sở dữ liệu / lược đồ / bảng mà bạn muốn sao lưu, trái ngược với pg_basebackup là một quá trình tất cả hoặc không có gì.
Với pg_dump , bạn có thể tạo một .sql
script hoặc một .pgdmp
nhị phân tệp chứa tất cả dữ liệu (và tùy chọn cả các câu lệnh DDL để tạo bảng / chỉ mục, v.v.). Để khôi phục tệp như vậy, bạn cần kết nối với máy chủ liveatabase và chạy các lệnh SQL bên trong tệp .sql / .pgdmp. Trong khi bạn có thể sử dụng psql thông thường để chạy tệp .sql, bạn sẽ cần sử dụng pg_restore lệnh (docs) torun tệp .pgdmp.
Để kiểm tra các bản sao lưu như vậy, trước tiên chúng tôi tìm nạp tệp và sau đó tạo một cụm cơ sở dữ liệu trống mới:
$ rm -rf path/to/backup-test
$ pg_ctl -D path/to/backup-test initdb
và khởi động máy chủ PostgreSQL trên đó, nghe trên cổng 6000 như trước:
$ pg_ctl -D path/to/backup-test -o "-p 6000 -k /tmp" start
Có thể tạo pg_dump các tệp hoàn toàn độc lập, nhưng cũng có thể tạo ra chúng để không như vậy. Do đó, tùy thuộc vào cách kết xuất được tạo, một số bước thiết lập có thể được yêu cầu:
- tạo cơ sở dữ liệu
- tạo bảng, chỉ mục, v.v.
- cấp đặc quyền
Sau khi hoàn tất, bạn có thể sử dụng psql hoặc pg_restore để đưa gói dữ liệu vào cuộc sống:
# for .sql files
$ psql -p 6000 -h /tmp -v ON_ERROR_STOP=1 -1 -b -f path/to/dump.sql
# for .pgdmp files
$ pg_restore -p 6000 -h /tmp -d mydb -C -1 -f path/to/dump.pgdmp
Như trước đây, tại thời điểm này, các thử nghiệm có thể được thực hiện để đảm bảo tính minh bạch của dữ liệu được lưu trữ.
Đây là cách nó trông, tất cả được tổng hợp lại với nhau:
#!/bin/bash
# exit immediately if any step fails
set -eo pipefail
# fetch the latest dump
# TODO: copy out the dump.sql or dump.pgdmp of latest backup
# create an empty database cluster
BACKUP_DIR=/tmp/backup-test
rm -rf $BACKUP_DIR
pg_ctl -D $BACKUP_DIR initdb
# start a new Postgres server for the cluster on port 6000
pg_ctl -D $BACKUP_DIR -o "-p 6000 -k /tmp" start
# TODO: perform any specific setup steps here
# restore the file, .sql:
psql -p 6000 -h /tmp -v ON_ERROR_STOP=1 -1 -b -f path/to/dump.sql
# or .pgdmp:
pg_restore -p 6000 -h /tmp -d mydb -C -1 -f path/to/dump.pgdmp
# perform a simple test
psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
# shutdown the server
pg_ctl -D $BACKUP_DIR stop
# cleanup the files
rm -rf $BACKUP_DIR /path/to/dump.*
Đề phòng các yếu tố kích hoạt
Trong khi khôi phục pg_dump sao lưu, dữ liệu được chèn vào các bảng, giống như khi một ứng dụng thực hiện điều đó. Nếu bạn có trình kích hoạt kết nối với các dịch vụ bên ngoài để thông báo về việc chèn hàng, tốt nhất bạn nên tắt chúng trong quy trình lưu trữ tại đó.
Khi gọi pg_dump để tạo tệp sql, bạn có thể sử dụng tùy chọn --disable-triggers
nói với pg_dump để tạo tập lệnh để vô hiệu hóa trình kích hoạt trong khi chèn.
Khi gọi pg_restore trên cơ sở dữ liệu đã có trình kích hoạt, bạn có thể sử dụng --disable-triggers
trong pg_restore để đạt được hiệu quả tương tự.
Kiểm tra PITR
Khôi phục điểm trong thời gian (PITR) trong Postgres dựa vào bản sao lưu đầy đủ được thực hiện bằng pg_basebackup và một chuỗi các tệp WAL từ thời điểm đó cho đến thời điểm bạn muốn khôi phục. Do đó, việc kiểm tra PITR sẽ không đầu tư vào bản sao lưu đầy đủ cũng như các tệp WAL tiếp theo.
Đối với thử nghiệm sao lưu tự động, chúng tôi không có mục tiêu khôi phục cụ thể. Các tệp WAL đã lưu trữ từ lần sao lưu cuối cùng trở đi cho đến khi những tệp mới nhất nên được kiểm tra. Cách dễ nhất để kiểm tra điều này là làm theo các bước tương tự như đối với pg_basebackup phương pháp kiểm tra, chỉ với một bước bổ sung. Sau khi đóng gói bản sao lưu mới nhất, tìm nạp tất cả các tệp WAL có liên quan và có sẵn và đặt chúng vào pg_wal
trước khi khởi động máy chủ Postgres. Cụ thể:
#!/bin/bash
# exit immediately if any step fails
set -eo pipefail
# fetch the latest backup
# TODO: copy out base.tar.gz and pg_wal.tar.gz of latest backup
# create a directory to work in
BACKUP_DIR=/tmp/backup-test
rm -rf $BACKUP_DIR
mkdir $BACKUP_DIR
# unpack the backup archives
tar -C $BACKUP_DIR --no-same-owner xvf /path/to/base.tar.gz
mkdir -p $BACKUP_DIR/pg_wal
tar -C $BACKUP_DIR/pg_wal --no-same-owner xvf /path/to/pg_wal.tar.gz
# --> this is the new extra step <--
# TODO: fetch all WAL files from the WAL archive since the last
# backup, and place them in $BACKUP_DIR/pg_wal
# start a new Postgres server for the cluster on port 6000
pg_ctl -D $BACKUP_DIR -o "-p 6000 -k /tmp" start
# perform a simple test
psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
# shutdown the server
pg_ctl -D $BACKUP_DIR stop
# cleanup the files
rm -rf $BACKUP_DIR /path/to/base.tar.gz /path/to/pg_wal.tar.gz
Điều này sẽ xác minh xem cả tệp sao lưu cuối cùng và tệp WAL tiếp theo có tốt hay không, để chúng có thể được sử dụng cho PITR nếu và khi cần thiết.