PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pengujian Otomatis Cadangan PostgreSQL

Memiliki cadangan reguler dari database PostgreSQL Anda saja tidak cukup untuk pemulihan bencana – Anda perlu memastikan bahwa file cadangan dapat diakses dan sehat jika dan ketika diperlukan untuk prosedur pemulihan. Baca terus untuk melihat beberapa contoh cara menyiapkan pengujian otomatis cadangan PostgreSQL.

Cadangan Dibuat Menggunakan pg_basebackup

pg_basebackup backup berisi seluruh direktori data untuk databasecluster. Direktori ini biasanya dikemas menjadi tarball, terkadang dengan tarball tambahan untuk file WAL yang dibuat sejak awal pencadangan.

Untuk menguji pg_basebackup seperti itu tarball, pertama-tama buka paket tarball ke direktori kosong. Jika ada tarball file WAL terpisah, buka paketnya ke dalampg_wal direktori di dalam direktori baru:

$ 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

Anda sekarang dapat memulai proses server PostgreSQL untuk direktori ini:

$ pg_ctl -D path/to/backup-test start

(Catatan:pg_ctl adalah alat baris perintah yang disertakan dalam distribusi Postgres standar. Alat ini tersedia di mana pun Postgres itu sendiri, mirip dengan alat lain yang disertakan seperti psql dan pg_dump .Pelajari lebih lanjut tentang pg_ctl di sini.)

Jika sudah ada server PostgreSQL yang terinstal/berjalan di mesin ini, Anda mungkin ingin memulai pada port selain 5432 default:

$ pg_ctl -D path/to/backup-test -o "-p 6000 -k /tmp" start

Jika semuanya berhasil sejauh ini, Anda akan ingin memeriksa apakah data di dalam database yang Anda pulihkan sudah waras. Jika Anda memiliki skrip pengujian otomatis untuk dijalankan terhadap database Anda, sekarang adalah saat yang tepat untuk meluncurkan setidaknya satu set kecil pengujian tersebut terhadap database yang dipulihkan ini. Jika tidak, Anda dapat meretas beberapa pemeriksaan cepat menggunakan psql:

$ psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"

Perintah di atas melakukan kueri sederhana terhadap tabel yang seharusnya ada. Kode keluar psql akan memberi tahu Anda apakah kueri berhasil atau tidak. Tentu saja, Anda dapat menjalankan kueri yang lebih kompleks, atau menjalankan file .sql, atau bahkan skrip pengujian terpisah yang akan terhubung ke database ini dan menjalankan pengujian.

Setelah selesai dengan pengujian, Anda dapat menghentikan proses server Postgres dengan:

$ pg_ctl -D path/to/backup-test stop

Dan bersihkan seluruh direktori cluster database yang diekstraksi:

$ rm -rf path/to/backup-test

Begini tampilannya jika digabungkan:

#!/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

Cadangan Dibuat Menggunakan pg_dump

pg_dump tool (docs) juga dapat digunakan untuk membuat backup – ini lebih fleksibel karena Anda dapat memilih database/skema/tabel yang ingin Anda backup secara opsional, bukanpg_basebackup yang merupakan proses semua-atau-tidak sama sekali.

Dengan pg_dump , Anda dapat menghasilkan satu .sql skrip atau .pgdmp biner file yang berisi semua data (dan opsional juga pernyataan DDL untuk membuat tabel/indeks dll.). Untuk memulihkan file seperti itu, Anda harus terhubung ke server livedatabase dan menjalankan perintah SQL di dalam file .sql/.pgdmp. Meskipun Anda dapat menggunakan psql regular biasa untuk menjalankan file .sql, Anda harus menggunakan pg_restore perintah (docs) untuk menjalankan file .pgdmp.

Untuk menguji cadangan semacam itu, pertama-tama kita ambil file, lalu buat cluster database baru yang kosong:

$ rm -rf path/to/backup-test
$ pg_ctl -D path/to/backup-test initdb

dan mulai server PostgreSQL di dalamnya, dengarkan di port 6000 seperti sebelumnya:

$ pg_ctl -D path/to/backup-test -o "-p 6000 -k /tmp" start

Dimungkinkan untuk menghasilkan pg_dump file yang sepenuhnya mandiri, tetapi juga memungkinkan untuk membuatnya tidak demikian. Oleh karena itu, bergantung pada cara dump dibuat, beberapa langkah penyiapan mungkin diperlukan:

  • membuat database
  • membuat tabel, indeks, dll.
  • memberikan hak istimewa

Setelah selesai, Anda dapat menggunakan psql atau pg_restore untuk menghidupkan kembali data:

# 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

Seperti sebelumnya, pada titik ini, pengujian dapat dilakukan untuk memastikan kewarasan data yang disimpan.

Begini tampilannya, semua disatukan:

#!/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.*

Hati-hati dengan Pemicu

Saat memulihkan pg_dump backup, data akan dimasukkan ke dalam tabel, seperti ketika aplikasi melakukannya. Jika Anda memiliki pemicu yang terhubung ke layanan eksternal untuk memberi tahu tentang penyisipan baris, sebaiknya nonaktifkan selama prosedur pemulihan.

Saat menjalankan pg_dump untuk memancarkan file sql, Anda dapat menggunakan opsi--disable-triggers untuk memberi tahu pg_dump untuk membuat skrip untuk menonaktifkan pemicu saat memasukkan.

Saat menjalankan pg_restore pada database yang sudah memiliki pemicu, Anda dapat menggunakan --disable-triggers di pg_restore untuk mencapai efek yang sama.

Pengujian PITR

Point-in-time-recovery (PITR) di Postgres bergantung pada cadangan lengkap yang diambil menggunakanpg_basebackup , dan urutan file WAL dari titik tersebut hingga titik waktu yang ingin Anda pulihkan. Oleh karena itu, pengujian PITR melibatkan pengujian cadangan lengkap serta file WAL berikutnya.

Untuk pengujian pencadangan otomatis, kami tidak memiliki target pemulihan khusus. Semua file WAL yang diarsipkan dari cadangan terakhir dan seterusnya hingga yang terbaru harus diuji. Cara termudah untuk menguji ini adalah dengan mengikuti langkah yang sama seperti untuk pg_basebackup metode pengujian, hanya dengan satu langkah tambahan. Setelah membongkar cadangan terbaru, ambil semua file WAL yang relevan dan tersedia dan letakkan di pg_wal sebelum memulai server Postgres. Khususnya:

#!/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

Ini harus memverifikasi apakah file cadangan terakhir dan file WAL berikutnya baik, sehingga dapat digunakan untuk PITR jika dan saat dibutuhkan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom MySQL dengan DEFAULT NULL - pilihan gaya, atau bukan?

  2. PostgreSQL setara dengan pengumpulan massal Oracle

  3. PostgreSQL lambat di meja besar dengan array dan banyak pembaruan

  4. Bisakah PostgreSQL melakukan penggabungan antara dua prosedur tersimpan SQL Server?

  5. Kueri Sub SQL dalam batasan centang