Chcę skopiować produkcyjną bazę danych PostgreSQL na serwer programistyczny. Jaki jest najszybszy i najłatwiejszy sposób na zrobienie tego?
Chcę skopiować produkcyjną bazę danych PostgreSQL na serwer programistyczny. Jaki jest najszybszy i najłatwiejszy sposób na zrobienie tego?
Odpowiedzi:
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ą psql
lub pg_dump
do 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 psql
przywracania. 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
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
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
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
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 .
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_basebackup
współ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:
listen_addresses = '*'
aby móc połączyć się z serwera docelowego. Upewnij się, że port 5432 jest w tym przypadku otwarty.max_wal_senders = 1
( -X fetch
), 2
dla -X stream
(domyślnie w przypadku PostgreSQL 12) lub więcej.wal_level = replica
lub wyższy, aby móc ustawić max_wal_senders > 0
.host replication postgres DST_IP/32 trust
w pg_hba.conf
. Zapewnia to dostęp do pg
klastra każdemu z DST_IP
komputera. 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
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
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.
Zrzuć bazę danych: pg_dump database_name_name > backup.sql
Zaimportuj bazę danych z powrotem: psql db_name < backup.sql
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
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}}