vdeepTweetPocketこんにちは、okutani(@okutani_t)です。本記事ではPostgreSQLで管理しているDBを、定期的にバックアップする方法を解説しています。今回作業をおこなったPostgreSQLのバージョンは以下。9.5.3また、今回はCentOS7上で作業をおこなっています。PostgreSQLには「論理バックアップ」と「物理バックアップ」がありますが、今回は「論理バックアップ」を使ったバックアップ方法を解説しています。PostgreSQLの論理バックアップには「pg_dump」コマンドを使います。pg_dumpは運用中のDBであっても、停止させずにバックアップを取得することができます。Linuxで利用できる「cron」機能を使うことで、定期的に指定したコマンドを実行することができます。これらを組み合わせて、定期的にバックアップを取得する方法を解説します。まとめバックアップの取得方法では、「pg_dump」コマンドを使ってDBのバックアップを取得してみましょう。いってもかんたんで、次の形式でコマンドラインから実行するだけでOKです。「postgres」データベースを「postgres.sql」という名前でバックアップする場合は、次のとおりです。postgres.sqlpg_dumpはオプションを付けずに実行すると「プレーンテキスト形式」で出力されます。中身はただのSQL文です。「-Fc」をつけると「カスタムアーカイブ形式」で生成することができます。バイナリ形式かつ、圧縮されたバックアップファイルを作成することができます。postgres.custom「-Ft」をつけると「tar形式」で生成することができます。postgres.tarまた、個別のDBではなく、データベースクラスタ全体のバックアップを取得する場合は「pg_dumpall」コマンドを利用します。プレーンテキスト形式のみサポートしています。all.sqlちなみに、「pg_dump」「pg_dumpall」はリモートからも実行することができます。次にリストア(バックアップデータからDBを作成する)方法を見てみます。こちらもかんたんで、次の形式で実行します。空のDBを作成しておきましょう。「postgres.sql」から「mypostgres」データベースを生成する場合は、次のとおりです。postgres.sql上記は「pg_dumpのプレーンテキスト形式(デフォルト)」「pg_dumpall」で生成したバックアップファイルのみ利用することができます。それ以外の形式は「pg_restore」コマンドを利用します。バックアップファイル名pg_restoreの実際の使い方は以下のとおりです。postgres.customこれでバックアップファイルからリストアすることができました。cronで定期的にバックアップを取るでは、PostgreSQLのDBを、cronを使って定期的にバックアップする方法を見てみましょう。次のとおり準備していきます。バックアップ場所の作成(任意の場所でOK)バックアップ用シェルスクリプト(pg_backup.sh)の作成cronの設定バックアップ場所の作成バックアップファイルを配置するディレクトリを作成しましょう。どこでもOKですが、HTTPポートを開けている場合は、外部からアクセス出来ない場所(public外)に配置します。今回は「/var/backup/」ディレクトリを作成して、そちらに配置するようにしました。一緒に権限もつけておきます。/var/backup/これで、バックアップ用のディレクトリが作成されました。バックアップ用シェルスクリプトの作成PostgreSQLのDBをバックアップするシェルスクリプトを作成します。今回は、以下の内容の「pg_backup.sh」というファイルを、「/var/backup_sh/」に配置しました。\;一番最後の行で、PERIODに指定した日数分以外はバックアップファイルを削除する処理をしています。これで10日分のバックアップまでをサーバーに残すことができますね。作成したら、実行権限をつけて、試しに一度実行してみます。/var/backup_sh/pg_backup.shこれで、次のようにバックアップファイルが生成されていればOKです。/var/backup/postgres-20160719-175043.sqlcronで定期的にバックアップをおこなうでは、cronに「pg_backup.sh」を登録し、定期的にバックアップを取得するようにしましょう。-e」コマンドを使います。今回はpostgresユーザーで登録したいので「-u」オプションで指定します。postgres次のとおり「1分ごとにバックアップを実行する」ように記述して、きちんと動作するか確認してみます。2>&1保存したら、1分ごとに「/var/backup/」以下にバックアップファイルが存在するか確認してみましょう。テストが終わったら、次は「毎日4時11分にバックアップを実行する」ように変更してみます。2>&1」として何も出力しないようにしていますが、適宜ログファイルなどに結果を吐き出しておくとよいかと思います。「4時11分」と中途半端な時間にしているのは、別のcronで登録された処理と実行タイミングがかぶらないようにしているためです。ここらへんはお好みの時間でOKです。これで、PostgreSQLのDBをcronを使って定期的にバックアップすることができました。次のように直接実行してもOKです。/var/backup_sh/pg_backup.sh自分の好きなタイミングでバックアップをとりたい時は、上記のように直接スクリプトを実行できますね。まとめPostgreSQLでバックアップをおこなう方法と、cronを使った定期的なバックアップ方法を紹介しました。一度設定しておけば、今後PostgreSQLでのバックアップを気にしなくてよくなりますね。バックアップの実行結果などをメールやSlackなどに知らせるようにできれば、さらに便利に活用できるかと思います。時間があるとき記事にできればと思います。ヒトコトokutani_tこれで、万が一DBが壊れてしまった場合でも、バックアップファイルからDBを復帰することができます。AmazonのS3などに同期させておくとなお良しですね。Web開発のお仕事を募集していますフリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。(@okutani_t)1990年生。2016年8月にWebエンジニアとしてフリーランスに。プログラミング、カメラ、邦楽ロック、ハリネズミがすき。Portfolioをどうぞ。“たった1つ”の超シンプル禁煙方法。これで僕はノンスモーカーになれたiPhoneで「絶対に」やっとくべきキーボード設定3つ。超簡単だからみんなにやって欲しいよMacの容量を食ってる「その他」を調査してみたMacBookで複数モニターを使う方法。