Solusi @Tometzky kurang tepat, setidaknya dengan pg_dump
9.2 . Ini akan membuat tabel dalam skema baru, tetapi pg_dump
skema memenuhi syarat ALTER TABLE ... OWNER TO
pernyataan, jadi itu akan gagal:
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 |
Anda juga perlu mengedit dump untuk menghapus kualifikasi skema di public.test
atau ubah ke nama skema baru. sed
adalah alat yang berguna untuk ini.
Saya berani bersumpah cara yang benar untuk melakukan ini adalah dengan pg_dump -Fc -n public -f dump.dbbackup
lalu pg_restore
ke dalam skema baru, tapi sepertinya saya tidak tahu persis bagaimana sekarang.
Pembaruan:Tidak, sepertinya sed
adalah taruhan terbaik Anda. Lihat Saya ingin memulihkan database dengan skema yang berbeda