pg_dumpとpg_restoreを使用したデータベースのバックアップと復元方法
データベース管理の世界では、堅牢なバックアップと復元戦略は推奨されるだけでなく、絶対に不可欠です。データの損失は、ハードウェア障害、人的ミス、悪意のある攻撃など、さまざまな原因から生じる可能性があります。強力なオープンソースのリレーショナルデータベースであるPostgreSQLは、データの整合性と回復性を確保するために、不可欠なコマンドラインユーティリティであるpg_dumpとpg_restoreを提供します。本チュートリアルでは、これらのツールを利用して信頼性の高いバックアップを作成し、PostgreSQLデータベースの安全なリストアを実行するためのベストプラクティスを解説します。
これらのユーティリティを理解することは、データ保護を担当するすべてのPostgreSQL管理者や開発者にとって基礎となります。pg_dumpは、PostgreSQLデータベースをスクリプトファイルまたはその他のアーカイブファイルにエクスポートするために使用され、pg_restoreはそのようなファイルを解釈してデータベースを再構築できます。これらを習得することで、貴重な情報を保護し、ビジネスの継続性を維持することが可能になります。
pg_dumpの理解
pg_dumpは、PostgreSQLデータベースのバックアップを作成するためのユーティリティです。データベースオブジェクト(テーブル、関数、インデックスなど)を再作成し、データを投入するために使用できるSQLコマンドを含むファイルを生成します。pg_dumpはデータベースに接続し、その後出力を生成することで機能します。それぞれに利点があるいくつかの形式で出力できます。
出力形式
pg_dumpは複数の出力形式をサポートしています。
- プレーンテキストSQLスクリプト(
-Fpまたはデフォルト): これは最も単純な形式です。一連のSQLコマンドを含むファイルが出力されます。この形式は人間が読め、スクリプト化しやすいですが、非常に大きなデータベースの場合、サイズが大きくなり、リストアに時間がかかることがあります。 - カスタムアーカイブ(
-Fc): この形式は、圧縮されたカスタムアーカイブファイルを作成します。デフォルトで圧縮され、並列リストア(pg_restore)をサポートし、一般的に柔軟性が高いため、バックアップとして推奨される形式です。 - ディレクトリ形式(
-Fd): これは、テーブルごとおよびその他のオブジェクトごとに1つのファイルを含むディレクトリを作成します。これも並列リストアをサポートしており、非常に大きなデータベースに役立ちます。 - Tar形式(
-Ft): これはtarアーカイブを作成します。ディレクトリ形式に似ていますが、単一のファイルです。tarアーカイブを処理する他のツールとの互換性に役立ちます。
一般的なpg_dumpオプション
pg_dumpで最も頻繁に使用されるオプションをいくつか示します。
-h <hostname>: サーバーが稼働しているマシンのホスト名を指定します。-p <port>: サーバーが接続をリッスンしているTCPポートを指定します。-U <username>: 指定されたユーザーとして接続します。-W: 接続前にパスワードを求めるようにpg_dumpに強制します。-f <filename>: 出力ファイル名を指定します。省略した場合、pg_dumpは標準出力に書き込みます。-F <format>: 出力ファイル形式(p、c、d、t)を指定します。-Z <0-9>: 圧縮形式(例:Fc)の圧縮レベルを指定します。--exclude-table=<table_name>: 指定されたテーブルをダンプから除外します。--jobs=<number>: ダンプ時に使用する並列ジョブの数(ディレクトリ形式の場合のみ)。--clean: オブジェクトを作成する前にデータベースオブジェクトをドロップするコマンドを含めます。これは、クリーンな状態を保証するために完全リストアに役立ちます。--create: データベース自体を作成するコマンドを含めます。新しいサーバーにリストアする際に役立ちます。
例: 基本的なプレーンテキストバックアップ
mydatabaseという名前のデータベースをmyuserというユーザーで所有し、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のパスワード入力を求めます。
例: カスタム形式のバックアップ(推奨)
柔軟性と圧縮性の観点から、カスタムアーカイブ形式の使用が一般的に好まれます。mydatabaseの圧縮されたカスタムバックアップを作成するには、以下を実行します。
pg_dump -U myuser -Fc -f mydatabase_backup.dump mydatabase
これにより、mydatabase_backup.dumpという名前のファイルが作成され、圧縮され、pg_restoreに適した形式になります。
例: 並列ジョブを使用したディレクトリ形式のバックアップ
非常に大きなデータベースの場合、並列ダンプはバックアッププロセスを大幅に高速化できます。これにはディレクトリ形式が必要です。
pg_dump -U myuser -Fd -j 4 -f mydatabase_backup_dir mydatabase
このコマンドは、4つの並列ジョブを利用して、複数のファイルを含むmydatabase_backup_dirという名前のディレクトリを作成します。
pg_restoreの理解
pg_restoreは、pg_dumpによってカスタム、ディレクトリ、またはtar形式のいずれかで作成されたアーカイブからPostgreSQLデータベースを復元するためのユーティリティです。プレーンテキストSQLダンプ(これらはpsqlコマンドを使用してリストアされます)には使用されません。
一般的なpg_restoreオプション
-h <hostname>: サーバーが稼働しているマシンのホスト名を指定します。-p <port>: サーバーが接続をリッスンしているTCPポートを指定します。-U <username>: 指定されたユーザーとして接続します。-W: 接続前にパスワードを求めるようにpg_restoreに強制します。-d <database>: リストア先のデータベース名を指定します。これは必須です。-v: 詳細モード。-cまたは--clean: 再作成する前にデータベースオブジェクトをクリーンアップ(ドロップ)します。--create: リストア対象のデータベースを作成する前に作成します。初期接続時には別のデータベース(例:postgres)に接続する必要があります。-j <number>: リストアに使用する並列ジョブの数。特にカスタム形式とディレクトリ形式の場合、これによりリストアが大幅に高速化されます。-F <format>: アーカイブ形式(c、d、t)を指定します。通常、pg_restoreはこれを自動検出できます。
プレーンテキストSQLバックアップからのリストア
pg_dumpを使用してプレーンテキストSQLバックアップ(例: mydatabase_backup.sql)を作成した場合、psqlを使用してリストアします。
psql -U myuser -d mydatabase -f mydatabase_backup.sql
バックアップファイルにCREATE DATABASEや\connectコマンドが含まれている場合、別のデータベース(postgresなど)に接続し、-d mydatabase引数を省略する必要がある場合があります。
psql -U myuser -f mydatabase_backup.sql postgres
例: カスタム形式のバックアップからのリストア
カスタム形式のバックアップmydatabase_backup.dumpをrestored_dbという名前のデータベースにリストアするには、以下を実行します。
pg_restore -U myuser -d restored_db mydatabase_backup.dump
ターゲットデータベースrestored_dbが存在しない場合は、--createオプションを使用できます。この場合、ターゲットデータベースが作成されるため、別のデータベース(postgresなど)に接続する必要があります。
pg_restore -U myuser --create -d restored_db mydatabase_backup.dump
このコマンドはrestored_dbデータベースを作成し、その後データをリストアします。
例: 並列リストア
特に大規模なデータセットのリストアを高速化するには、-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(Linux/macOS)またはタスクスケジューラ(Windows)を使用してバックアップを自動化し、定期的な間隔(例: 毎日、毎時)で実行します。 - 適切な形式の選択: ほとんどのユースケースでは、圧縮と
pg_restoreの並列機能との互換性があるため、カスタム形式(-Fc)が推奨されます。並列ダンプ/リストアが不可欠な超大規模データベースには、ディレクトリ形式(-Fd)を使用します。 - バックアップのテスト: バックアップはリストアできる場合にのみ有用です。ステージング環境や開発環境にリストアすることで、リストアプロセスを定期的にテストし、データの整合性とバックアップファイルの有効性を確認してください。
- オフサイトでのバックアップ保存: サイト全体の災害から保護するために、プライマリデータベースサーバーとは別の物理的な場所にバックアップのコピーを保管してください。
- バックアップジョブの監視: スケジュールされたバックアップジョブが正常に実行されていることを確認し、失敗した場合はアラートが届くように監視を実装します。
- 圧縮の検討: 自動的に圧縮されない形式を使用しない場合は、
pg_dumpの圧縮オプションを使用するか、出力を外部圧縮ツール(gzip、zstd)にパイプします。 --cleanと--createの賢明な使用: 既存の環境への完全リストアを実行する場合、--cleanは非常に役立ちます。新しい環境への移行や完全にクリーンな状態の保証には、--createが不可欠です。本番環境ではこれらのオプションの使用には注意してください。- バックアップのバージョン管理: バックアップの保持期間(古いバックアップをどれくらいの期間保持し、パージするか)を含む、バックアップ管理戦略を実装します。
結論
pg_dumpとpg_restoreは、PostgreSQLデータを保護するための不可欠なツールです。それらのさまざまなオプション、出力形式を理解し、定期的なテストを含む一貫したバックアップおよびリストア戦略を実装することにより、データ損失のリスクを大幅に軽減し、データベースシステムの回復力を確保することができます。これらのユーティリティをデータベース管理の基礎として活用してください。