2011-06-28 11 views
6

私はデータベースのスナップショットを取って同じマシン上でポストグルの他の定義済みの名前で復元する必要があります。 私は以下のコマンドで上記の作業を達成しようとしました。 sourceDb exists.Soへの接続/セッションは、私が読んで操作を実行するユーザーの高い可能性があるとして、このオプションを切り捨てる必要がある場合postgresのデータベースをコピーする

CREATE DATABASE destniationDb TEMPLATE sourceDb; 

は、しかし、このオプションは失敗します。 restore_db、backup_dbのようなすべてのコマンドラインオプションは私の要求に合っています.Hence、私はそれを達成するためにいくつかのコンソールコマンド/関数/ストアプロシージャが必要です。つまり、データベースに接続し、これを実現するコマンド/目的。

あなたの誰かが私の要件に対する何らかの解決方法を提案できますか?

答えて

11

なぜあなたはちょうどCREATE DATABASEラインで新しいものにデータベース名を変更するには、コマンドにこのSQLダンプdestinationDb.sql

pg_dump sourceDb > destinationDb.sql 

そして使用して、既存のデータベースsourceDbのダンプを作成しないでください。その後、あなたはその後、同じようpsqlを使用してサーバー上でこの新しいDBを作成することができます。

psql destinationDb < destinationDb.sql 
+0

私はこのオプションを試しましたが、私たちの要求に合っていません。 – Patton

+0

なぜですか?この特別な場合を詳しく説明できますか? – nemesisfixx

+0

実際には、createdb、dropdbのようなpostgresのコマンドラインオプションをpg_dumpで使いたくないのですが、私たちが探しているオプションは、プログラマチックな(JDBCを使って)いくつかの違いがあります。 私が言及したオプション CREATE DATABASE destniationDb TEMPLATE sourceDb; は操作を完了するのに6秒未満かかります。あなたが言及した場合には、操作を完了するのに最低限の時間がかかります 私はここに与えられた解決策を試しましたhttp://stackoverflow.com/questions/1237725/how-to- copy-postgres-database-to-another-server – Patton

0

最初locking the tableを試したことがありますか?

編集:私はあまり単純化していないかもしれません。操作をコピーしているテーブルへの書き込みをロックすると、動作する可能性があります。しかし、DB全体をクローン化する場合はそうではないようです。

あなたのコメントに記載されたリンクから、データベースはアクティブでない必要がありますセッション。これは、操作の直前にpostgresサービスを再起動するだけで解決します。スクリプトの速度が十分速ければ、新しいセッションを接続する前に次のコピーを実行する必要があります。私はpostgresがセッションが終了するまで最大90秒待つと思うので、この解決策はあまりにも破壊的であってはいけません。

+0

http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html これを実行してください。これは明らかに、ソースDbが開いている場合、操作は失敗します。 私はこのテーブルをロックしようとしなかったのですが、現在のシナリオでそれをどうやって行うのかの例を教えてください。 – Patton

+0

@Spiffあなたのソリューションはこれが実現可能かどうかチェックしてみるといいですね。 – Patton

関連する問題