[PostgreSQL]バックアップ(pg_dump)とリストア(pg_restore)の実行方法

データベースを指定してバックアップ

データベースのバックアップにはpg_dump.exeコマンドを使用します。
PostgreSQLサーバーをインストールしている場合は、pg_dump.exeにパスが通っているのでフルパス指定をしなくてもコマンドを実行できますが、パスが通っていない場合はパスを通すかフルパスでコマンド指定してください。

コマンド形式

-- 一般的なデータベースバックアップコマンドとそのオプション

pg_dump -U ユーザー名 -d データベース名 > バックアップファイル名

バックアップファイル名は「”」(ダブルクオーテーション)で囲って指定することも可
ユーザー名は指定しなくてもよいが指定していない場合はOSにログインしているユーザ名でのログインで実行されるので基本的には指定しておいたほうがいいです。

オプション

-Fpplain(SQL)形式(デフォルト)SQL文で出力されたプレーンテキスト形式
-Fcカスタム形式圧縮ファイル形式
-Fttar形式tar圧縮ファイル形式

コマンド実行例

> pg_dump -U postgres -d sample_db > backup_file.txt

エラー等のメッセージが表示されることなくコマンドプロンプトが入力可能状態になればバックアップ完了です。
エラーが出た場合は何かしらコマンド内容が間違っているので入力したコマンドを見直してみましょう。

また、コマンド実行後下記のようにコマンドプロンプトに表示されてファイルが作成されないもしくはファイルが作成されても0Kbyteでデータが作成された場合はPostgreSQLのログを確認してみてください。

-- 失敗した際の不明メッセージ例

> pg_dump: [アーカイバ(db)]

データベース全体をバックアップ

データベース全体のバックアップにはpg_dumpall.exeコマンドを使用します。
pg_dumpと違いオプションで形式を指定することはできません。

pg_dumpall -f sampleDB_all.sql

ファイルを指定してリストア

データベースのリストアにはpsqlもしくはpg_restore.exeコマンドを使用します。
pg_dump.exeと同様パスが通っている場合はフルパスを指定せずにコマンドだけで実行することができます。

コマンド形式

-- psqlとそのオプション
psql データベース名 < ファイル名

-- pg_restoreとそのオプション
pg_restore -U ユーザー名 -d データベース名 -f リストア元のファイル名(もしくはフルパス)

コマンド実行例

> psql -U postgres  sample_db < backup1.sql

エラーメッセージが出た場合の対応

コマンド実行後にエラーメッセージが表示されたりエラーメッセージが表示されていないくてもファイルが生成されていないもしくはファイルが0Kbyteで作成されて失敗している場合はPostgreSQLのログを確認してみてください。

PostgreSQLのログは下記のファイルに格納されています。
PostgreSQLインストールフォルダ/data/logs/pg[version]/postgresql-[曜日].log

pg_restore: [アーカイバ(db)]

NG
pg_restore -d sample_db  sample_db_dump.backup

OK
「-U」で実行ユーザーを指定
pg_restore -U postgres -d sample_db  sample_db_dump.backup

psql: FATAL: role “user” does not exist

NG
psql sample_db < backup1.sql

OK
「-U」で実行ユーザーを指定
psql -U postgres sample_db < backup1.sql

pg_restore: -d/–dbnameオプションと-f/–fileオプションは同時に使用できません

NG
pg_restore -d sample_db -U postgres -f sample_db_dump.backup

OK
「-f」オプションを外して実行
pg_restore -d sample_db -U postgres -f sample_db_dump.backup

pg_dumpオプション

  -a, --data-only              データのみをダンプし、スキーマをダンプしません
  -b, --blobs                  ラージオブジェクトと共にダンプします
  -B, --no-blobs               ラージオブジェクトをダンプしません
  -c, --clean                  再作成前にデータベースオブジェクトを整理(削除)
  -C, --create                 ダンプにデータベース生成用コマンドを含めます
  -E, --encoding=ENCODING      指定の符号化方式でデータをダンプ
  -n, --schema=SCHEMA          指名したスキーマ(複数可)のみをダンプ
  -N, --exclude-schema=SCHEMA  指名されたスキーマ(複数可)をダンプしません
  -o, --oids                   ダンプにOIDを含めます
  -O, --no-owner               プレインテキスト形式で、オブジェクト所有権の
                               復元を飛ばします
  -s, --schema-only            スキーマのみをダンプし、データはダンプしません
  -S, --superuser=NAME        プレインテキスト形式で使用するスーパーユーザ名
  -t, --table=TABLE            指定したテーブル(複数可)のみをダンプ
  -T, --exclude-table=TABLE    指定したテーブル(複数可)をダンプしません
  -x, --no-privileges          権限(grant/revoke)をダンプしません
  --binary-upgrade             アップグレードユーティリティでのみ使用します
  --column-inserts             列名指定のINSERTコマンドとしてデータをダンプ
  --disable-dollar-quoting     ドル記号による引用を無効にして、SQL標準の引用を
                               使います
  --disable-triggers           データのみのリストアをする際、トリガを無効にし
                               ます
  --enable-row-security        行セキュリティを有効にします (ユーザがアクセス
                               許可を持つ内容のみダンプします)
  --exclude-table-data=TABLE   指定したテーブル(複数可)のデータをダンプしません
  --if-exists                  オブジェクトの削除の際に IF EXISTS を使います
  --inserts                    COPYではなくINSERTコマンドとしてデータをダンプ
                               します
  --no-publications            パブリケーションをダンプしません
  --no-security-labels         セキュリティラベルの割り当てをダンプしません
  --no-subscriptions           サブスクリプションをダンプしません
  --no-synchronized-snapshots  並列ジョブにおいて同期化スナップショットを使用し
                               ません
  --no-tablespaces             テーブルスペースの割り当てをダンプしません
  --no-unlogged-table-data     UNLOGGEDテーブルのデータをダンプしません
  --quote-all-identifiers      キーワードかどうかにかかわらずすべての識別子を
                               引用符で囲います
  --section=SECTION            指定したセクション(pre-data, data, post-data)を
                               ダンプします
  --serializable-deferrable    異常なくダンプを実行できるようになるまで待機します
  --snapshot=SNAPSHOT          指定したスナップショットを使用してダンプを行います
  --strict-names               テーブルやスキーマの追加指定パターンが最低1つの
                               実体にマッチすることを必須とします
  --use-set-session-authorization
                               所有権を設定する際に、ALTER OWNER コマンドではなく
                               SET SESSION AUTHORIZATION コマンドを使用します

