sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man återställer ett offentligt schema till ett annat schema

@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



  1. Exporterar sekvensfil till Oracle by Sqoop

  2. Fel 2006:MySQL-servern har försvunnit med Python, Bottle Microframework och Apache

  3. Vill du inkludera rubriker när du använder SELECT INTO OUTFILE?

  4. PCI-kompatibilitet för MySQL &MariaDB med ClusterControl