JSPで行こう!

PostgreSQLの定期バックアップ

 PostgreSQL のバックアップを取ります。
やり方はいろいろありますが、ここではシンプルに cron で行う例です。
Windows の場合はタスクスケジューラを使います。

バックアップ形式の種類とお勧め

pg_dump という標準のコマンドで取得します。
以下を実行すれば解りますが、このコマンドにはオプションがいろいろあり何を使うべきなのか迷うところです。

pg_dump --help

お勧めとしては、

$ pg_dump -Fc -f database_name.custom database_name

-Fc でカスタム形式を使います。理由としては、

良くある
pg_dump datanase_name > database_name.sql
は止めましょう。サイズが大きくなり特に blob でファイルを保存している場合はさらに巨大になります。
SQL で出力されるので解りやすいのですが、思うほど使い勝手の良いものではありません。

shell スクリプト

 1日の回数と何世代持つかですが、そこは個々の事情があると思います。
最近は仮想マシンで動かす場合が多いと思いますので、多くの世代を持つ必要性は無くなってきていると思います。
ここでは、1日1回で1週間分としてみます。

# su - postgres
$ vi db_backup.sh
  中身を記述
$ chmod +x db_backup.sh

例として

#!/bin/bash
# 以下を環境に合わせて設定します
BK_DIR=/var/lib/pgsql/15/backups
DB_NAME=testdb
AGES=7 
#
BK_DATE=`date "+%Y%m%d"`
AGES=$(($AGES+1))
pg_dump -Fc -f ${BK_DIR}/${DB_NAME}_${NEW_DATE}.custom ${DB_NAME}
ls -t ${BK_DIR} | tail -n +${AGES} | xargs -I{} rm ${BK_DIR}/{}

"データベース名_年月日"をファイル名に付けます。
最新の7世代を残します。(7日前までではありません)
最後の ls 行では更新日が新しい順に並び替えて世代数を超えるファイルは削除します。

実行してみてファイルが作成されるか確認します。
最後に cron に登録します。毎日午前2時に実行する場合、

$ crontab -e
00 02 * * *     /var/lib/pgsql/db_backup.sh > /dev/null 2>&1

Windows でのバックアップ

考え方は同じです。
cron の代わりに タスクスケジューラ を使います。
登録するバッチですが、PostgreSQL の構成が下記であるとします。

C:\PostgreSQL
├─backups
├─bin
├─data

PostgreSQL\db_backup.bat を作成します。
Windows の場合、peer 接続が使えませんので、普通はユーザーの指定とパスワードが必要になります。

@pushd %~dp0
@rem 環境に合わせて設定します 
set AGES=7
set DB_NAME=testdb
set BK_DIR=c:\PostgreSQL\backups
set SUPERUSER=postgres
set PGPASSWORD=postgres
@rem
set BK_DATE=%date:~0,4%%date:~5,2%%date:~8,2%
bin\pg_dump -U %SUPERUSER% -Fc -f %BK_DIR%\%DB_NAME%_%BK_DATE%.custom %DB_NAME%
for /f "skip=%AGES%" %%a in ('dir /b /o-d %BK_DIR%\*.custom') do del %BK_DIR%\%%a
@popd

@pushd %~dp0 は、バッチコマンドのあるディレクトリを現在位置とします。@popd は元に戻します。
PGPASSWORD は、pg_dump のパスワードとして解釈されます。(コマンドの引数としては指定できない)
for の行は作成日の新しい順にファイル名を並び替え、上から世代数を超えたファイルを全て削除します。
バックアップが実行されなかった日があっても必ず世代数だけファイルが残ります。

« 前頁 次頁 »