Kopiowanie bazy danych PostgreSQL na inny serwer

492

Chcę skopiować produkcyjną bazę danych PostgreSQL na serwer programistyczny. Jaki jest najszybszy i najłatwiejszy sposób na zrobienie tego?

Robin Barnes
źródło

Odpowiedzi:

666

Nie musisz tworzyć pliku pośredniego. Możesz to 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

za pomocą psqllub pg_dumpdo połączenia 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 powiedział Kornel, nie ma potrzeby zrzucania do pliku pośredniego, jeśli chcesz pracować skompresowany, możesz użyć skompresowanego tunelu

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

lub

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

ale to rozwiązanie wymaga również sesji na obu końcach.

Uwaga: pg_dump służy do tworzenia kopii zapasowych i psqlprzywracania. Tak więc pierwszym poleceniem w tej odpowiedzi jest skopiowanie z lokalnego na zdalny, a drugim z zdalnego na lokalny . Więcej -> https://www.postgresql.org/docs/9.6/app-pgdump.html

Ferran
źródło
28
Pliki pośrednie nie są potrzebne - możesz użyć skompresowanego tunelu SSH lub po prostu potoku: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel
4
Jeśli używasz bzip2, wyłącz kompresję ssh, aby przyspieszyć transfer!
lzap,
8
Jak mogę pracować skompresowany, jeśli ściągam dane z produkcji do rozwoju? Skonfigurowałem połączenie SSH od rozwoju do produkcji. Tak by to było ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy French
2
Spodziewałbym się, że powinieneś być w stanie skopiować zdalną bazę danych o nazwie x do lokalnej bazy danych o nazwie y, ale rozwiązanie @ Ferran nie działa w tym przypadku ... Wydaje mi się, że rozwiązanie porneL po prostu pozostawia pliki bzip2 na serwer, więc nie jest to proces jednoetapowy. W tym przypadku chyba porzucę bazę danych y, użyję części „lub” rozwiązania Ferrana, która przywraca x, a następnie zmieni nazwę bazy danych na y.
Darin Peterson
3
Oto co zrobiłem: (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U lokalizator (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x" RENAME TO "y"
Darin Peterson
131
pg_dump the_db_name > the_backup.sql

Następnie skopiuj kopię zapasową na serwer programistyczny i przywróć za pomocą:

psql the_new_dev_db < the_backup.sql
nieoprawny
źródło
3
Ktoś powiedział mi, że może to być problematyczne - problemy z uprawnieniami powodujące śmierć zrzutu lub przywracania, gdy dojdzie do wyzwolenia?
Robin Barnes,
17
@rmbarnes: Jeśli występują problemy - należy je naprawić. Bez szczegółowej wiedzy o tym, co zrobił „ktoś” - nikt nie może potwierdzić ani odrzucić tego roszczenia.
4
Użyj flagi --no-owner z pg_dump. To pomija problem i wykorzystano go w pierwszej edycji tego postu - ale pomyślałem, że może być potrzebna dokładniejsza wierność oryginalnej bazie danych.
odmontowano
4
Dla mnie powyższe podejście działało w następujący sposób: pg_dump -C -h host -U nazwa_użytkownika nazwa_bazy_danych> / any_directory / dump_schema_and_data_file .I do przywracania z pliku: psql -h host -U nazwa_użytkownika db_name <dump_schema_and_data_file
Ali Raza Bhayani
To zaoszczędziło mi dużo stresu. Użyłem dysku Google, aby przenieść plik między komputerami. Ponieważ miałem już bazę danych na nowym komputerze (ale pusta), otrzymałem DUŻO duplikatów kluczowych błędów. Jest to jednak środowisko deweloperów i niczego nie skrzywdziło.
Chris Mendla,
37

Użyj pg_dump , a później psql lub pg_restore - w zależności od tego, czy wybierzesz opcje -Fp czy -Fc dla 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

źródło
22

Jeśli chcesz przeprowadzić migrację między wersjami (np. Zaktualizowałeś postgres i masz wersję 9.1 uruchomioną na localhost: 5432 i 9.3 działającą na localhost: 5434), możesz uruchomić:

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

Sprawdź dokumenty dotyczące migracji .

Eric H.
źródło
Wielokrotnie poproszono mnie o hasło (myuser91 / postgres). Czy jest jakiś sposób, że muszę wprowadzić hasło tylko raz?
Martin Weber,
@MartinWeber Utwórz plik pgpass zgodnie z tym dokumentem postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren
co jeśli mają oba te same porty?
ggnoredo
Jeśli są na różnych serwerach, możesz użyć opcji -h, aby określić hosty.
Haroldo_OK
16

pg_basebackup wydaje się być lepszym sposobem na zrobienie tego teraz, szczególnie w przypadku dużych baz danych.

Możesz skopiować bazę danych z serwera z tą samą lub starszą wersją główną. Lub ściślej :

pg_basebackupwspółpracuje z serwerami tej samej lub starszej wersji głównej, do wersji 9.1. Jednak tryb przesyłania strumieniowego WAL ( -X stream) działa tylko z serwerem w wersji 9.3 i nowszej, a tryb formatu tar ( --format=tar) bieżącej wersji działa tylko z serwerem w wersji 9.5 lub nowszej.

Do tego potrzebujesz na serwerze źródłowym:

  1. listen_addresses = '*'aby móc połączyć się z serwera docelowego. Upewnij się, że port 5432 jest w tym przypadku otwarty.
  2. Co najmniej 1 dostępne połączenie replikacji: max_wal_senders = 1 ( -X fetch), 2dla -X stream(domyślnie w przypadku PostgreSQL 12) lub więcej.
  3. wal_level = replica lub wyższy, aby móc ustawić max_wal_senders > 0 .
  4. host replication postgres DST_IP/32 trustw pg_hba.conf. Zapewnia to dostęp do pgklastra każdemu z DST_IPkomputera. Możesz skorzystać z bezpieczniejszej opcji.

Zmiany 1, 2, 3 wymagają ponownego uruchomienia serwera, zmiana 4 wymaga ponownego załadowania.

Na serwerze docelowym:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME
Reshad user2701173
źródło
11
Czy możesz podać więcej szczegółów w swojej odpowiedzi, na przykład przykład?
Magnilex,
7
Działa to tylko wtedy, gdy oba komputery mają tę samą wersję PG.
sm
Niewielkie szanse, że użyjesz innej wersji bazy danych do programowania i produkcji. Ostatnim razem miałem nieprzyjemną rozmowę z jedną z moich koleżanek 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 korzystaliśmy z wersji 9.5. Baza danych jest znacznie szybsza. W razie potrzeby pg_upgrade jest najlepszym rozwiązaniem.
Zorg
2
Możliwe, że chcesz migrować do nowszej wersji i nie chcesz zatrzymywać PostgreSQL.
x-yuri,
1
Szanse są takie, że za każdym razem, gdy aktualizujesz bazę danych, aktualizujesz ją na etapie tworzenia i przygotowywania, zanim zrobisz to na produkcji.
andrew lorien
8

Uruchom to polecenie z nazwą bazy danych, którą chcesz wykonać kopię zapasową, aby wykonać zrzut bazy danych.

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

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

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

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

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

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

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
użytkownik01
źródło
7

Miałem sporo problemów i ostatecznie metoda, która pozwoliła mi sprawić, że działa z Rails 4, była:

na starym serwerze

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

Musiałem użyć użytkownika Linuksa Postgres, aby utworzyć zrzut. musiałem także użyć -c, aby wymusić utworzenie bazy danych na nowym serwerze. --inserts mówi, aby używał składni INSERT (), która w innym przypadku nie działałaby dla mnie :(

następnie na nowym serwerze, simpy:

sudo su - postgres
psql new_database_name < dump.sql

aby przesłać plik dump.sql między serwerem, po prostu użyłem „cat” do wydrukowania zawartości, a następnie „nano” do odtworzenia jej podczas kopiowania zawartości.

Ponadto ROLA, której używałem w dwóch bazach danych, była inna, więc musiałem znaleźć-zastąpić całą nazwę właściciela na zrzucie.

pastullo
źródło
6

Zrzuć bazę danych: pg_dump database_name_name > backup.sql


Zaimportuj bazę danych z powrotem: psql db_name < backup.sql

Mister Jooyson
źródło
5

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

Referencje zaczerpnięte z tego bloga:

Linux Bash Shell Script do migracji danych mię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"

Właśnie migruję dane; utwórz pustą tabelę na docelowym / drugim serwerze bazy danych.

To jest skrypt narzędziowy. Ponadto można zmodyfikować skrypt do ogólnego użytku, na przykład dodając parametry dla nazwy hosta, nazwy bazy danych, nazwy tabeli i innych

Anvesh
źródło
5

Zaakceptowana odpowiedź jest poprawna, ale jeśli chcesz uniknąć interaktywnego wprowadzania hasła, możesz użyć tego:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
zoran
źródło