2010-06-15 8 views
34

Potrzebuję przenieść niektóre dane z innej bazy danych. Stara baza nazywa się paw1.moviesDB, a nowa baza to paw1. Schemat każdej tabeli jest następujący.Przesyłanie danych między bazami danych za pomocą PostgreSQL

Awards (name of the table)(new DB) 
Id [PK] Serial   Award 

Nominations (name of the table) (old DB) 
Id [PK] Serial   nominations 

Jak skopiować dane ze starej bazy danych do nowej bazy danych?

Odpowiedz

30

Bazy danych są izolowane w PostgreSQL; po połączeniu się z serwerem PostgreSQL łączysz się z jedną bazą danych, nie możesz kopiować danych z jednej bazy danych do drugiej przy użyciu zapytania SQL.

Jeśli pochodzą z MySQL: co nazywa MySQL (luźno) "baz" są "schemas" w PostgreSQL - rodzaj nazw. Baza danych PostgreSQL może mieć wiele schematów, każdy z tabelami i widokami, i można kopiować z jednego schematu do drugiego ze składnią schema.table.

Jeśli naprawdę masz dwie odrębne bazy danych PostgreSQL, najpowszechniejszym sposobem przesyłania danych z jednego do drugiego będzie eksportowanie tabel (z pg_dump -t) do pliku i importowanie ich do innej bazy danych (z psql).

Jeśli naprawdę potrzebujesz uzyskać dane z odrębnej bazy danych PostgreSQL, inna opcja - wspomniana w odpowiedzi Granta Johnsona - to dblink, który jest dodatkowym modułem (w contrib/).

+0

Setting zmienna search_path za pomocą "SET search_path TO blah" jest dobrym sposobem na pracę z różnymi schematami bez ranienia twoich pinkie.Możesz wprowadzić zmiany na stałe za pomocą "ALTER USER user SET search_path TO blah" - uwielbiam to! ;-) –

+1

Wykonanie ruchu za pomocą dblinka, zobacz http://stackoverflow.com/questions/14797327/copy-data-between-two-tables-in-postgresql-using-dblink-sql –

0

Tak jak sugerował leonbloy, używanie dwóch schematów w bazie danych jest drogą do zrobienia. Załóżmy, że źródło schematu (stary DB) oraz docelową nowy schemat (PB), można spróbować coś takiego (należy rozważyć nazwy kolumn, typy, etc.):

INSERT INTO target.Awards SELECT * FROM source.Nominations; 
+1

Jeśli masz przyzwoitą najnowszą wersję z PostgreSQL (> = 8.1) możesz zrobić "ALTER TABLE Nominations SET SCHEMA target" – b0fh

+0

Schematy to nic innego jak przestrzenie nazw, i tak naprawdę nie zapewniają izolacji. Inna baza danych może być uruchomiona na innym komputerze lub może na tym samym, ale z różnymi ustawieniami wydajności/pamięci, i możesz mieć dwie bazy danych, które mają te same schematy (co mamy). Inna baza danych może być nawet inną wersją Postgres, zakładając, że są one kompatybilne. – sudo

8

Istnieją trzy opcje kopiowania, jeśli jest to jednorazowa:

  1. Użyj db_link (myślę, że jest jeszcze w contrib)
  2. mieć aplikację do pracy.
  3. Eksport/import

Jeśli jest to ciągła potrzeba, odpowiedzi są:

  1. Zmiana schematów w tym samym DB
  2. db_link
57

miałem tylko zrób to dokładnie, więc pomyślałem, że wstawię tu przepis. Zakłada się, że obie bazy danych znajdują się na tym samym serwerze.

Najpierw skopiuj tabelę ze starej bazy danych do nowej bazy danych (ponieważ najwyraźniej nie można przenosić danych między bazami danych). Przy linii poleceń:

pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database> 

Następnie udzielić uprawnienia skopiowanej tabeli użytkownikowi nowej bazy danych.Zaloguj się do psql:

psql -U postgres -d <new_database> 

ALTER TABLE <old_table> OWNER TO <new_user>; 

\q 

Na koniec skopiuj dane ze starej tabeli do nowej tabeli. Zaloguj się jako nowy użytkownik, a następnie:

INSERT INTO <new_table> (field1, field2, field3) 
SELECT field1, field2, field3 from <old_table>; 

Gotowe!

+3

jak to zrobić dla zdalnego serwera? –

+1

@DevR, po prostu dodaj -h rdo

6

