@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