テーブル単位でのリストア方法はあるのか?

このQ&Aのポイント
  • 質問者は、pg_dumpallコマンドで作成したバックアップファイルからテーブル単位でリストアする方法があるのか尋ねています。
  • pg_dumpallのマニュアルによると、リストアはpsqlコマンドを使用する必要がありますが、テーブル単位での復元のオプションはないようです。
  • また、pg_restoreコマンドでリストアを試みたところ、エラーが発生しました。質問者は、この問題について情報を探しているが見つけられていないと述べています。
回答を見る
  • ベストアンサー

テーブル単位のリストア

pg_dumpall > [出力ファイル名] で作成したバックアップからテーブル単位でリストアする方法はないのでしょうか? pg_dumpallのマニュアルを読むと、リストアはpsqlで行うことになっていますが、psqlのマニュアルには テーブル単位で取り出すオプションなどはないようです。 また:pg_dumpallで作成したファイルを: pg_restore -l [入力ファイル名] の入力ファイルにすると、"pg_restore: [archiver] input file does not appear to be a valid archive" エラーが発生します。 webでも調べてみたのですが、該当するページが見あたりません。 お手数ですがご教授ください。

  • trka
  • お礼率66% (12/18)

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

> 通常のエディタで開くことはもちろん、手作業で行うことは気が遠くなってしまいます。 そういうことでしたら、思いつくのは下記の様な方法でしょうか。 a. pg_dumpall ではなく pg_dump を使ってダンプする  元のDBに接続でき、現在の状態のリストアでよいならば、この方法が簡単でしょう。  例) pg_dump -h localhost -p 5432 -U user_hoge -t table_hoge db_hoge > dump.txt; http://www.postgresql.jp/document/9.2/html/app-pgdump.html b. スクリプト言語を使って対象のテーブルの箇所を抽出する  perl や ruby などを使えば、対象部分を抽出するプログラムが割りと簡単に作れるかと思います。 c. サイズの大きいファイルも扱えるエディタを使って抽出する  例えば、 vim などではサイズが大きくてもさほど不自由なく編集はできたと思います。  検索機能で該当箇所への移動・選択を行い、新旧の2ファイルを開いてコピーすれば良いかと。

trka
質問者

お礼

ありがとうございました。

trka
質問者

補足

C++で抽出プログラムを作成しました。 今のところうまく動いています。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

pg_dumpall で出力したダンプファイルをテキストエディタで開いてみれば分かりますが、通常のSQL文が並んでいるだけです。 したがって、リストアしたいテーブルのCREATE文やCOPY文をダンプファイルから抜き出した新たなファイルを作って psql に流し込めば、任意のテーブルだけリストアする事も出来るかと。

trka
質問者

お礼

root139様、ご回答ありがとうございます。 おっしゃるとおりですが、但しバックアップファイルはおおよそ35Gb程度あり、おおよそ100テーブルが含まれます。 通常のエディタで開くことはもちろん、手作業で行うことは気が遠くなってしまいます。 そこで、ストリームエディタを使用するなど、ご経験のある方があればお聞かせいただきたいと思います。

