PostgreSQL:同じデータベースにデータベーススキーマの完全なコピーを作成する方法は?


26

public完全なテーブル構造、データ、関数、fk、pkなどを使用してスキーマを同じデータベースにコピーする方法。Postgresの
バージョンは8.4
PSです。データベースではなくスキーマをコピーする必要があります。


より多くのスキーマがありpublicますか?
a_horse_with_no_name

公開スキーマとデモスキーマがあります。そして、デモアカウントを作成するためにデモをコピーする必要があります

これは、できる便利なことです。
-Kuberchaun

回答:


19

pg_dump / pg_restore自体でこれを行う簡単な方法はありません。データベースを一時的に削除できる場合は、次を試すことができます。

  1. pg_dumpを使用してパブリックスキーマのダンプを取得します
  2. 「ALTER SCHEMA public RENAME TO public_copy」を実行します
  3. pg_restoreを使用して、ステップ1からパブリックスキーマのダンプを復元します

PHP経由でpg_dumpとpg_restoreにアクセスするにはどうすればよいですか?

これは、データベースを実行している場所によって異なります。サーバー上のシェルからpg_dumpとpg_restoreにアクセスできます。シェルにアクセスできない場合は、PHPのshell_execを使用してみてください。そうでない場合は、おそらくPostgreSQL GUIツール

1
+1これはこれまでで最もスマートなソリューションです。シェルコマンドは次のようになります(詳細はマニュアルに記載されていますpg_dump -n my_schema -f '/path/to/file.pgsql' my_db。スーパーユーザ(として最も簡単postgresPW-少ないと)peerで承認pg_haba.conf。元のスキーマの名前を変更した後に復元しますpsql my_db -f '/path/to/file.pgsql'。プレーンなSQLダンプがある場合は必要ありませpg_restore
アーウィンブランドステッター

簡単な方法があります。私の答えをご覧ください。pg_dumpは、スキーマを選択するための-nスイッチをサポートしています。次に、ダンプ内のスキーマ名を編集してリロードします。
スコットマーロウ

2
スキーマの名前を変更しても、関数内の参照は更新されません:gist.github.com/pschultz/5387172。ダンプを名前に置き換えると、検索を取得して適切に置き換えると、ダンプの信頼性がはるかに高くなります。
ピーター

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

あなたがPHPで立ち往生している場合は、いずれかのバックティックを使用してください

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

またはexec()コマンド。変更については、sedを同じ方法で使用できます。

ここに6つの文字があります


1
特にスキーマ名がコンテンツとして表示される可能性がある場合(例:)、スキーマの名前を変更し、バックアップした元のスキーマをロードする方が安全publicです。
-artm

7

pgAdminを使用すると、次のことができます。かなり手作業ですが、必要なものはこれだけです。スクリプトベースのアプローチがはるかに望ましいでしょう。管理者アクセス権がなく、データベースが大きい場合、これがどの程度うまく機能するかはわかりませんが、ローカルコンピューターにある開発データベースでは問題なく機能するはずです。

  1. コピーするスキーマ名を右クリックし、[バックアップ]をクリックします。(これよりも深く、両方ではなく構造をバックアップすることを選択できます)。

  2. バックアップファイルに名前を付け、形式も選択します。(私は通常Tarを使用します。)

  3. バックアップをクリックします。

  4. バックアップ元のスキーマを右クリックし、プロパティをクリックして、一時的に別の名前に変更します。(例:temprename

  5. スキーマルートをクリックし、オブジェクトブラウザで右クリックして、[ 新しいスキーマの作成 ]をクリック、スキーマにpublicという名前を付けます。これは、バックアップからコピーするスキーマになります。

  6. 手順5で公開した新しいスキーマを右クリックして、[復元]をクリックします。手順3のバックアップファイルから復元します。

  7. 新しいスキーマpublicを別の名前に変更します(例newschema)。

  8. スキーマtemprenameの変更をステップ4から元の名前に変更します。


手順5で作成した新しいスキーマは、バックアップしたスキーマと同じ名前にする必要があります。そうしないと、pgAdminは何も復元しません。
曹操ミン

5

使用できます

CREATE DATABASE new_db TEMPLATE = old_db;

次に、不要なスキーマをすべて削除します。

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

唯一の欠点は、コピーを作成する前にold_dbへのすべての接続を決定する必要があることです(したがって、CREATE DATABASEステートメントを実行するプロセスは、たとえばtemplate1に接続する必要があります)。

それがオプションではない場合、pg_dump / pg_restoreがそれを行う唯一の方法です。


1
この質問をする前に、データベースを複製する同様の方法を使用しました。しかし、それは多くの時間を費やし、スキーマのみのクローン作成ははるかに高速だと思います

@sigra:a_horseの複製方法、実際のファイルをコピーするだけでデータベースの処理が最も速くなり、オーバーヘッドを大幅に節約できます。スキーマがデータベース全体のごく一部にすぎない限り、スキーマのダンプとリロードが高速になるとは思いません。したがって、実際の質問に答えていない場合でも、この回答に+1を付けます。
アーウィンブランドステッター

単一のスキーマを複製するのは大変な作業です。スキーマをダンプし、ダンプ内でスキーマの名前を変更して再ロードする方がはるかに高速です。
スコットマーロウ

@ScottMarlowe:最大のスキーマがどれかによって異なります。最大のものがドロップされたものの1つである場合、はい、同意します。
a_horse_with_no_name

2

user1113185 answerを展開すると、psql / pg_dumpを使用した完全なワークフローがあります。

以下は、データベース内ののすべてのオブジェクトをエクスポートold_schemaし、新しいnew_schemaスキーマにインポートします。userdbname

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.