21

テーブルの行が誤ってデータベースから削除されました。次のように復元できる sql ファイルになる db バックアップがあります。

psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql

これにより、ローカルで完全な復元が行われます。しかし、必要なのは、1 つのテーブルの行を本番環境に復元することです。これを PostgreSQL 9.1 で動作させるためのヒントはありますか?

ありがとう

4

7 に答える 7

24

私はこれのためのツールを認識していませんが、このワンライナーはファイルから抽出precious_tablemy_backup.sqlます:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
于 2014-02-25T16:15:15.090 に答える
14

単一テーブルの復元などが必要な場合は、SQL バックアップを行わないでください。オプション- 「カスタム」形式を使用してください。pg_dump-Fcこれは、を使用して復元できますpg_restore。他のあらゆる種類の便利な機能と同様に、選択的な復元が可能です。pg_restore必要に応じて、後でカスタム形式のダンプを SQL ダンプに変換できます。

既存のダンプに行き詰まっている場合、唯一のオプションは次のとおりです。

  • テキスト エディターを使用して、ターゲット テーブル データを別のファイルに抽出し、それを復元するだけです。また

  • 使い捨てデータベースにダンプを復元してから、pg_dumpそのテーブルだけを含む選択的ダンプを取得するために使用します。使い捨てなので、アンロードされた高速だが安全でないマシンで別の Pg インスタンスを使用して、fsync=off. 本番環境では絶対に設定しないでください。

于 2013-02-12T09:19:52.653 に答える
7

簡単な方法があります。

「pg_restore」には「--table/-t」オプションがあります。

pg_restore -a -t your_table /path/to/dump.sql

リモート ホストには「-h」を使用します。その他のオプションはこちら

于 2015-04-11T18:50:12.287 に答える
7

テーブルデータを取得するには、roder で grep + sed を使用できます。

まず、境界を特定する必要があります。

$ fgrep -Ehn '^(COPY |CREATE TABLE )' db.sql
49:CREATE TABLE test (
60:CREATE TABLE test2 (
71:CREATE TABLE test3 (
82:COPY test (i) FROM stdin;
100090:COPY test2 (i) FROM stdin;
200098:COPY test3 (i) FROM stdin;

テーブル test2 のデータを抽出するには:

sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql

2 番目の数値から 1 を引く必要があることに注意してください (つまり、次のコピー stmt を除外します)。

これで、必要なデータをロードnew_table_name.sqlして復元できます。これで、データを新しいテーブルにロードできます

于 2013-02-12T09:55:06.977 に答える