pg_dumpとpg_restoreを使用したデータベースのバックアップとリストアの方法

pg_dumpとpg_restoreを用いたこの包括的なガイドで、PostgreSQLのデータ保護を習得しましょう。プレーンテキスト、カスタム、ディレクトリ形式など、さまざまな形式を使用して信頼性の高いデータベースバックアップを作成する方法を学びます。効率的なダンプのための重要なオプションを発見し、データをリストアするためのステップバイステップの手順を探ります。このチュートリアルでは、データの整合性と回復能力を確保するために、PostgreSQLバックアップのスケジューリング、テスト、安全な管理に関するベストプラクティスを網羅しています。

pg_dumpとpg_restoreを使用したデータベースのバックアップと復元方法

復元可能なPostgreSQLバックアップが必要です。単にバックアップのように見えるファイルだけでは不十分です。pg_dumppg_restoreは論理バックアップの標準ツールです。これらはデータベースオブジェクトとデータを移植可能なダンプにコピーし、後で同じサーバー、テストサーバー、または新しいPostgreSQLインスタンスで再構築します。

このガイドでは、単一データベースの論理バックアップに焦点を当てています。クラスター全体の災害復旧、ポイントインタイムリカバリ、または非常に大規模なインストールの場合は、これを物理バックアップおよびWALアーカイブと組み合わせて使用してください。

pg_dumpについて

pg_dumpは1つのデータベースに接続し、そのスキーマとデータをエクスポートします。ロール、テーブルスペース、またはグローバルクラスターオブジェクトはダンプしません。これらが必要な場合は、pg_dumpall --globals-onlyを使用してください。

出力形式

pg_dumpは複数の出力形式をサポートしています。

  • プレーンテキスト(-Fp、デフォルト): psqlで復元するSQLを書き込みます。検査や編集は簡単ですが、大規模な復元は遅くなり、柔軟性に欠ける場合があります。
  • カスタムアーカイブ(-Fc): pg_restore用の圧縮アーカイブを書き込みます。選択的復元とパラレル復元をサポートします。
  • ディレクトリ形式(-Fd): ファイルのディレクトリを書き込みます。パラレルダンプとパラレル復元をサポートし、大規模なデータベースに役立ちます。
  • Tar形式(-Ft): pg_restore用のtarアーカイブを書き込みます。単一ファイルですが、カスタムアーカイブと同じように形式内で圧縮をサポートしているわけではありません。

一般的なpg_dumpオプション

pg_dumpで最も頻繁に使用されるオプションの一部を以下に示します。

  • -h <ホスト名>:ホストに接続します。
  • -p <ポート>:ポートに接続します。
  • -U <ユーザー名>:ユーザーとして接続します。
  • -W:接続前にパスワード入力を強制します。
  • -f <ファイル名>:標準出力ではなく、ファイルまたはディレクトリに書き込みます。
  • -F <形式>pcd、またはtを選択します。
  • -Z <レベル>:圧縮をサポートする形式の圧縮レベルを設定します。
  • --exclude-table=<パターン>:一致するテーブルを除外します。
  • -j <数> または --jobs=<数>:ディレクトリ形式でダンプするときに並列ジョブを使用します。
  • --clean:プレーンSQL出力にCREATEコマンドの前にDROPコマンドを含めます。
  • --create:データベース自体を作成するコマンドを含めます。

例:基本的なプレーンテキストバックアップ

ユーザーmyuserが所有するmydatabaseという名前のデータベースのプレーンテキストバックアップを作成し、mydatabase_backup.sqlに保存するには:

pg_dump -U myuser -f mydatabase_backup.sql mydatabase

ホストとポートを指定する必要がある場合:

pg_dump -h localhost -p 5432 -U myuser -f mydatabase_backup.sql mydatabase

認証方法によっては、myuserのパスワードが求められる場合があります。

例:カスタム形式バックアップ(推奨)

カスタム形式は、pg_restoreで動作し、選択的復元をサポートするため、多くの本番環境バックアップに適したデフォルトです。

pg_dump -U myuser -Fc -f mydatabase_backup.dump mydatabase

これにより、pg_restoreに適した形式でmydatabase_backup.dumpが作成されます。

例:並列ジョブを使用したディレクトリ形式バックアップ

大規模なデータベースの場合、並列ダンプによりバックアップ時間を短縮できます。ディレクトリ形式が必要です:

pg_dump -U myuser -Fd -j 4 -f mydatabase_backup_dir mydatabase

このコマンドは、4つの並列ジョブを利用して、複数のファイルを含むmydatabase_backup_dirという名前のディレクトリを作成します。