関連するQ&A

  • tar.gzファイルのリストアについて

    Postgres初心者です。 教えてください。 pg_dumpコマンドでdump拡張しのバックアップファイルを生成し、 tarコマンドで****.tar.gzファイルに圧縮しました。 このtar.gzのファイルを直接リストアするコマンドがあれば 教えていただけないでしょうか? -bash-3.2$pg_restore -U postgres -d (データベース名) < ****.tar.gz と実行すると、以下のエラーメッセージが表示されます。 →pg_restore: [アーカイバ] 入力ファイルが有効なアーカイブではないようです。 -bash-3.2$gunzip -C ****.tar.gz | pg_restore -d (データベース名) と実行すると、以下のエラーメッセージが表示されます。 →pg_restore: [tarアーカイバ] tarアーカイブ内でファイルtoc.dat用のファイルヘッダがありませんでした よろしくお願い致します。

  • PostgreSQLのリストアについて

    PostgreSQL8.1.3→PostgreSQL8.2.3へのリストアにて下記エラーが出てしまいます。 # createdb -T template0 hogedb # pg_restore -Fc -d hogedb 2007_03_05_03_01_hogedb.car ←リストア # pg_restore: [archiver] unsupported version (1.13) in file header ←エラー 単にPostgreのバージョン互換性の問題なのでしょうか? 以上、ご教授頂きたく。

  • psqlでのリストアの仕方

    Windows上でPostgreSQL8.0を使用しています。 DBのバックアップを毎日自動で(タスク登録して)とっています。 具体的にはバッチファイルの中で以下のようなpg_dumpコマンドを実行させています。 「pg_dump -U ユーザー名 -f %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%EXPDAT.db DB名 <dmp.txt」(なお、最後のテキストファイル内にはたぶんパスワードと思われる内容が記載されています。) 通常はAdminIIIを使用してバックアップおよびリストアを行っており、上記のバッチ実行にて作成されたダンプファイルからのリストアを行ったことがありません。(拡張子がBackupでないので、AdminIIIからのリストアはできませんでした) ヘルプや書籍を参考に、psqlからのリストアを試みたのですが、そもそもどのようにコマンドを入力してよいかわかりません。 試した内容は以下の通りです。 1.psql.exeを実行 2.ホスト名、ユーザー名、パスワード、データベース名をそれぞれ入力 3.データベース名#> が表示されるので、「psql -U ユーザー名 -d データベース名 -f "c:\20070822EXPDAT.db"」と入力し実行すると、psqlという文字列に対してsyntaxエラーとなってしまいました。 そもそも、psql画面でのコマンドの入力方法がよくわかっておりません。書籍などをみるとよく「psql -U xxx -d xxx -f xxx」と書いてありますが、実際に入力するのはどこからでしょう? 担当者が退社してしまい、手探り状態で運用し始めたところです。 大変初歩的な質問で申し訳ありませんがよろしくお願いいたします。

  • postgresのリストアでDBを自動作成する方法

    質問させてください。 例えば、以下のコマンドを実行してpostgreSQLでリストアをするとします psql -h localhost -U postgres -d testdb この場合、testdbというDBを作成していないと、エラーになります。 DBまで自動的に作成するコマンドはありませんでしょうか。 psql、pg_restoreの両方でお聞きしたいです。

  • pg_restoreでエラー

    こんにちは。 PostgreSQL8.1.10を使っています。 pg_dumpでバックアップしたデータをpg_restoreでリストアするときに、エラーと警告が出てしまいます。 $ pg_dump -F c mydb > db.dump $ dropdb mydb $ pg_restore -C -d postgres db.dump pg_restore: [アーカイバ(db)] TOC処理中にエラーがありました: pg_restore: [アーカイバ(db)] TOCエントリ1514; 0 0 COMMENT SCHEMA public postgresのエラーです pg_restore: [アーカイバ(db)] could not execute query: ERROR: スキーマpublicの所有者でなければなりません Command was: COMMENT ON SCHEMA public IS 'Standard public schema'; pg_restore: WARNING: 権限を取り上げられませんでした pg_restore: WARNING: 権限を取り上げられませんでした pg_restore: WARNING: 権限は付与されませんでした pg_restore: WARNING: 権限は付与されませんでした 警告: リストアにてエラーを無視しました: 1 結果を確認した限りではリストアはされているようなのですが気になります。 このエラーはどういった理由で発生しているのでしょうか。 エラーを出さなくする方法はあるのでしょうか。 無視していいものならそれでも構わないのですが、理由は知っておきたいです。

  • pg_dumpallができない・・・

    当方現在windowsXPにてpostgresql8.1.4を動かしております。 そろそろテーブル設計も終わったので全ての状況をバックアップとっておこうかな?と思いまして、psqlにてpg_dumpallを実行したのですが、 pg_dumpall db_test01 > test; ↑と打っても↓ ERROR: syntax error at or near "pg_dumpall"(文字位置: 1) 行 1: pg_dumpall db_test01 > test; が帰ってきて実行する事ができません・・・ 何方かお分かりの方いますでしょうか?? よろしくお願いします。

  • ダンプリストア時のDBデータ不整合

    環境 CentOS5系 64bit DBバージョン 8.3.3 本番DBサーバからpg_dump -c -D でダンプしたデータを、ローカルテストDBサーバ へpsql にてリストアした際、データ不整合が、一部のテーブルに発生しました。 前のデータが一部クリアされずに残っている状況です。 ダンプのデータは、DBの内容と同じなのですが。 因みに、pg_dump パラメータ無しのダンプのリストアでは、発生しません。 何が、原因でしょうか? もしかしてバグ? ご教授願えれば幸いです。 宜しくお願い致します。

  • pgAdminIIIでのリストア

    こんばんは。 pgAdminIIIを最近使いはじめました。 テーブルAを作成し、その後、そのテーブルのバックアップをCOMPRESSで作成しました。 そのバックアップファイルをデータを削除したテーブルAにリストアしようとしたのですが、 SET check_function_bodies = false というコマンドがエラーだと表示され、うまくリストアできませんでした。 何が間違っているのでしょうか? ご回答よろしくお願い致します。 ちなみにデータの文字コードはUnicodeでPostgreSQL7.3.9を利用しています。

  • Linux上のpostgreSQLデータをWindowsでみたい

    サーバA(OS:Linux Fedora Core 4、データベース:PostgreSQL 8.0 で運用しているシステムがあり、毎日そのデータを下記のdumpコマンドで PostgreSQLの全データをバックアップしています pg_dumpall > postgres.out  サーバAを触るのは怖いので、別のマシンB(Windows-Xp)に postgresql-8.2.6をインストールしました。 このバージョンは、postgresqlとともに、pgAdmin3というGUIの管理 ツールもついていると聞きここに、サーバAからバックアップされている postgres.outをrestoreして pgAdmin3でデータベース・テーブル等をみようとしています (postgres.out)を使ってのリストアの仕方は (1)(postgres.out)をpostgresqlの/binディレクトリの中に入れる (2)psqlのメニューから次のコマンドを打つ psql -d manmg -f postgres.out   (3)pgAdmin3を立ち上げるとサーバAのDBは追加されているようなのですが  テーブルは(0)となって見えません マシンBの方のPostgreSQLについてはインストールしたままでサーバA のpostgresqlの設定等は何もしていません 何か設定する所はあるのでしょうか 上記手順でlinuxから吐出されたバックアップデータをWindowマシンに リストアする方法は間違っていないのでしょうか よろしくお願いします。

  • pg_dumpallのバックアップとリストアについて

    現在当方、postgresql-8.2.11にてDBサーバを構築しております。 そろそろ、マシン自体も古くなってきたので載せ替えをしようと 試みているのですが、うまく行きません。。。 新しいマシンにはpostgresql-8.4.0をインストールしました。 旧サーバからpg_dumpallにて全データをダンプして新サーバへ リストアしたのですが、serverlogに下記のログが出てきて、 pgadmin3の様な接続ソフトから接続できません。 WARNING: nonstandard use of \\ in a string literal at character 70 HINT: Use the escape string syntax for backslashes, e.g., E'\\'. ERROR: column c.reltriggers does not exist at character 240 STATEMENT: SELECT c.oid, obj_description(c.oid), c.relhasoids as hasoids, n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace", c.relhasindex AS hasindexes, c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers, c.relacl, c.reltuples, ((select count(*) from pg_inherits where inhparent = c.oid) > 0) as inhtable FROM ((pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) WHERE (c.relkind = 'r'::"char") リストア後は正常にデータベースもできていますし、テーブルの内容も 問題なくリストアされているようでした。 ダンプされたファイルも秀丸にて確認してみましたが問題ないようでした。 どなたか何か情報をお持ちであれば教えてください。 よろしくお願いいたします。