@Tometzkyのソリューションは、少なくとも9.2のpg_dump
では、完全には正しくありません。 。新しいスキーマにテーブルが作成されますが、pg_dump
スキーマ-ALTER TABLE ... OWNER TO
を修飾します ステートメントなので、それらは失敗します:
postgres=# CREATE DATABASE demo;
\cCREATE DATABASE
postgres=# \c demo
You are now connected to database "demo" as user "postgres".
demo=# CREATE TABLE public.test ( dummy text );
CREATE TABLE
demo=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | test | table | postgres
(1 row)
demo=# \q
$
$ pg_dump -U postgres -f demo.sql demo
$ sed -i 's/^SET search_path = public, pg_catalog;$/SET search_path = testschema, pg_catalog;/' demo.sql
$ grep testschema demo.sql
SET search_path = testschema, pg_catalog;
$ dropdb -U postgres demo
$ createdb -U postgres demo
$ psql -U postgres -c 'CREATE SCHEMA testschema;' demo
CREATE SCHEMA
$ psql -U postgres -f demo.sql -v ON_ERROR_STOP=1 -v QUIET=1 demo
psql:demo.sql:40: ERROR: relation "public.test" does not exist
$ psql demo
demo=> \d testschema.test
Table "testschema.test"
Column | Type | Modifiers
--------+------+-----------
dummy | text |
また、ダンプを編集して、public.test
のスキーマ修飾を削除する必要があります。 または、新しいスキーマ名に変更します。 sed
これには便利なツールです。
これを行う正しい方法は、pg_dump -Fc -n public -f dump.dbbackup
を使用することでした。 次にpg_restore
新しいスキーマに変換しますが、現時点で正確にどのようになっているのかわかりません。
更新:いいえ、sed
のようです あなたの最善の策です。 別のスキーマでデータベースを復元したい
を参照してください。