2009-06-09 1 views
5

私は自分のpostgresデータベースのバックアップを持っています - データベースインスタンス全体は1回の夜間バックアップに含まれています。そのバックアップ内からデータベースの1つだけを復元することは可能ですか?または、個々のデータベースにアクセスする場合(マイグレーションまたはリストアの場合)、個々のダンプを実行するためにデータベースのバックアップ方式を変更する必要がありますか?データベース全体のpg_dumpから1つのスキーマだけを復元できますか?

答えて

12

あなたはこのようにいくつかのテキスト処理を使用して、テキスト形式(pg_dumpallは)で完全なデータベース・クラスタ・ダンプから個々のデータベースにアクセスすることができます

awk '/^\\connect database_name/ {flag=1;print;next} 
    /^\\connect/ {flag=0} 
    flag { print }' \ 
    < all_databases.sql \ 
    > database_name.sql 

これは「\connect database_name」と次の「間pg_dumpallは、ファイルのすべてのものからになるだろう\connect "。しかしそれほど効率的ではありません。

しかし、私はこのように個別にすべてのデータベースをダンプお勧めします:

# Dumping global data (for example roles) 
pg_dumpall -g > /var/lib/pgsql/backups/globals.sql 

#Dumping indidual databases in tar (uncompressed binary) format 
for dbname in 
    ` 
    psql -qXtc " 
     select datname from pg_catalog.pg_database 
     where datname<>'template0'" template1 
    ` 
do 
    pg_dump -b -F t "$dbname" > "/var/lib/pgsql/backups/$dbname.dump" 
done 

私はあなたが意味すると仮定しています「私は、データベースクラスタ全体のpg_dumpallはからわずか1データベースを復元することはできますか?」

+0

ありがとう。代替バックアップスクリプトは単なるチケットのようです。 – cnk

2

はい、バックアップが"an archive created by pg_dump in one of the non-plain-text formats."の場合は、pg_restoreに "--schema ="オプションを使用してください。

一方、ここでは正しい用語を使用しているかどうかはわかりません。DBクラスタを「データベースインスタンス全体」と呼びます。あなたは、「データベース」について尋ねるが、タイトルにあなたは「スキーマ」を書いた説明などで

編集:今、いくつかの審議の後、私はあなたが"pg_dumpall"で作成したクラスタのバックアップを、持っていると信じています。 "pg_dumpall"はプレーンテキスト(SQLコマンド)バックアップのみを作成します。その場合、1つのデータベース(またはデータベースから1つのスキーマのみ)を復元することはできません。

はい、非プレーンテキスト形式(--format = customが推奨されます)を使用して個々のデータベースをバックアップするようにバックアップ手順を変更する必要があります。

実際に私が自分のDBサーバーで使用するバックアップ手順は、まさにそれです。

+0

ありがとうございました。混乱する用語を使用して申し訳ありません。私は現在、Oracle、MySQL、Postgresで生産データを持っており、それぞれが「データベース」、「表スペース」、「インスタンス」などが意味するものについて少し混乱します。 – cnk

関連する問題