【豆知識】事前にデータベースオブジェクトを削除する手間を省いて、リストアを実行したい
PostgreSQLインサイド
実現方法
データベースオブジェクトをリストアで復元する際、事前にデータベースオブジェクトを削除しておかないと、すでに存在する旨のエラーとなります。リストアと同時にリストア先のデータベースオブジェクトの整理(削除)を行うことで、このような手間を省き、エラーを回避できます。その方法は2つあります。
- A)バックアップ時に、データベースオブジェクトを整理するSQLコマンドが記載されたバックアップファイルを作成
pg_dumpコマンドに-cオプションまたは--cleanオプションを指定してバックアップし、psqlコマンドでリストアします。 - B)データベースオブジェクトを整理した後、リストアを実行
pg_restoreコマンドに-cオプションまたは--cleanオプションを指定してリストアします。
ここでは(A)の方法を説明します。
pg_dumpコマンドの出力結果には、バックアップした時点の状態のデータベースを再構成するために必要なSQLコマンドが書き出されます。これに-cまたは--cleanオプションを指定すると、データベースオブジェクトを作成するコマンドの前に、データベースオブジェクトを削除するコマンドが書き出されます。このため、リストアのとき、データベースを再作成する前にデータベースオブジェクトが整理されます。
また、--if-existsオプションを同時に指定すると、リストア先のデータベースの中に存在しないオブジェクトがある場合に発生する害のないエラーを回避できます。
実行例
pg_dumpコマンドに-cオプションを指定してバックアップしたオブジェクトを、psqlコマンドでリストアする場合の例
-
対象データベース(mydb)に対し、pg_dumpコマンドを使ってバックアップ
$ pg_dump -c --if-exists mydb > mydb_dump.sql
-
psqlコマンドを使って、バックアップ時点にリカバリー
$ psql mydb < mydb_dump.sql
ポイント
- リストア実行時、削除できない旨のエラーが出力された場合は、対象のオブジェクトを削除しても問題ないか確認してください。また、リストア完了後のオブジェクトの内容に問題がないか確認してください。
-
-cオプションと共に--if-existsオプションを指定しなかった場合、以下のようなエラーが出力されることがあります。これは、リストア時に読み込むファイルに、存在しないオブジェクトに対するDROP文が記述されているからです。この場合のエラーに害はありません。
エラーメッセージの例
pg_dumpコマンドに-cオプションを指定してバックアップ後、テーブルが削除されていた場合は、リストア時に以下のようなエラーが出力されます。
-
注サーバログです。ログ収集機構が有効になっている場合、画面に表示されません。
-cオプションと共に--if-existsオプションを指定してバックアップすると、IF EXISTS句が追加されたDROP文が書き出されるため、上記のエラー出力を回避できます。なお、--if-existsオプションはPostgreSQL 9.4からサポートされています。
-
参考
PostgreSQL 11.1 文書
-
Documentation(PostgreSQLオフィシャル)
- VI. Reference
- II. PostgreSQL Client Applications
- pg_dump — extract a PostgreSQL database into a script file or other archive file
- II. PostgreSQL Client Applications
- VI. Reference
-
PostgreSQL日本語ドキュメント(日本PostgreSQLユーザ会)
- VI. リファレンス
- II. PostgreSQLクライアントアプリケーション
- pg_dump — PostgreSQLデータベースをスクリプトファイルまたは他のアーカイブファイルへ抽出する
- II. PostgreSQLクライアントアプリケーション
- VI. リファレンス
PostgreSQLインサイド
2019年9月17日公開
富士通のソフトウェア公式チャンネル(YouTube)
-
- 富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。
- 富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。
PostgreSQLについてより深く知る
PostgreSQLに興味をお持ちのお客様はこちらのコンテンツもお勧めです。ぜひご覧ください。
本コンテンツに関するお問い合わせ
お電話でのお問い合わせ
-
富士通コンタクトライン(総合窓口)
0120-933-200受付時間:9時~12時および13時~17時30分(土曜日・日曜日・祝日・当社指定の休業日を除く)