web-dev-qa-db-ja.com

PostgreSQL-各テーブルを異なるファイルにダンプします

PostgreSQLデータベースの複数のテーブルからSQLファイルを抽出する必要があります。これは私がこれまでに思いついたものです:

pg_dump -t 'thr_*' -s dbName -U userName > /home/anik/psqlTest/db_dump.sql

ただし、ご覧のとおり、プレフィックスthrで始まるすべてのテーブルは、単一の統合ファイル(db_dump.sql)。 SQLを抽出するためのテーブルは全部で90近くあるので、データを別々のファイルに保存する必要があります。

どうすればいいですか?前もって感謝します。

16
Hasan Iqbal

テーブルのリストをハードコーディングしても問題がないが、それぞれを異なるファイルに入れたい場合は、シェルスクリプトループを使用して_pg_dump_コマンドを複数回実行し、毎回テーブル名を置き換えることができます。ループを丸める:

_for table in table1 table2 table3 etc;
do pg_dump -t $table -U userName dbName > /home/anik/psqlTest/db_dump_dir/$table.sql;
done;
_

[〜#〜] edit [〜#〜]:このアプローチを拡張して、ハードコードされた代わりにpsqlを介してクエリを実行し、結果をループにフィードすることで、テーブルのリストを動的に取得できます。リスト:

_for table in $(psql -U userName -d dbName -t -c "Select table_name From information_schema.tables Where table_type='BASE TABLE' and table_name like 'thr_%'");
do pg_dump -t $table -U userName dbName > /home/anik/psqlTest/db_dump_dir/$table.sql;
done;
_

ここで、_psql -t -c "SQL"_はSQLを実行し、ヘッダーまたはフッターなしで結果を出力します。選択されている列は1つだけなので、$(command)によってキャプチャされた出力の各行にテーブル名があり、シェルは一度に1つずつそれらをループします。

22
IMSoP

PostgreSQLのバージョン9.1(2011年9月)以降、バックアップを実行するときにディレクトリ形式出力を使用できます。

2バージョン/ 2年後(PostgreSQL 9.3)、-jobs/-jにより、すべてのオブジェクトを並行してバックアップすることがさらに効率的になります。

しかし、元の質問で私が理解していないのは、データではなくオブジェクト定義(スキーマ)のみをダンプする-sオプションを使用しているということです。

データが必要な場合は、-sではなく-a(データのみ)を使用するか、スキーマ+データを指定するオプションを使用しないでください。

したがって、ディレクトリdbName_objects /上のデータベースdbNameの「th」で始まるすべてのオブジェクト(テーブル...)を10個の同時ジョブ/プロセスでバックアップするには(サーバーの負荷を増やします):

pg_dump -Fd -f dbName_objects -j 10 -t'thr_ * '-U userName dbName

(オブジェクトのデータまたはスキーマが必要な場合は、-a/-sを使用することもできます)

その結果、ディレクトリにはtoc.dat(すべてのオブジェクトの目次)とオブジェクトごとに1つのファイル(.dat.gz)が圧縮された形式で入力されます。

各ファイルはそのオブジェクト番号にちなんで名付けられており、次のpg_restoreコマンドでリストを取得できます。

pg_restore --list -Fd dbName_objects/| grep 'テーブルデータ'

各ファイルを圧縮しないようにするため(生のSQLで)

pg_dump --data-only --compress = 0 --format = directory --file = dbName_objects --jobs = 10 --table = 'thr_ *'-username = userName --dbname = dbName

7

(正しい投稿にコメントするのに十分な評判ではありません)私はあなたのスクリプトをいくつかの修正と私自身の使用のためのいくつかの修正で使用しました、他の人にとって役立つかもしれません:

#!/bin/bash

# Config:
DB=rezopilotdatabase
U=postgres
# tablename searchpattern, if you want all tables enter "":
P=""
# directory to dump files without trailing slash:
DIR=~/psql_db_dump_dir

mkdir -p $DIR
TABLES="$(psql -d $DB -U $U -t -c "SELECT table_name FROM 
information_schema.tables WHERE table_type='BASE TABLE' AND table_name 
LIKE '%$P%' ORDER BY table_name")"
for table in $TABLES; do
  echo backup $table ...
  pg_dump $DB -U $U -w -t $table > $DIR/$table.sql;
done;
echo done

(pg_dumbコマンドに$ DBを追加するのを忘れたと思います。自動スクリプトの場合は、-wを追加しました。pswプロンプトを使用しない方がよいと思います。そのために、〜/ .pgpassファイルを作成しました。その中の私のパスワードまた、.pgpassでフェッチするパスワードを知るためのコマンドをユーザーに提供しました)これがいつか誰かに役立つことを願っています。

1
Rousseau Alban

このbashスクリプトは、テーブルごとに1つのファイルでバックアップを実行します。

#!/bin/bash

# Config:
DB=dbName
U=userName
# tablename searchpattern, if you want all tables enter "":
P=""
# directory to dump files without trailing slash:
DIR=~/psql_db_dump_dir

mkdir -p $DIR
AUTH="-d $DB -U $U"
TABLES="$(psql -d $DB -U $U -t -c "SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE' AND table_name LIKE '%$P%' ORDER BY table_name")"
for table in $TABLES; do
  echo backup $table ...
  pg_dump $ -t $table > $DIR/$table.sql;
done;
echo done
0
rubo77