z: hxxp: //dbaspot.c om/PostgreSQL/348627-pg_dump t-da-w którym, condition.html (Uwaga: związek jest obecnie podzielone)

# create tmp db with the data 
psql mydb 
CREATE TABLE temp1 (LIKE mytable); 
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions; 
\q 

# export the data 
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql 
psql mydb 
DROP TABLE temp1; 
\q 

# import temp1 somewhere 
cat out.sql | psql -d [other_db] 
psql other_db 
INSERT INTO mytable (SELECT * FROM temp1); 
DROP TABLE temp1; 

Inna metoda przydatna w piloty

psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER; 
    $ scp host.com:/tmp/elements.csv /tmp/elements.csv 
    psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV; 
+1

Dzięki. Jest to najprostsze rozwiązanie, które nie zawiera żadnych rozszerzeń. Zauważ, że '--column-insertts' znacznie spowalnia, więc możesz go usunąć, jeśli tabela docelowej bazy danych jest znana z braku konfliktów. – sudo

+1

W przypadku, gdy jest to dla nikogo niejasne, druga połowa jest następująca: Utwórz tabelę na innym DB: 'psql -d [other_db] -c" UTWÓRZ TABELĘ temp1 (LIKE mytable); "', następnie wstaw do innego DB : 'cat out.sql | psql -d [other_db] ', a następnie wstaw do głównej tabeli:' psql -d [other_db] -c "INSERT INTO mytable (SELECT * FROM temp1);" '. – sudo

17

ten pracował dla mnie, aby skopiować tabelę zdalnie z moim localhost do PostgreSQL Heroku za:

pg_dump -C -t source_table -h localhost source_db | psql -h destination_host -U destination_user -p destination_port destination_db

Spowoduje to utworzenie stołu dla ciebie.

Na drugim kierunku (od Heroku do lokalnego) pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db

+0

Jeśli masz inny port i nazwę użytkownika w localhost, polecenie to: pg_dump -C -t source_table -h localhost -p local_port -U local_user source_db | psql -h destination_host -U destination_user -p destination_port destination_db – Fil

0

nie można wykonać kwerendy cross-bazy danych takie jak SQL Server; PostgreSQL nie obsługuje tego.

Rozszerzenie PostgreSQL DbLink służy do połączenia jednej bazy danych z inną bazą danych. Zainstalowałeś i skonfigurowałeś program DbLink do wykonywania kwerendy między bazami danych.

Mam już utworzony skrypt krok po kroku i przykład do wykonywania kwerendy krzyżowej bazy danych w PostgreSQL. Proszę odwiedzić ten wpis: PostgreSQL [Video]: Cross Database Queries using the DbLink Extension

0

Właściwie jest jakaś możliwość, aby wysłać dane z tabeli z jednej bazy danych PostgreSQL do drugiego. Używam do tego proceduralnego języka plperlu (niebezpieczny język proceduralny Perl).

Opis (wszystko było zrobione na serwerze Linux):

  1. Tworzenie języka plperlu w baza danych

  2. Następnie PostgreSQL może dołączyć kilka modułów Perla poprzez serię następujących poleceń na koniec z postgresql.conf dla bazy a:

    plperl.on_init='use DBI;' 
    plperl.on_init='use DBD::Pg;' 
    
  3. zbudować funkcji w tak:

    CREATE OR REPLACE FUNCTION send_data(VARCHAR) 
    RETURNS character varying AS 
    $BODY$ 
    my $command = $_[0] || die 'No SQL command!'; 
    my $connection_string = 
    "dbi:Pg:dbname=your_dbase;host=192.168.1.2;port=5432;"; 
    $dbh = DBI->connect($connection_string,'user','pass', 
    {AutoCommit=>0,RaiseError=>1,PrintError=>1,pg_enable_utf8=>1,} 
    ); 
    my $sql = $dbh-> prepare($command); 
    eval { $sql-> execute() }; 
    my $error = $dbh-> state; 
    $sql-> finish; 
    if ($error) { $dbh-> rollback() } else { $dbh-> commit() } 
    $dbh-> disconnect(); 
    $BODY$ 
    LANGUAGE plperlu VOLATILE; 
    

a następnie można wywołać funkcję wewnątrz bazy A:

SELECT send_data('INSERT INTO jm (jm) VALUES (''zzzzzz'')'); 

a wartość "Zzzzzz" zostanie dodany do tabeli "JM" w bazie B.

Powiązane problemy