【入門編】pgAdmin 4のバックアップ(Backup/Restore)機能で絶対に知っておくべき失敗しない設定値とリストア手順 – データベース・API管理活用バイブル

こんにちは!データベースの海原を航海するエンジニアの皆さん、日々の開発や運用お疲れ様です。

データベースを扱う上で、最も恐ろしい瞬間っていつですか?そう、「やっちまった!」と誤ってデータを消してしまったり、本番環境のマイグレーションで盛大にコケたりした瞬間ですよね。そんな時の唯一にして最大の救世主が「バックアップとリストア」です。

今回は、PostgreSQLの公式管理GUIである「pgAdmin 4」を使った、絶対に失敗しないバックアップ・リストアの極意を伝授します。「ボタンをポチポチ押すだけなのに、なぜかエラーが出る」「巨大なDBを戻そうとしたらフリーズした」——そんな現場の悲鳴を今日で終わらせましょう。これをマスターすれば、毎日の作業が劇的に楽になりますよ!

—

1. なぜ「pgAdmin 4のバックアップ」でハマるのか?

PostgreSQLのバックアップツール(内部的には `pg_dump` や `pg_restore` が動いています)は非常に強力ですが、GUIであるpgAdmin 4経由で実行すると、「裏側で何が起きているか見えにくい」という罠があります。

特に初心者が陥りがちなのが以下の3点です。
1. フォーマット選びのミス(テキストで出してしまい、リストア時に死ぬ)
2. タイムアウトとフリーズ(大容量DBでプログレスバーが止まり、焦って強制終了してDBを破壊する)
3. パスの通っていないバイナリ問題(pgAdminが `pg_dump` の場所を見失っている)

まずは、この泥沼にハマらないための基礎知識と、絶対に選ぶべき「黄金の設定」を見ていきましょう。

—

2. 失敗しないバックアップの作法(Backup設定の極意)

pgAdminのオブジェクトツリーからデータベースを右クリックし、「Backup…」を選択したときに表示されるダイアログ。ここが勝負の分かれ目です。

① 「Format(フォーマット)」は必ず【Custom】か【Directory】を選べ!

ここが一番重要です。フォーマットにはいくつか種類がありますが、実務で使うべきは実質2択です。

  • Plain(プレーンテキスト)
  • 特徴: SQL文がそのまま出力されます。テキストエディタで中身を見られますが、pgAdminのGUIからのリストア(Restore)では使えません。(`psql` コマンドで流し込む必要があるため初心者非推奨)
  • Custom(カスタム) 👑 【これ一択!】
  • 特徴: 圧縮され、メタデータが綺麗に整理されます。最大のメリットは、「リストア時にテーブルの並び順を自動調整してくれる(依存関係を勝手に解決してくれる)」こと。
  • Directory(ディレクトリ)
  • 特徴: ファイルを分割して出力します。超大容量(数十GB以上)のデータベースの場合、並列処理(Parallel jobs)が使えるため、これ一択になります。

② 「Dump options」タブでの安全策

バックアップのオプション設定では、以下のチェックを意識してください。

  • Type of objects: 基本は「All(すべて)」でOKですが、データなしでスキーマ(テーブル定義)だけ欲しい場合は「Only schema」を選びます。
  • Do not save: 「Owner」や「Privileges(権限)」は、移行先の環境が違う場合にエラーの原因になることがあります。開発環境から別環境への移行テストの時は、ここをあえて外す(出力させない)テクニックも有効です。

—

3. 大容量DBでフリーズ?タイムアウト・パフォーマンス対策

「よし、バックアップを開始した!」……しかし、数ギガバイトを超えたあたりでプログレスバーがピタリと止まり、数時間放置しても終わらない。挙句の果てにエラー……。

これ、現場で本当によくある事故です。原因の多くはネットワークのタイムアウトやメモリ不足、そしてpgAdmin自体の通信断です。

対策1: 大規模データは「Directory形式 + Parallel jobs」で攻める!

