2014-06-06 23 views
5

Jestem nowym użytkownikiem Postgres i właśnie odkryłem, że nie mogę uzyskać dostępu do danych różnych baz danych w jednym zapytaniu SQL. A także nauczył się koncepcji schematu w Postgres.Postgres: Najlepszy sposób na przeniesienie danych z publicznego schematu jednego DB do nowego schematu innego DB

Teraz mam dwie bazy danych

DB1 i DB2

obie mają tabele z tej samej nazwie w ich schemacie publicznym.

Teraz chcę, aby utworzyć nowy schemat w db1 z nazwą: new_schema

I przenieść dane z db2.public do db1.new_schema

co jest najprostszym sposobem, aby to zrobić?

Odpowiedz

6

Najprostszy sposób to zmienić nazwę schematu. Jednak musisz być pewien, że jesteś jedynym użytkownikiem bazy danych db1.

pierwsze, ukryć swój schematu publicznej w db1:

alter schema public rename to original_public; 
create schema public; 

Dalej, zrób kopię zapasową i przywrócić:

$ pg_dump --format custom --file "my_backup" --schema "public" "db2" 
$ pg_restore --dbname "db1" "my_backup" 

Wreszcie odtworzyć odpowiednie nazwy schematu:

alter schema public rename to my_schema; 
alter schema original_public rename to public; 

Another opcją jest użycie dblink. Umożliwia dostęp do danych z różnych baz danych.

1

Export "publiczny" z DB2 (pomijam dotacje i własności):

pg_dump -xO -n public db2 > db2.sql 

wyeksportowany plik będzie ustawić ścieżkę przeszukiwania (gdzieś u góry):

SET search_path = public, pg_catalog; 

go zmienić :

CREATE SCHEMA IF NOT EXISTS new_schema; 
SET search_path = new_schema, pg_catalog; 

importu do DB1 jak zwykle:

psql db1 < db2.sql 

Najprawdopodobniej najpierw przeniesiesz wszystko z publicznego do nowego schematu w db1.

Jeśli schemat jest już skonfigurowane w db1, można wykonać transfer za jednym zamachem:

pg_dump -xO -n public db2 | sed 's/search_path = public/search_path = new_schema/' | psql db1 

Nie polecałbym że bez wielu testów, oczywiście.