pg_restoreについて

pg_restoreは、pg_dumpで作成されたカスタム、ディレクトリ、またはtarアーカイブを復元します。プレーンSQLファイルはpg_restoreではなくpsqlで復元します。

一般的なpg_restoreオプション

  • -h <ホスト名>:ホストに接続します。
  • -p <ポート>:ポートに接続します。
  • -U <ユーザー名>:ユーザーとして接続します。
  • -W:接続前にパスワード入力を強制します。
  • -d <データベース>:復元のためにこのデータベースに接続します。
  • -v:詳細な復元出力を表示します。
  • -c または --clean:データベースオブジェクトを再作成する前に削除します。
  • --create:復元する前にダンプされたデータベースを作成します。既存のメンテナンスデータベース(通常はpostgres)に-dで接続します。
  • -j <数>:サポートされている場合、復元に並列ジョブを使用します。
  • -F <形式>:自動検出で不十分な場合にアーカイブ形式を指定します。

プレーンテキストSQLバックアップからの復元

pg_dump(例:mydatabase_backup.sql)を使用してプレーンテキストSQLバックアップを作成した場合は、psqlを使用して復元します:

psql -U myuser -d mydatabase -f mydatabase_backup.sql

バックアップファイルにpg_dump --createからのCREATE DATABASEおよび\connectコマンドが含まれている場合は、postgresなどのメンテナンスデータベースに接続します:

psql -U myuser -f mydatabase_backup.sql postgres

例:カスタム形式バックアップからの復元

カスタム形式バックアップmydatabase_backup.dumprestored_dbという名前のデータベースに復元するには:

pg_restore -U myuser -d restored_db mydatabase_backup.dump

アーカイブがpg_dump --createで作成された場合は、pg_restoreにダンプされたデータベースを作成するように指示できます。-dの値は、作成される新しいデータベースではなく、初期接続に使用される既存のデータベースである必要があります:

pg_restore -U myuser --create -d postgres mydatabase_backup.dump

これにより、ダンプ内の名前のデータベースが作成され、その中に復元されます。異なる名前のデータベースに復元する場合は、最初にそのデータベースを作成し、--createなしで復元します:

createdb -U myuser restored_db
pg_restore -U myuser -d restored_db mydatabase_backup.dump

例:パラレル復元

特に大規模なデータセットの場合、高速な復元のために-jオプションを使用します:

pg_restore -U myuser -d restored_db -j 4 mydatabase_backup.dump

これにより、4つのワーカージョブで復元されます。パラレル復元は、ダンプにロードおよびインデックスを作成する独立したオブジェクトが複数ある場合に最も役立ちます。

例:ディレクトリ形式バックアップからの復元

ディレクトリ形式(例:mydatabase_backup_dir)で作成されたバックアップを復元するには:

pg_restore -U myuser -d restored_db -j 4 mydatabase_backup_dir

最後の引数がディレクトリパスであることに注意してください。

バックアップのベストプラクティス

  • バックアップをスケジュールする: cron、systemdタイマー、またはオーケストレーションプラットフォームを使用します。失っても構わないデータ量に基づいてスケジュールを選択します。
  • 適切な形式を使用する: カスタム形式は強力なデフォルトです。大規模なデータベースに並列ダンプが必要な場合は、ディレクトリ形式の方が適しています。
  • 復元をテストする: 定期的にステージングデータベースに復元します。テストしないバックアップは単なる推測に過ぎません。
  • グローバルオブジェクトをキャプチャする: サーバーを最初から再構築する場合は、pg_dumpall --globals-onlyでロールとテーブルスペースを個別にダンプします。
  • コピーをオフサイトに保存する: バックアップをプライマリサーバーから離れた場所に保管し、暗号化とアクセス制御で保護します。
  • ジョブを監視する: 失敗したダンプ、異常に小さいバックアップファイル、古いバックアップタイムスタンプについてアラートを出します。
  • 保持期間を計画する: 保持する時間単位、日単位、週単位、月単位のバックアップの数を決定し、クリーンアップを自動化します。
  • --cleanには注意する:** ターゲットデータベースのオブジェクトを削除します。既存のオブジェクトを置き換える場合にのみ使用してください。

まとめ

柔軟な単一ファイルバックアップにはpg_dump -Fc、並列ダンプが必要な場合はpg_dump -Fd -j、プレーンSQL復元にはpsql、アーカイブ復元にはpg_restoreを使用します。そして、緊急時に必要になる前に、テストデータベースに復元してプロセスを証明してください。