web-dev-qa-db-ja.com

.sql postgresqlバックアップから単一のテーブルを復元する方法は?

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

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

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

ありがとう

15
AnApprentice

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

既存のダンプで立ち往生している場合、唯一のオプションは次のとおりです。

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

  • 使い捨てデータベースにダンプを復元してから、pg_dumpを使用して、そのテーブルのみを含む選択的ダンプを取得します。それは使い捨てなので、アンロードされた高速ではあるが安全ではないマシンで別のPgインスタンスを使用して、fsync=offのような「高速にして、必要に応じてデータを食べる」オプションをすべてオンにすることができます。 [〜#〜]決して[〜#〜]それを本番環境で設定する必要はありません。

10
Craig Ringer

このためのツールは知りませんが、この1行でprecious_tableからmy_backup.sqlファイル:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
17
Zouppen

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を引く必要があることに注意してください(つまり、次のコピーステートメントを除外します)

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

6
mys

簡単な方法があります。

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

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

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

2
Sergii Mostovyi

たまたま _pg_dumpall_ ダンプしてしまいます。また、usersという名前のデータベースからedcという名前のテーブルを復元したいと思います。これは、willデータベース、さらにはスキーマ。

私の場合、次のsedワンライナーが機能します。

_sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump
_

それがすること:

  1. _/^\\connect edc/,/^\\connect/_は、検索をデータベースの範囲に限定します。
  2. _{…}_は、範囲のすべての内部コマンドを実行します。
  3. /\susers\(\s\|$\)/は、行の終わりも含めて、それ自体がusersを含むすべての行に一致します。
  4. _/;\|\\\./_は、_;_または_\._を含む行に一致します
  5. pは、一致する行を強制的に出力します(sedは_-n_で呼び出されることに注意してください)。

データの複雑さによっては、これを微調整する必要がある場合があります。

必要なのは、sedの出力を正しいスイッチを使用してpsqlコマンドにパイプすることだけです。

0
vyegorov