データベース管理者としてバックアップを作成したら、いよいよ本番の瞬間、つまりデータのリストアがやってくるよ。そしてここで主役になるのがpg_restoreコマンド。もしpg_dumpがバックアップ作成のスーパーヒーローなら、pg_restoreはその相棒で、作成したバックアップからデータを蘇らせてくれるんだ。
pg_restoreは、pg_dumpでバイナリ形式(customやdirectory)で作成したファイルからデータをリストアするために使うよ。もし何らかの理由でデータベースが壊れた場合や、新しいサーバーにデータを移したい場合、このツールはめっちゃ頼りになる相棒になる。
なんでpg_restoreが必要なのか:
- データベース全体だけじゃなく、スキーマやテーブル、データなど個別のコンポーネントもリストアできる。
- リストアのプロセスを細かくコントロールしたい複雑なシナリオでも使える強力なツールだよ。
基本コマンドのシンタックス
pg_restoreの使い方は、まず基本のコマンドシンタックスから始まるよ:
pg_restore -U username -d database_name backup_file.dump
コマンドのパラメータ:
-U username: PostgreSQLに接続するユーザー名を指定する。-d database_name: データをリストアするデータベース名。backup_file.dump: 以前pg_dumpでcustomやdirectory形式で作成したバックアップファイル。
例えば、postgresユーザーでbackup.dumpファイルからuniversityデータベースをリストアしたい場合、コマンドはこんな感じ:
pg_restore -U postgres -d university backup.dump
このコマンドを実行すると、pg_restoreがリストア処理を始めて、データベースにデータを戻してくれるよ!
バックアップの種類と互換性
すべてのバックアップが同じってわけじゃない。pg_dumpでバックアップを作るとき、いろんな形式を指定できたのを覚えてる?その中にはpg_restoreで使えるものと、使えないものがあるんだ。
| バックアップ形式 | 説明 | pg_restoreでサポート |
|---|---|---|
plain(テキスト) |
リストア用のSQLスクリプト。 | ❌ いいえ |
custom |
PostgreSQL独自の圧縮バックアップ。 | ✅ はい |
directory |
複数ファイルのディレクトリ形式バックアップ。 | ✅ はい |
tar |
TAR形式のアーカイブ。 | ✅ はい |
テキスト形式(plain)のバックアップにはpg_restoreは使えないから注意してね。こういうファイルはpsqlコマンドで手動リストアする必要がある。例えば:
psql -U username -d database_name -f backup.sql
pg_restoreの柔軟性:リストアパラメータ
pg_restoreが人気な理由のひとつは、その柔軟性。データベース全体だけじゃなく、部分的なリストアもできるんだ。
データ構造だけをリストアする。 もしテーブルスキーマやインデックス、トリガーなど、データベースの構造だけをリストアしたい場合は、--schema-onlyフラグを使おう:
pg_restore -U postgres -d university --schema-only backup.dump
これは、データベースの構造を分析したいときや、「空」のコピーを作りたいときに便利だよ。
データだけをリストアする。 構造じゃなくてデータだけが欲しい場合は、--data-onlyパラメータを使おう:
pg_restore -U postgres -d university --data-only backup.dump
このやり方は、すでに構造があるけどテーブルの中身だけ戻したいときに役立つよ。
リストア前にクリーンアップ。 テーブルやスキーマがすでに存在している場合、リストア前に削除したいなら--cleanフラグを使おう:
pg_restore -U postgres -d university --clean backup.dump
このパラメータを使うと、pg_restoreはまず既存のオブジェクトを削除してから、バックアップからデータをリストアするよ。
オブジェクトのフィルタリング。 pg_restoreは、バックアップからどのオブジェクトをリストアするか選べる。--tableフラグを使うんだ:
pg_restore -U postgres -d university --table=students backup.dump
この例だと、studentsテーブルだけをリストアするよ。
SQLをコンソールに出力する
リストア時に何が実行されるか確認したいけど、すぐにデータベースを変更したくない場合は、--listフラグを使おう:
pg_restore -l backup.dump
さらに、実行されるSQLコマンドをテキストで見たいなら、--verboseを追加しよう:
pg_restore -U postgres --verbose --schema-only backup.dump
リストアの例
- データベース全体のリストア
一番よくあるパターン:バックアップからデータベース全体をリストアしたい場合:
pg_restore -U postgres -d university backup.dump
- 特定のテーブルのリストア
例えば、coursesテーブルだけデータが消えた場合、そのテーブルだけリストアできる:
pg_restore -U postgres -d university --table=courses backup.dump
- データベーススキーマのリストア
テーブルの構造だけ(データなし)をリストアしたい場合:
pg_restore -U postgres -d university --schema-only backup.dump
- オブジェクトを再作成しながらリストア
既存データを上書きしたい場合:
pg_restore -U postgres -d university --clean backup.dump
リストア時によくあるエラーとその対策
バージョンの非互換。 もし違うバージョンのPostgreSQLでバックアップを作成して、別の(特に古い)バージョンでリストアしようとすると、互換性エラーが出ることがある。対策:バックアップ作成とリストアで同じバージョンのPostgreSQLを使うようにしよう。
「Role does not exist」エラー。 バックアップに存在するロール(ユーザー)がリストア先サーバーにない場合、このエラーが出る。対策:事前に必要なロールを新しいサーバーで作成しておこう。
「Table already exists」エラー。 すでに存在するテーブルをリストアしようとするとこのエラーが出る。
--cleanを使ってコンフリクトを避けよう。
GO TO FULL VERSION