2013-08-20 10 views
8

PostgreSQLデータベースの複数のテーブルからSQLファイルを抽出する必要があります。これは私がこれまでに作ってみたものです:PostgreSQL - 各テーブルを別のファイルにダンプする

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

しかし、あなたが見るように、接頭辞thrで始まるすべてのテーブルを単一の統合されたファイル(db_dump.sql)に輸出されています。私は、SQLを抽出するために合計で約90のテーブルを持っているので、データを別々のファイルに保存する必要があります。

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

+2

なぜ90種類のファイルが必要なのか説明する必要があります - MySQLへのエクスポート、部分バックアップ?バックアップ/エクスポートを実行しようとしている場合、IMSoPの回答によって各テーブルの同じスナップショットが保証されるわけではありません。 –

+0

@RichardHuxton良い点は、私は非原子性を考えていなかった。 DBから単一の "カスタム"バックアップを作成し、それから 'pg_restore'を使って個々のテーブルを抽出することができると思います。 – IMSoP

答えて

13

テーブルのリストをハードコードするだけで、それぞれが別のファイルに存在するようにしたい場合は、シェルスクリプトループを使用して、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つずつループします。

+0

テーブル名パラメータにワイルドカードを使用します。 90のテーブル名をハードコーディングする!私はそれまでに老人になるだろう。 :) –

+1

@HasanIqbalAnikまた、シェルスクリプトからテーブルのリストを照会してリストをループすることもできます。 –

+0

@HasanIqbalAnik \tあなたはそれが答えの冒頭に警告を付け加えた理由だと思っていました。 Igorが示唆するように、リストのDBを最初に照会する私の答えを編集しました。 – IMSoP

0

この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

、他の人のために役に立つことがあります

#!/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で取得するかを知るコマンドをユーザに与えました。 これはいつか誰かを助けることを願っています。

関連する問題