PostgreSQLをcronで自動バックアップ

DBMS

PostgreSQLには「論理バックアップ」と「物理バックアップ」があります。

論理バックアップ

論理バックアップは、データベースに格納されたデータをSQLの形で抽出します。
pg_dumpコマンドを使ってバックアップすることができます。

$ pg_dump データベース名 > ダンプファイル名

ダンプファイルからのリストア復旧は下記コマンドで行えます。

$ psql restore < ダンプファイル名

pg_dumpコマンドには様々なpg_dumpコマンドがあります。
-Fで出力フォーマットを変更した場合はpsqlでは読み込めないので
pg_restoreコマンドを使ってリストアする必要があります。

物理バックアップ

物理バックアップはPostgreSQLの物理ファイルをコピーしてバックアップします。
データベース稼働中、停止中どちらでもバックアップできる手法がありますが、
今回は「論理バックアップ」を使ったバックアップ方法を解説するため割愛させていただきます。
詳しく知りたい方は調べてみてください。

論理バックアップによる自動バックアップ

今回は下記条件で自動バックアップを行います。
ご自身の環境とことなる箇所は随時環境にあった形に読み替えてください。

  • Linux環境
  • バックアップ対象のDBは他サーバに存在する
  • バックアップはシェルで行う
  • 上記シェルを定期的にcronで実行
.pgpassを利用して自動認証

シェルを通してバックアップを行うのですが、バックアップ時の認証を自動化させるため、実行ユーザのホームディレクトリに認証情報を含む.pgpassファイルを設置します。

$ cd
$ touch .pgpass
$ chmod 600 .pgpass
$ vi .pgpass

.pgpassの中身は下記の様に各項目をコロンで繋いでください。
ホスト:ポート:データベース:ユーザ:パスワード

ワイルドカード(*)も利用できます。
例)ホストexample.com、ポートはデフォルトの5432、ホスト内の全てのデータベースが対象、ユーザpostgres、パスワードがpasswordの場合

example.com:5432:*:postgres:password

複数設定も可能ですので、複数設定したい場合は、単純に改行で複数行記述してください。

バックアップシェルの作成
$ cd /var
$ mkdir /var/auto_pg_backup
$ cd auto_pg_backup
$ touch pg_backup.sh
$ chmod 760 pg_backup.sh
$ vi pg_backup.sh

シェルの中身はこんな感じで。

#!/bin/bash

# バックアップファイルを残しておく日数
PERIOD='+30'
# 日付
DATE=`date '+%Y%m%d-%H%M%S'`
# バックアップ先ディレクトリ
SAVEPATH='/home/userhoge/dbbackup/'
# 先頭文字
PREFIX='postgres-'
# 末尾文字
SUFFIX='-all'
# 拡張子 (PLAINTEXT)
EXT='.sql'
# 拡張子 (ZIP ARCHIVE)
ZIP='.zip'
# ホスト名
HOSTNAME='example.com'
# ポート名
PORTNO='5432'
# ユーザ名
USERNAME='postgres'
# データーベース名
DBNAME='dbexample'

# データベースバックアップ実行
pg_dump -h $HOSTNAME -p $PORTNO -U $USERNAME \
           $DBNAME > $SAVEPATH$PREFIX$DATE$EXT
# zip
zip $SAVEPATH$PREFIX$DATE$ZIP $SAVEPATH$PREFIX$DATE$EXT
# 元バックアップ削除
rm -f $SAVEPATH$PREFIX$DATE$EXT

# フルダンプ実行
pg_dumpall -h $HOSTNAME -p $PORTNO -U $USERNAME \
           > $SAVEPATH$PREFIX$DATE$SUFFIX$EXT
# zip 
zip $SAVEPATH$PREFIX$DATE$SUFFIX$ZIP $SAVEPATH$PREFIX$DATE$SUFFIX$EXT
# 元バックアップ削除 
rm -f $SAVEPATH$PREFIX$DATE$SUFFIX$EXT

# 一定期間を過ぎた過去ファイルを削除
find $SAVEPATH -type f -daystart -mtime $PERIOD -exec rm {} \;

バックアップ先のディレクトリ作成とパーミッション設定を忘れずに。

cronで自動実行

cronに「pg_backup.sh」を登録し、定期的にバックアップするようにして完了です。
cron登録には crontab コマンドを使います。今回はpostgresユーザで登録してみます。

$ sudo crontab -e -u postgres

中身はとりあえず下記のような感じで。1分間隔でバックアップシェルをキックしますので、
バックアップファイルができるか確認してください。

*/1 * * * * /var/auto_pg_backup/pg_backup.sh > /dev/null 2>&1

問題なければご自身の好きな間隔で動くように設定し直しましょう。下記では毎日AM0:00にバックアップを実行します。

00 00 * * * /var/auto_pg_backup/pg_backup.sh > /dev/null 2>&1

コメント

タイトルとURLをコピーしました