@Tometzkys lösning är inte helt rätt, åtminstone med 9.2:s pg_dump
. Det kommer att skapa tabellen i det nya schemat, men pg_dump
schemat kvalificerar ALTER TABLE ... OWNER TO
uttalanden, så de kommer att misslyckas:
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 |
Du måste också redigera dumpen för att ta bort schemakvalificeringen på public.test
eller ändra det till det nya schemanamnet. sed
är ett användbart verktyg för detta.
Jag kunde ha svurit att det korrekta sättet att göra detta var med pg_dump -Fc -n public -f dump.dbbackup
sedan pg_restore
in i ett nytt schema, men jag kan inte ta reda på exakt hur just nu.
Uppdatering:Nej, det ser ut som sed
är din bästa insats. Se Jag vill återställa databasen med ett annat schema