2009-08-06 12 views

Odpowiedz

487

Nie trzeba utworzyć plik pośredni. Można zrobić

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname 

lub

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname 

użyciu psql lub pg_dump aby połączyć się ze zdalnym hostem.

W przypadku dużej bazy danych lub wolnego połączenia zrzucanie pliku i przesyłanie skompresowanego pliku może być szybsze.

Jak Kornel powiedział, że nie ma potrzeby, aby zrzucić do pliku pośredniego, jeśli chcesz pracować sprężonego można użyć sprężonego tunel

pg_dump -C dbname | bzip2 | ssh [email protected] "bunzip2 | psql dbname" 

lub

pg_dump -C dbname | ssh -C [email protected] "psql dbname" 

ale to rozwiązanie wymaga również aby uzyskać sesję na obu końcach.

+22

Nie ma potrzeby stosowania plików pośrednich - możesz użyć skompresowanego tunelu SSH lub po prostu potoku: pg_dump | bzip2 | ssh "bunzip2 | pg_restore" – Kornel

+2

Jeśli używasz bzip2, wyłącz kompresję ssh, aby przyspieszyć transfer! – lzap

+0

Polecenie ssh ma domyślnie wyłączoną kompresję. W przykładzie używanym podczas kompresji ssh nie używam bzip2 i gdy używam bzip2, nie używam kompresji ssh. – Ferran

97
pg_dump the_db_name > the_backup.sql 

Następnie skopiuj kopię zapasową na serwerze rozwoju, przywracania z:

psql the_new_dev_db < the_backup.sql 
+2

Ktoś powiedział mi, że może to być problematyczne - problemy z uprawnieniami powodujące obumieranie lub przywracanie po naciśnięciu spustu ? –

+9

@rmbarnes: Jeśli występują problemy - muszą zostać naprawione. Bez szczegółowej wiedzy, co ten "Ktoś" zrobił - nikt nie może potwierdzić ani odrzucić tego twierdzenia. –

+2

Użyj flagi --no-owner z pg_dump. Pomija to problem i pierwsza edycja tego wpisu go użyła - ale wtedy pomyślałem, że możesz potrzebować dokładniejszej wierności oryginalnej bazie danych. – unmounted

33

Zastosowanie pg_dump, a później psql lub pg_restore - w zależności od tego, czy zdecydujesz -Fp lub opcje -Fc do pg_dump.

Przykład użycia:

ssh production 
pg_dump -C -Fp -f dump.sql -U postgres some_database_name 
scp dump.sql development: 
rm dump.sql 
ssh development 
psql -U postgres -f dump.sql 
2

Walczyłem sporo i ostatecznie metodę, która pozwoliła mi zrobić to praca z Rails 4 brzmiała:

na starym serwerze

sudo su - postgres 
pg_dump -c --inserts old_db_name > dump.sql 

musiałem użyć użytkownikowi postgres Linux, aby utworzyć zrzut. również musiałem użyć -c, aby wymusić utworzenie bazy danych na nowym serwerze. --inserts mówi, że do korzystania z INSERT (składni), które w przeciwnym razie nie będzie pracować dla mnie :(

następnie, na nowym serwerze, Simpy:

sudo su - postgres 
psql new_database_name < dump.sql 

przenieść plik dump.sql pomiędzy serwerem Po prostu użyłem "kota" do wydrukowania zawartości, a następnie "nano", aby odtworzyć ją, kopiując zawartość.

Również ROLA, której używałem w dwóch bazach danych, była inna, więc musiałem znaleźć - wymienić wszystkich właścicieli nazwa na zrzutce:

13

pg_basebackup wydaje się być Lepszy sposób robienia tego teraz, szczególnie w przypadku dużych baz danych.

+7

Czy możesz podać więcej szczegółów w swojej odpowiedzi, na przykład? – Magnilex

+4

Działa to tylko wtedy, gdy oba urządzenia mają te same wersje PG. –

+0

Szanse są niewielkie, aby użyć innej wersji bazy danych do programowania i produkcji. Ostatnim razem miałem nieprzyjemną rozmowę z jednym z moich kolegów z drużyny, gdy próbowała zgłosić problem, że jakiś kod nie działa z PG 9.6, podczas gdy w tym czasie używaliśmy 9,5 w produkcji. Podstawowa kopia zapasowa jest znacznie szybsza. Następnie pg_upgrade jest sposobem, aby przejść w razie potrzeby. – Zorg

3

Uruchom tę komendę, wpisując nazwę bazy danych, którą chcesz wykonać, aby pobrać zrzut DB.

pg_dump -U {user-name} {source_db} -f {dumpfilename.sql} 

eg. pg_dump -U postgres mydbname -f mydbnamedump.sql 

Teraz skopiuj ten plik zrzutu do zdalnego komputera, na którym chcesz skopiować DB.

eg. scp mydbnamedump.sql [email protected]:~/some/folder/ 

Na zdalnym komputerze uruchom następującą komendę w ~/some/folder, aby przywrócić DB.

psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql} 

eg. psql -U postgres -d mynewdb -f mydbnamedump.sql 
16

Jeśli szukasz migrować między wersjami (np aktualizowania postgres i mają 9.1 działa na localhost: 5432 i 9.3 uruchomiony na localhost: 5434) można uruchomić:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434 

Sprawdź migration docs.

+0

Jestem poproszony o hasło (myuser91/postgres) - kilka razy, czy jest jakiś sposób, że muszę wprowadzić hasło tylko raz? –

+0

@MartinWeber Utwórz plik PNG zgodnie z tym dokumentem https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html –

1

Pozwól mi udostępnić skrypt powłoki Linux, aby skopiować dane z twojego serwera z jednego serwera na inny serwer PostgreSQL.

Reference taken from this blog:

Linux Bash Shell Script dla migracji danych pomiędzy serwerami PostgreSQL:

#!/bin/bash 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name1 \ 
    -d database_name \ 
    -c "\\copy tbl_Students to stdout" \ 
| \ 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name2 \ 
    -d database_name \ 
    -c "\\copy tbl_Students from stdin" 

Ja tylko migracja danych; proszę utworzyć pustą tabelę na docelowym/drugim serwerze bazy danych.

To jest skrypt narzędziowy. Co więcej, możesz zmodyfikować skrypt pod kątem użycia ogólnego, np. Dodając parametry dla nazwa_hosta, nazwa_bazy_danych, nazwa_tabeli i inne

Powiązane problemy