docker PostgreSQL バックアップをcronで定期的に実行する

docker PostgreSQL バックアップをcronで定期的に実行する

dockerで構築したPostgreSQLを、cronで定期的にバックアップするまでの手順を記述してます。

環境

  • OS Rocky Linux release 8.4 (Green Obsidian)
  • docker 20.10.7
  • PostgreSQL 11.12

バックアップ用のシェルを作成

シェルを作成します。シェル用のディレクトリを作成します。
※ここではrootで作業してます。

mkdir -p /var/postgersBackup/
mkdir -p /var/postgersBackup/back
chmod 777 /var/postgersBackup/

作成したディレクトリに移動して、

cd /var/postgersBackup/

シェルを作成します。
※ここでは「postgresBackup.sh」という名前で作成してます。

nano postgresBackup.sh

シェルの内容は、以下となります。

#!/bin/bash

# バックアップ保存期間
PERIOD='+10'

# 日付フォーマット
DATE=`date '+%Y%m%d-%H%M%S'`

# バックアップ先(同じ階層にすると自身も削除してしまうので注意)
SAVEPATH='/var/postgersBackup/back/'

# プレフィックス文字
PREFIX='postgres-'

# 拡張子
EXT='.sql'

# コンテナ名
CONTENERNAME='コンテナ名'

# バックアップ実行
docker exec $CONTENERNAME pg_dumpall -U postgres > $SAVEPATH$PREFIX$DATE$EXT

# 保存期間が過ぎたらファイルの削除
find $SAVEPATH -type f -daystart -mtime $PERIOD -exec rm {} \;

コンテナ名は、「docker ps」で確認可能です。

docker ps

<出力結果>
CONTAINER ID   IMAGE            COMMAND                  CREATED      STATUS      PORTS                                                                                                                          NAMES
e98361b86c93   postgres:11.12   "docker-entrypoint.s…"   5 days ago   Up 5 days   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp                                                                                      postgres

実行権限を付与します。

chmod 755 /var/postgersBackup/postgresBackup.sh

一度、実行してみてバックアップファイルが作成できる確認してみます。

./postgresBackup.sh

cron設定

まずはcronを有効にします。

systemctl enable --now crond

次に「cron.d」を作成します。

nano /etc/cron.d/postgersBack

ここでは、テスト用に1分周期で作成します。

*/1 * * * * root /var/postgersBackup/postgresBackup.sh > /dev/null 2>&1

ログを確認して、実行されているかチェックします。

(root) CMD (/var/postgersBackup/postgresBackup.sh > /dev/null 2>&1)
(root) CMD (/var/postgersBackup/postgresBackup.sh > /dev/null 2>&1)

バックアップも作成されていることを確認します。

cd back
ls

<出力結果>
postgres-20210729-184841.sql

あとは、設定したい実行時間に変更すれば終わりです。
※ここでは、毎日夜中の3時に設定してます。

0 3 * * * root /var/postgersBackup/postgresBackup.sh > /dev/null 2>&1