テーブルの行が誤ってデータベースから削除されました。次のように復元できるsqlファイルを生成するdbバックアップがあります。
psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql
これにより、ローカルで完全な復元が行われます。しかし、必要なのは、単一のテーブルの行を本番環境に復元することです。これをPostgreSQL 9.1で動作させるためのヒントはありますか?
ありがとう
単一テーブルの復元などが必要な場合は、SQLバックアップを実行しないでください。 pg_dump
の-Fc
オプションを使用 -「カスタム」フォーマット。これはpg_restore
を使用して復元できます。他のあらゆる便利な機能と同様に、選択的な復元が可能です。 pg_restore
は、必要に応じて、カスタム形式のダンプを後でSQLダンプに変換できます。
既存のダンプで立ち往生している場合、唯一のオプションは次のとおりです。
テキストエディターを使用して、ターゲットテーブルデータを別のファイルに抽出し、それを復元します。または
使い捨てデータベースにダンプを復元してから、pg_dump
を使用して、そのテーブルのみを含む選択的ダンプを取得します。それは使い捨てなので、アンロードされた高速ではあるが安全ではないマシンで別のPgインスタンスを使用して、fsync=off
のような「高速にして、必要に応じてデータを食べる」オプションをすべてオンにすることができます。 [〜#〜]決して[〜#〜]それを本番環境で設定する必要はありません。
このためのツールは知りませんが、この1行でprecious_table
からmy_backup.sql
ファイル:
sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
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
と必要なデータを復元します。これで、データを新しいテーブルにロードできます
簡単な方法があります。
'pg_restore'には '--table/-t'オプションがあります。
pg_restore -a -t your_table /path/to/dump.sql
リモートホストには「-h」を使用します。他のオプションを参照 ここ
たまたま _pg_dumpall
_ ダンプしてしまいます。また、users
という名前のデータベースからedc
という名前のテーブルを復元したいと思います。これは、willデータベース、さらにはスキーマ。
私の場合、次のsed
ワンライナーが機能します。
_sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump
_
それがすること:
/^\\connect edc/,/^\\connect/
_は、検索をデータベースの範囲に限定します。{…}
_は、範囲のすべての内部コマンドを実行します。/\susers\(\s\|$\)/
は、行の終わりも含めて、それ自体がusers
を含むすべての行に一致します。/;\|\\\./
_は、_;
_または_\.
_を含む行に一致しますp
は、一致する行を強制的に出力します(sedは_-n
_で呼び出されることに注意してください)。データの複雑さによっては、これを微調整する必要がある場合があります。
必要なのは、sed
の出力を正しいスイッチを使用してpsql
コマンドにパイプすることだけです。