接続オプション:
  -d, --dbname=DBNAME      ダンプするデータベース
  -h, --host=HOSTNAME      データベースサーバのホストまたはソケットディレクトリ
  -p, --port=PORT          データベースサーバのポート番号
  -U, --username=NAME      指定のデータベースユーザで接続
  -w, --no-password        パスワード入力を要求しません
  -W, --password           パスワードプロンプトを強制 (自動的に行われます)
  --role=ROLENAME          ダンプの前に SET ROLE を行います

pg_restoreオプション

 -d, --dbname=NAME        接続するデータベース名
  -f, --file=FILENAME      出力ファイル名
  -F, --format=c|d|t       バックアップファイルの書式
                           (自動的に設定されるはずです)
  -l, --list               アーカイブのTOCの要約を表示
  -v, --verbose            冗長モード
  -V, --version            バージョン情報を表示し、終了します
  -?, --help               このヘルプを表示し、終了します

リストア制御のオプション:
  -a, --data-only              データのみをリストア。スキーマをリストアしません
  -c, --clean                  再作成前にデータベースオブジェクトを整理(削除)
  -C, --create                 対象のデータベースを作成
  -e, --exit-on-error          エラー時に終了。デフォルトは継続
  -I, --index=NAME             指名したインデックスをリストア
  -j, --jobs=NUM               リストア時に指定した数の並列ジョブを使用
  -L, --use-list=FILENAME      このファイルの内容に従ってSELECTや出力のソートを
                               行います
  -n, --schema=NAME            指定したスキーマのオブジェクトのみをリストア
  -n, --schema=NAME            指定したスキーマのオブジェクトのみをリストア
  -O, --no-owner               オブジェクトの所有権の復元を省略
  -P, --function=NAME(args)    指名された関数をリストア
  -s, --schema-only            スキーマのみをリストア。データをリストアしません
  -S, --superuser=NAME         トリガを無効にする際に使用するスーパーユーザの名前
  -t, --table=NAME             指名したリレーション(テーブル、ビューなど)をリス
                               トア
  -T, --trigger=NAME           指定したトリガをリストア
  -x, --no-privileges          アクセス権限(grant/revoke)の復元を省略
  -1, --single-transaction     単一のトランザクションとしてリストア
  --disable-triggers           データのみのリストアをする際、トリガを無効にし
                               ます
  --enable-row-security        行セキュリティを有効にします
  --if-exists                  オブジェクトの削除の際に IF EXISTS を使います
  --no-data-for-failed-tables    作成できなかったテーッブルのデータはリストア
                                 しません
  --no-publications            パブリケーションをリストアしません
  --no-security-labels         セキュリティラベルをリストアしません
  --no-subscriptions           サブスクリプションをリストアしません
  --no-tablespaces             テーブル空間の割り当てをリストアしません
  --section=SECTION            指定したセクション (pre-data, data, post-data)
                               をリストア
  --strict-names               テーブルやスキーマの追加指定パターンが最低1つの
                               実体にマッチすることを必須とします
  --use-set-session-authorization
                               所有権を設定する際に、ALTER OWNER コマンドではなく
                               SET SESSION AUTHORIZATION コマンドを使用します

接続オプション:
  -h, --host=HOSTNAME      データベースサーバのホストまたはソケットディレクトリ
  -p, --port=PORT          データベースサーバのポート番号
  -U, --username=NAME      指定のデータベースユーザで接続
  -w, --no-password        パスワード入力を要求しません
  -W, --password           パスワードプロンプトを強制 (自動的に行われます)
  --role=ROLENAME          リストアに先立って SET ROLE します

Leave a Reply

Your email address will not be published. Required fields are marked *