vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです

PostgreSQLのバックアップをcronで定期的におこなう方法

   

LINEで送る
Pocket


こんにちは、okutani(@okutani_t)です。本記事ではPostgreSQLで管理しているDBを、定期的にバックアップする方法を解説しています。

今回作業をおこなったPostgreSQLのバージョンは以下。

$ psql --version
psql (PostgreSQL) 9.5.3

また、今回はCentOS7上で作業をおこなっています。

PostgreSQLには「論理バックアップ」と「物理バックアップ」がありますが、今回は「論理バックアップ」を使ったバックアップ方法を解説しています。

PostgreSQLの論理バックアップには「pg_dump」コマンドを使います。pg_dumpは運用中のDBであっても、停止させずにバックアップを取得することができます。

さらに、Linuxで利用できる「cron」機能を使うことで、定期的に指定したコマンドを実行することができます。これらを組み合わせて、定期的にバックアップを取得する方法を解説します。

参考論理バックアップ(pg_dump と pg_dumpall) — Let’s Postgres
参考PostgreSQLのデータベースをcronを使って自動バックアップする – 発声練習

スポンサーリンク

バックアップの取得方法

では、「pg_dump」コマンドを使ってDBのバックアップを取得してみましょう。

とはいってもかんたんで、次の形式でコマンドラインから実行するだけでOKです。

$ pg_dump DB名 > バックアップファイル名

「postgres」データベースを「postgres.sql」という名前でバックアップする場合は、次のとおりです。

$ pg_dump postgres > postgres.sql

pg_dumpはオプションを付けずに実行すると「プレーンテキスト形式」で出力されます。中身はただのSQL文です。

「-Fc」をつけると「カスタムアーカイブ形式」で生成することができます。バイナリ形式かつ、圧縮されたバックアップファイルを作成することができます。

$ pg_dump -Fc postgres -f postgres.custom

「-Ft」をつけると「tar形式」で生成することができます。

$ pg_dump -Ft postgres -f postgres.tar

また、個別のDBではなく、データベースクラスタ全体のバックアップを取得する場合は「pg_dumpall」コマンドを利用します。プレーンテキスト形式のみサポートしています。

$ pg_dumpall > all.sql

ちなみに、「pg_dump」「pg_dumpall」はリモートからも実行することができます。

リストア方法

次にリストア(バックアップデータからDBを作成する)方法を見てみます。

こちらもかんたんで、次の形式で実行します。あらかじめ、空のDBを作成しておきましょう。

$ psql DB名 > バックアップファイル名

「postgres.sql」から「mypostgres」データベースを生成する場合は、次のとおりです。

# pg_dumpプレーンテキスト形式の場合
$ psql mypostgres < postgres.sql
# pg_dumpallプレーンテキスト形式の場合
$ psql -f postgres.sql

上記は「pg_dumpのプレーンテキスト形式(デフォルト)」「pg_dumpall」で生成したバックアップファイルのみ利用することができます。

それ以外の形式は「pg_restore」コマンドを利用します。

$ pg_restore -d DB名 バックアップファイル名

pg_restoreの実際の使い方は以下のとおりです。

$ pg_restore -d mypostgres postgres.custom

これでバックアップファイルからリストアすることができました。

cronで定期的にバックアップを取る

では、PostgreSQLのDBを、cronを使って定期的にバックアップする方法を見てみましょう。

次のとおり準備していきます。

  • バックアップ場所の作成(任意の場所でOK)
  • バックアップ用シェルスクリプト(pg_backup.sh)の作成
  • cronの設定

バックアップ場所の作成

バックアップファイルを配置するディレクトリを作成しましょう。

どこでもOKですが、HTTPポートを開けている場合は、外部からアクセス出来ない場所(public外)に配置します。

今回は「/var/backup/」ディレクトリを作成して、そちらに配置するようにしました。一緒に権限もつけておきます。

$ sudo mkdir -p /var/backup/
$ sudo chmod 777 /var/backup/

これで、バックアップ用のディレクトリが作成されました。

バックアップ用シェルスクリプトの作成

PostgreSQLのDBをバックアップするシェルスクリプトを作成します。

今回は、以下の内容の「pg_backup.sh」というファイルを、「/var/backup_sh/」に配置しました。

$ sudo mkdir -p /var/backup_sh
$ sudo vi /var/backup_sh/pg_backup.sh
#!/bin/bash

# バックアップファイルを残しておく日数
PERIOD='+10'
# 日付
DATE=`date '+%Y%m%d-%H%M%S'`
# バックアップ先ディレクトリ
SAVEPATH='/var/backup/'
# 先頭文字
PREFIX='postgres-'
# 拡張子
EXT='.sql'
# データーベース名
DBNAME='postgres'

# バックアップ実行
pg_dump $DBNAME > $SAVEPATH$PREFIX$DATE$EXT

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

一番最後の行で、PERIODに指定した日数分以外はバックアップファイルを削除する処理をしています。これで10日分のバックアップまでをサーバーに残すことができますね。

作成したら、実行権限をつけて、試しに一度実行してみます。

$ sudo chmod 755 /var/backup_sh/pg_backup.sh
$ su - postgres
$ /var/backup_sh/pg_backup.sh

これで、次のようにバックアップファイルが生成されていればOKです。

$ ls /var/backup/
postgres-20160719-175043.sql

cronで定期的にバックアップをおこなう

では、cronに「pg_backup.sh」を登録し、定期的にバックアップを取得するようにしましょう。

cronを登録するには「crontab -e」コマンドを使います。今回はpostgresユーザーで登録したいので「-u」オプションで指定します。

$ sudo crontab -e -u postgres

次のとおり「1分ごとにバックアップを実行する」ように記述して、きちんと動作するか確認してみます。

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

保存したら、1分ごとに「/var/backup/」以下にバックアップファイルが存在するか確認してみましょう。

テストが終わったら、次は「毎日4時11分にバックアップを実行する」ように変更してみます。

$ sudo crontab -e -u postgres
11 4 * * * /var/backup_sh/pg_backup.sh > /dev/null 2>&1

今回は「> /dev/null 2>&1」として何も出力しないようにしていますが、適宜ログファイルなどに結果を吐き出しておくとよいかと思います。

「4時11分」と中途半端な時間にしているのは、別のcronで登録された処理と実行タイミングがかぶらないようにしているためです。ここらへんはお好みの時間でOKです。

これで、PostgreSQLのDBをcronを使って定期的にバックアップすることができました。

もちろん、次のように直接実行してもOKです。

$ /var/backup_sh/pg_backup.sh

自分の好きなタイミングでバックアップをとりたい時は、上記のように直接スクリプトを実行できますね。

まとめ

PostgreSQLでバックアップをおこなう方法と、cronを使った定期的なバックアップ方法を紹介しました。

一度設定しておけば、今後PostgreSQLでのバックアップを気にしなくてよくなりますね。

また、バックアップの実行結果などをメールやSlackなどに知らせるようにできれば、さらに便利に活用できるかと思います。時間があるとき記事にできればと思います。

LINEで送る
Pocket

okutani (okutani_t) のヒトコト
これで、万が一DBが壊れてしまった場合でも、バックアップファイルからDBを復帰することができます。さらに、AmazonのS3などに同期させておくとなお良しですね。

Web開発のお仕事を募集しています

フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。

Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。

ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。

LINKお問い合わせ

LINKokutani's Portfolio


 - PostgreSQL

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。