CodeGym /コース /SQL SELF /pg_restoreでデータをリストアする

pg_restoreでデータをリストアする

SQL SELF
レベル 43 , レッスン 3
使用可能

データベース管理者としてバックアップを作成したら、いよいよ本番の瞬間、つまりデータのリストアがやってくるよ。そしてここで主役になるのがpg_restoreコマンド。もしpg_dumpがバックアップ作成のスーパーヒーローなら、pg_restoreはその相棒で、作成したバックアップからデータを蘇らせてくれるんだ。

pg_restoreは、pg_dumpでバイナリ形式(customdirectory)で作成したファイルからデータをリストアするために使うよ。もし何らかの理由でデータベースが壊れた場合や、新しいサーバーにデータを移したい場合、このツールはめっちゃ頼りになる相棒になる。

なんでpg_restoreが必要なのか:

  • データベース全体だけじゃなく、スキーマやテーブル、データなど個別のコンポーネントもリストアできる。
  • リストアのプロセスを細かくコントロールしたい複雑なシナリオでも使える強力なツールだよ。

基本コマンドのシンタックス

pg_restoreの使い方は、まず基本のコマンドシンタックスから始まるよ:

pg_restore -U username -d database_name backup_file.dump

コマンドのパラメータ:

  • -U username: PostgreSQLに接続するユーザー名を指定する。
  • -d database_name: データをリストアするデータベース名。
  • backup_file.dump: 以前pg_dumpcustomdirectory形式で作成したバックアップファイル。

例えば、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

リストアの例

  1. データベース全体のリストア

一番よくあるパターン:バックアップからデータベース全体をリストアしたい場合:

pg_restore -U postgres -d university backup.dump
  1. 特定のテーブルのリストア

例えば、coursesテーブルだけデータが消えた場合、そのテーブルだけリストアできる:

pg_restore -U postgres -d university --table=courses backup.dump
  1. データベーススキーマのリストア

テーブルの構造だけ(データなし)をリストアしたい場合:

pg_restore -U postgres -d university --schema-only backup.dump
  1. オブジェクトを再作成しながらリストア

既存データを上書きしたい場合:

pg_restore -U postgres -d university --clean backup.dump

リストア時によくあるエラーとその対策

  • バージョンの非互換。 もし違うバージョンのPostgreSQLでバックアップを作成して、別の(特に古い)バージョンでリストアしようとすると、互換性エラーが出ることがある。対策:バックアップ作成とリストアで同じバージョンのPostgreSQLを使うようにしよう。

  • 「Role does not exist」エラー。 バックアップに存在するロール(ユーザー)がリストア先サーバーにない場合、このエラーが出る。対策:事前に必要なロールを新しいサーバーで作成しておこう。

  • 「Table already exists」エラー。 すでに存在するテーブルをリストアしようとするとこのエラーが出る。--cleanを使ってコンフリクトを避けよう。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION