PostgresqlをWAL-Gでバックアップ&リストア

こちらのサイトを参考にしました。

https://blog.noellabo.jp/entry/2019/03/05/yMjQeU9JXHxcyHTL

https://qiita.com/atsu1125/items/676d24c0473ad94b3f2b

https://blog.1q77.com/2019/06/wal-g/


環境

OracleCloudのA1インスタンス

Ubuntu20.04LTS

PostgreSQL12


1. WAL-Gをインストールする

ここからバイナリをダウンロードして/usr/local/binに配置

ARM64向けはないのでここを参考にビルドする

2. 環境変数の設定

上記のサイトを参考に/usr/local/binにwal-g.shを配置

オブジェクトストレージを使用するので次のように書き込む

#!/bin/bash

export AWS_ACCESS_KEY_ID=""
export AWS_SECRET_ACCESS_KEY=""
export AWS_ENDPOINT="https://s3.example.com"
export WALG_S3_PREFIX="s3://backetname/"
#export AWS_S3_FORCE_PATH_STYLE="true"
export PGPORT="5432"
export PGHOST="/var/run/postgresql"
export WALG_COMPRESSION_METHOD="brotli"

exec /usr/local/bin/wal-g "$@"

AWS_S3_FORCE_PATH_STYLEはオブジェクトストレージのURLの形式がhttps://s3.example.com/backetnameのようになってる場合に設定する

sudo chmod +x /usr/local/bin/wal-g.sh

必ず実行権限を付与する

3. フルバックアップしてみる

sudo -u postgres wal-g.sh backup-push /var/lib/postgresql/12/main

これでオブジェクトストレージにフルバックアップされる

wal-g.sh backup-list

これでバックアップができていれば成功

4. 差分バックアップの設定

/etc/postgresql/12/main/conf.d/archive.confを作成し次のように書き込む

archive_mode = on                                 
archive_command = '/usr/local/bin/wal-g.sh wal-push %p'  
archive_timeout = 60
wal_level = replica
restore_command = '/usr/local/bin/wal-g.sh wal-fetch "%f" "%p"'

ここでは60秒間隔で設定した

 sudo systemctl restart postgresql
 tail -f /var/log/postgresql/postgresql-12-main.log

エラーが出ずにバックアップできていればOK

5. 定期的にフルバックアップする

ここではcronを使用する

sudo -u postgres crontab -e

ここに書き込む

0 3 * * * /usr/local/bin/wal-g.sh backup-push /var/lib/postgresql/12/main/ ; /usr/local/bin/wal-g.sh delete retain 7 --confirm

ここでは毎日深夜3時にフルバックアップと古い物を削除(7個残す)するようにした


リストア

別マシンでバックアップ元と同じバージョンのPostgreSQLをインストールする

1. WAL-Gをインストールし設定ファイルをコピーする

バックアップ設定時と同じようにインストールしwal-g.shを/usr/local/binに配置する

2. クラスタの作成

クラスタを作成してデータディレクトリを空にする

sudo su - postgres 
pg_createcluster 12 test
rm -rf /var/lib/postgresql/12/test/*
exit

3. 設定ファイルの編集

必要に応じて/etc/postgresql/12/test/postgresql.confの編集をする

4. 差分復元コマンドの設定

/etc/postgresql/12/main/conf.d/restore.confを作成し次のように書き込む

restore_command = '/usr/local/bin/wal-g.sh wal-fetch "%f" "%p"'

5. リストアする

次のコマンドで最新のフルバックアップをリストアする

sudo -u postgres wal-g.sh backup-fetch /var/lib/postgresql/12/test/ LATEST

次のコマンドで最新の差分を復元しクラスタを動かす

sudo -u postgres touch /var/lib/postgresql/12/test/recovery.signal
sudo systemctl start postgresql@12-test

正常に復元できればrecovery.signalが削除される

※クラスタの削除はsudo -u postgres pg_dropcluster 12 test --stop