Backupダイアログの「General」タブにある 「Number of jobs(ジョブ数)」 を変更していますか?
デフォルトは `1`(シングルスレッド)ですが、ここを `4` や `8` に設定してください(※Directory形式のみ有効)。複数のCPUコアを使って並列でデータを抜き出すため、体感スピードが文字通り数倍になります。

対策2: ブラウザ版ではなくデスクトップ版を使う、またはタイムアウトを延ばす

pgAdmin 4をブラウザ(Webサーバーモード)で動かしている場合、NginxやApache、あるいはブラウザ自体のタイムアウト(通常30秒〜数分)によって通信が切断されることがあります。バックアップ処理自体はPostgreSQLのサーバー側で動き続けていても、画面側がフリーズしたように見えます。
安定させたいなら、OSにインストールするデスクトップ版のpgAdmin 4を使用するか、設定ファイル(`config.py`)の `TIMEOUT` 関連のパラメータを調整しましょう。

—

4. リストア(Restore)の正しい手順と「上書きの恐怖」を避けるコツ

バックアップが取れたら、次はリストア(復元)です。リストアはバックアップよりもデリケートです。「既存のデータを全部吹き飛ばしてしまった」という大事故を起こさないために、以下の手順を体に叩き込んでください。

ステップ1: 移行先のデータベースを「空」で作成しておく

いきなり既存のデータベースに対してリストアをかけるのは危険です。
まずは新規に空のデータベース(例: `my_database_restore_test`)を作成し、そこにリストアしてテストするのがプロのやり方です。

ステップ2: Restoreダイアログの設定

空のデータベースを右クリック > 「Restore…」 を選択します。

1. Filename: バックアップしたファイル(.backup やディレクトリ)を指定します。
2. Format: バックアップ時に選んだ形式(Customなど)を合わせます。
3. プレーフ・クリア(Clean before restore) の罠:

  • オプションタブに「Clean before restore(リストア前にオブジェクトを削除する)」という強力なチェックがあります。これを入れると、既存の同名テーブルを `DROP` してから作り直します。既存データがある本番環境でこれを誤って爆発させないよう、細心の注意を払ってください。

—

5. 【重要】ジョブがフリーズした、終わらない時の「強制終了」の極意

もし、バックアップやリストアのジョブが完全にフリーズし、pgAdminの画面上からキャンセルできなくなった時はどうすればいいでしょうか?

焦ってpgAdminを強制終了してはいけません。PostgreSQLのサーバー側で、まだそのプロセス(プロセスID: PID)が動き続けている可能性があります。

1. 実行中のプロセスを確認する

PostgreSQLに接続し、以下のSQLを叩いて現在動いているダンプ/リストアのプロセスを確認します。

SELECT
pid,
usename,
application_name,
client_addr,
backend_start,
query
FROM
pg_stat_activity
WHERE
query ILIKE ‘%pg_dump%’ OR query ILIKE ‘%pg_restore%’;

2. プロセスを安全に停止する(Kill)

該当するプロセスの `pid` が分かったら、以下のコマンドで強制停止させます。

— pid が 12345 だとした場合
SELECT pg_cancel_backend(12345); — 優しく止める
— それでもダメな場合
SELECT pg_terminate_backend(12345); — 強制終了する

これでデータベース側のロックが解放され、システムを正常な状態に戻すことができます。

—

まとめ:怖がらなくて大丈夫、検証を習慣化しよう

いかがでしたか?
pgAdmin 4でのバックアップ・リストアは、一見するとただのGUI操作ですが、裏側のメカニズム(カスタムフォーマットの利点、並列処理、プロセスの制御)を知ることで、トラブルを未然に防ぐことができます。

  • バックアップは「Custom」か「Directory」形式で!
  • 大容量データは「Parallel jobs」で高速化!
  • リストアは必ず「新規DB」を作ってテストしてから!

「バックアップは、リストアできて初めて成功と言える」というエンジニアの格言があります。動くことが確認できたバックアップデータこそが、私たちエンジニアにとって最大の心の支えです。

ぜひ、今日の開発環境から試してみてくださいね。あなたのデータベースライフが、安全で快適なものになりますように!

タイトルとURLをコピーしました