PostgreSQLデータベースをバックアップおよび復元する方法


実稼働環境では、PostgreSQLデータベースがどれほど大きくても小さくても、定期的なバックはデータベース管理の重要な側面です。この記事では、PostgreSQLデータベースをバックアップおよび復元する方法を学習します。

PostgreSQLデータベースシステムがすでに正常にインストールされていることを前提としています。そうでない場合は、以下の記事を読んで、LinuxディストリビューションにPostgreSQLをインストールしてください。

始めましょう…

単一のPostgreSQLデータベースをバックアップする

PostgreSQLは、データベースのバックアップに役立つpg_dumpユーティリティを提供します。将来簡単に復元できる形式のSQLコマンドを含むデータベースファイルを生成します。

PostgreSQLデータベースをバックアップするには、まずデータベースサーバーにログインし、Postgresユーザーアカウントに切り替えて、次のようにpg_dumpを実行します( tecmintdb をバックアップするデータベースの名前に置き換えます) 。デフォルトでは、出力形式はプレーンテキストのSQLスクリプトファイルです。

$ pg_dump tecmintdb > tecmintdb.sql

pg_dumpは、他の出力形式もサポートします。 -F オプションを使用して出力形式を指定できます。ここで、 c はカスタム形式のアーカイブファイル、 d はディレクトリ形式のアーカイブ、 t は、tar形式のアーカイブファイルを意味します。すべての形式がpg_restoreへの入力に適しています。

例えば:

$ pg_dump -F c tecmintdb > tecmintdb.dump
OR
$ pg_dump -F t tecmintdb > tecmintdb.tar

出力をディレクトリ出力形式でダンプするには、 -f フラグ(出力ファイルの指定に使用)を使用して、ファイルではなくターゲットディレクトリを指定します。 pg_dumpによって作成されるディレクトリは存在してはなりません。

$ pg_dump -F d tecmintdb -f tecmintdumpdir	

すべてのPostgreSQLデータベースをバックアップするには、図のようにpg_dumpallツールを使用します。

$ pg_dumpall > all_pg_dbs.sql

図のように、psqlを使用してダンプを復元できます。

$ pgsql -f all_pg_dbs.sql postgres

PostgreSQLデータベースの復元

PostgreSQLデータベースを復元するには、psqlまたはpg_restoreユーティリティを使用できます。 psqlは、pg_dumpによって作成されたテキストファイルを復元するために使用されますが、pg_restoreは、pg_dumpによって非プレーンテキスト形式(カスタム、tar、またはディレクトリ)のいずれかで作成されたアーカイブからPostgreSQLデータベースを復元するために使用されます。

プレーンテキストファイルダンプを復元する方法の例を次に示します。

$ psql tecmintdb < tecmintdb.sql

上記のように、カスタム形式のダンプはpgsqlのスクリプトではないため、図のようにpg_restoreを使用して復元する必要があります。

$ pg_restore -d tecmintdb tecmintdb.dump
OR
$ pg_restore -d tecmintdb tecmintdb.tar
OR
$ pg_restore -d tecmintdb tecmintdumpdir	

大規模なPostgreSQLデータベースのバックアップ

バックアップしているデータベースが大きく、かなり小さい出力ファイルを生成したい場合は、gzipなどの圧縮ツールまたは任意の圧縮ツールを使用してpg_dumpの出力をフィルタリングする必要がある圧縮ダンプを実行できます。

$ pg_dump tecmintdb | gzip > tecmintdb.gz

データベースが非常に大きい場合は、次に示すように、 -j フラグを使用してnumber_of_jobsテーブルを同時にダンプすることにより、並行してダンプできます。

$ pg_dump -F d -j 5 -f tecmintdumpdir

並列ダンプオプションはダンプの時間を短縮しますが、一方で、データベースサーバーの負荷も増加させることに注意することが重要です。

リモートPostgreSQLデータベースのバックアップ

pg_dumpは通常のPostgreSQLクライアントツールであり、リモートデータベースサーバーでの操作をサポートします。 pg_dumpが接続するリモートデータベースサーバーを指定するには、コマンドラインオプション -h を使用してリモートホストを指定し、 -p を使用してデータベースサーバーがリッスンしているリモートポートを指定します。さらに、 -U フラグを使用して、接続するデータベースロール名を指定します。

10.10.20.10と5432、およびtecmintdbを、それぞれリモートホストのIPアドレスまたはホスト名、データベースポート、およびデータベース名に置き換えることを忘れないでください。

$ pg_dump -U tecmint -h 10.10.20.10 -p 5432 tecmintdb > tecmintdb.sql

リモートで接続しているユーザーがデータベースにアクセスするために必要な特権を持っていること、および適切なデータベース認証方法がデータベースサーバーで構成されていることを確認してください。構成されていない場合、次のスクリーンショットに示すようなエラーが発生します。

図のように、データベースをあるサーバーから別のサーバーに直接ダンプし、pg_dumpおよびpsqlユーティリティを使用することもできます。

$ pg_dump -U tecmint -h 10.10.20.10 tecmintdb | pqsl -U tecmint -h 10.10.20.30 tecmintdb

cronジョブを使用したPostgreSQLデータベースの自動バックアップ

cronジョブを使用して、定期的にバックアップを実行できます。 cronジョブは、サーバー上で実行するさまざまな種類のタスクをスケジュールするために一般的に使用される手段です。

次のように、PostgreSQLデータベースのバックアップを自動化するようにcronジョブを構成できます。 PostgreSQLスーパーユーザーとして次のコマンドを実行する必要があることに注意してください。

$ mkdir -p /srv/backups/databases

次に、次のコマンドを実行してcrontabを編集し、新しいcronジョブを追加します。

$ crontab -e

crontabの最後に次の行をコピーして貼り付けます。上記で説明した任意のダンプ形式を使用できます。

0 0 * * *  pg_dump  -U postgres tecmintdb > /srv/backups/postgres/tecmintdb.sql

ファイルを保存して終了します。

cronサービスは、再起動せずにこの新しいジョブの実行を自動的に開始します。そして、このcronジョブは毎日深夜に実行されます。これはバックアップタスクの最小限のソリューションです。

cronジョブをスケジュールする方法の詳細については、「Linuxでcronジョブを作成および管理する方法」を参照してください。

今のところ以上です!データのバックアップをデータベース管理ルーチンの一部にすることをお勧めします。ご質問やご意見がございましたら、以下のフィードバックフォームをご利用ください。詳細については、pg_dumpおよびpg_restoreのリファレンスページを参照してください。