Przywrócić plik kopii zapasowej Postgres przy użyciu wiersza polecenia?

294

Jestem nowym użytkownikiem postgresql i lokalnie używam pgadmin3. Jednak na zdalnym serwerze nie mam takiego luksusu.

Utworzyłem już kopię zapasową bazy danych i skopiowałem ją, ale czy istnieje sposób na przywrócenie kopii zapasowej z wiersza poleceń? Widzę tylko rzeczy związane z GUI lub zrzutami pg_dump, więc jeśli ktoś może mi powiedzieć, jak to zrobić, byłoby wspaniale!

TwixxyKit
źródło

Odpowiedzi:

366

Dostępne są dwa narzędzia, w zależności od sposobu utworzenia pliku zrzutu.

Pierwszym źródłem informacji powinna być strona man, pg_dump(1)ponieważ to ona sama tworzy zrzut. To mówi:

Zrzuty mogą być wyprowadzane w formatach plików skryptów lub archiwów. Zrzuty skryptów to pliki tekstowe zawierające polecenia SQL wymagane do zrekonstruowania bazy danych do stanu, w jakim znajdowała się w momencie jej zapisywania. Aby przywrócić z takiego skryptu, podaj go do psql (1). Pliki skryptów można wykorzystać do odtworzenia bazy danych nawet na innych komputerach i innych architekturach; z pewnymi modyfikacjami, nawet w innych produktach bazodanowych SQL.

Alternatywne formaty plików archiwów muszą być użyte w pg_restore (1) do odbudowania bazy danych. Pozwalają pg_restore na wybiórcze odtwarzanie przywracanych elementów, a nawet na zmianę kolejności elementów przed przywróceniem. Formaty plików archiwów zaprojektowano tak, aby były przenośne w różnych architekturach.

To zależy od sposobu, w jaki został zrzucony. Prawdopodobnie możesz to rozgryźć za pomocą doskonałego file(1)polecenia - jeśli wspomina tekst ASCII i / lub SQL, należy go przywrócić, w psqlprzeciwnym razie prawdopodobnie powinieneś użyćpg_restore

Przywracanie jest dość łatwe:

psql -U username -d dbname < filename.sql

-- For Postgres versions 9.0 or earlier
psql -U username -d dbname -1 -f filename.sql

lub

pg_restore -U username -d dbname -1 filename.dump

Sprawdź odpowiednie strony - istnieje kilka opcji, które wpływają na działanie przywracania. Być może będziesz musiał wyczyścić swoje „aktywne” bazy danych lub odtworzyć je z szablonu0 (jak wskazano w komentarzu) przed przywróceniem, w zależności od sposobu wygenerowania zrzutów.

Steven Schlansker
źródło
3
IME praktycznie zawsze chcesz przywrócić do bazy danych, która została nowo utworzona z template0. W przeciwnym razie, jeśli wykonałeś coś takiego jak aktywacja plpgsql w szablonie 1, proces przywracania spróbuje to zrobić ponownie, a sugerowany przełącznik -1 oznacza, że ​​cała transakcja zakończy się niepowodzeniem. Więc coś w stylu „Createdb -T template0 seo2”, po którym następuje „pg_restore -v -d seo2 seo.pg”, aby przywrócić plik seo.pg (utworzony z bazy danych seo) do nowej bazy danych seo2. Jeśli plik kopii zapasowej jest tylko plikiem .sql, możesz ręcznie usunąć sprzeczne fragmenty.
araqnid
61
Nie można mieć -di -fjednocześnie. pg_restore: options -d/--dbname and -f/--file cannot be used together
CppLearner
8
W wersji 9.2 opcja „-f” określa plik wyjściowy, a nie plik zrzutu (i prawdopodobnie oznacza to to samo we wcześniejszych wersjach).
David Resnick
4
Jeśli chodzi o cannot be used together, zobacz tutaj: stackoverflow.com/questions/27882070/…
Abdull
3
@ Alex78191 oznacza, że ​​jest wykonywana jako pojedyncza transakcja, która może całkowicie zawieść i wycofać się lub przejść. Spowoduje to również zablokowanie dostępu do bazy danych.
ATN
216

Utwórz kopię zapasową

pg_dump -h localhost -p 5432 -U postgres -F c -b -v -f 
"/usr/local/backup/10.70.0.61.backup" old_db

-F c jest niestandardowym formatem (skompresowanym i zdolnym do wykonywania równolegle z -j N) -b obejmuje obiekty BLOB, -v jest pełny, -f jest nazwą pliku kopii zapasowej

przywróć z kopii zapasowej

pg_restore -h localhost -p 5432 -U postgres -d old_db -v 
"/usr/local/backup/10.70.0.61.backup"

ważne, aby ustawić -h localhost - opcję

pilot
źródło
2
Chciałbym wspomnieć, że przed wykonaniem tych poleceń powinieneś znaleźć się w folderze bin Posgresql . Na przykład w systemie Windows (jeśli zainstalowano go w folderze domyślnym) będzie to C: \ Program Files \ PostgreSQL \ 9.6 \ bin
juan_carlos_yl
90

Konieczne może być zalogowanie się postgres, aby mieć pełne uprawnienia do baz danych.

su - postgres
psql -l                      # will list all databases on Postgres cluster

pg_dump / pg_restore

  pg_dump -U username -f backup.dump database_name -Fc 

przełącznik -Fokreśl format pliku kopii zapasowej:

  • c użyje niestandardowego formatu PostgreSQL, który jest skompresowany i powoduje najmniejszy rozmiar pliku kopii zapasowej
  • d dla katalogu, w którym każdy plik jest jedną tabelą
  • t dla archiwum TAR (większy niż format niestandardowy)
  • -h/ --hostOkreśla nazwę hosta komputera, na którym działa serwer
  • -W/ --passwordWymuś pg_dumpmonit o podanie hasła przed połączeniem z bazą danych

przywracania kopii zapasowej:

   pg_restore -d database_name -U username -C backup.dump

Parametr -Cpowinien utworzyć bazę danych przed importowaniem danych. Jeśli to nie działa, zawsze możesz utworzyć bazę danych np. z poleceniem (jako użytkownik postgreslub inne konto, które ma uprawnienia do tworzenia baz danych)createdb db_name -O owner

pg_dump / psql

W przypadku, gdy nie podano argumentu -Fużyto domyślnego formatu zwykłego tekstu SQL (lub z -F p). Więc nie możesz użyć pg_restore. Możesz importować dane za pomocąpsql .

utworzyć kopię zapasową:

pg_dump -U username -f backup.sql database_name

przywracać:

psql -d database_name -f backup.sql
Tombart
źródło
Użyłem polecenia „psql -d nazwa_bazy_danych -f backup.sql”, aby przywrócić bazę danych, którą zrzuciłem z dokku na DigitalOcean. Działa świetnie.
NineBlindEyes
1
podczas korzystania z psql, jeśli użytkownik (np. postgres) ma ustawione hasło, -Wnależy użyć opcji. Na przykład na Ubuntu bez robienia su postgresgdziekolwiek z terminala $ psql -h localhost -U postgres -W -d DB_NAME < DB_BACKUP.sqljest polecenie, które działało dla mnie, aby przywrócić kopię zapasową na moim lokalnym hoście. Pamiętaj, że -hopcja jest potrzebna.
Jignesh Gohel,
@JiggneshhGohel Jak mówi instrukcja: -Wopcja nigdy nie jest niezbędna. pg_dumpautomatycznie poprosi o podanie hasła, jeśli serwer wymaga uwierzytelnienia za pomocą hasła. Możesz także użyć PGPASSWORDzmiennej env, jeśli używasz haseł w postaci zwykłego tekstu. -hjest potrzebny, jeśli ustawienie domyślne PGHOSTnie ma zastosowania. Te opcje są wspólne dla wielu narzędzi PostgreSQL, dlatego nie są niezbędne, aby odpowiedzieć na to pytanie (zależy to w dużej mierze od konfiguracji).
Tombart
@Tombart Twoja druga pg_dump/psqlczęść opcji to dla mnie praca. ale pierwsza część pg_dump/pg_restorenie działa dla mnie na przywracanie. Dziękuję Ci.
Anjan Biswas
@AnjanBiswas Pierwszą opcją jest użycie skompresowanego archiwum, które będzie wymagało więcej procesorów, ale plik kopii zapasowej zajmie mniej miejsca na dysku. Musisz tylko wybrać odpowiednią kompresję, np.-Fc
Tombart
60

POSTGRESQL 9.1.12

WYSYPISKO:

pg_dump -U user db_name > archive_name.sql

wprowadź hasło użytkownika i naciśnij enter.

PRZYWRACAĆ:

psql -U user db_name < /directory/archive.sql

wprowadź hasło użytkownika i naciśnij enter.

Natan Medeiros
źródło
31

Poniżej znajduje się moja wersja, pg_dumpktórej używam do przywrócenia bazy danych:

pg_restore -h localhost -p 5432 -U postgres -d my_new_database my_old_database.backup

lub użyj psql:

psql -h localhost -U postgres -p 5432 my_new_database < my_old_database.backup

gdzie -hhost, -pport, -unazwa użytkownika logowania, -dnazwa bazy danych

Yahor M.
źródło
2
Govind Singh, dlaczego zredagowałeś moją odpowiedź? twoje zmiany nie przynoszą nic nowego
Yahor M
1
my_new_databasepowinien już istnieć podczas korzystania psql, nie?
Elmex80s,
22

Tworzenie kopii zapasowych i przywracanie za pomocą GZIP

W przypadku bazy danych o większym rozmiarze jest to bardzo dobre

utworzyć kopię zapasową

pg_dump -U user -d mydb | gzip > mydb.pgsql.gz

przywracać

gunzip -c mydb.pgsql.gz | psql dbname -U user

https://www.postgresql.org/docs/9.1/static/backup-dump.html

Sarath Ak
źródło
1
W przypadku Ubuntu możesz użyć: gunzip -c mydb.pgsql.gz | sudo -u postgres psqlAby uzyskać uprawnienia do działania w bazie danych. Weź pod uwagę również --cleanflagę podczas zrzutu, która usunie wszystkie istniejące dane, może się przydać.
Sebastian,
Świetne i schludne rozwiązanie dla mnie. Dziękuję Ci!
Nam G VU,
11
Backup:  $ pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

Restore: $ psql -U {user-name} -d {desintation_db} -f {dumpfilename.sql}
Aaron Lelevier
źródło
8

To działało dla mnie:

pg_restore --verbose --clean --no-acl --no-owner --host=localhost --dbname=db_name --username=username latest.dump
Franz
źródło
Dzięki, --no-ownernaprawdę mi pomogło.
bonafernando
7

1. otwórz terminal.

2. wykonaj kopię zapasową bazy danych za pomocą następującego polecenia

twój postgres bin - /opt/PostgreSQL/9.1/bin/

Twój źródłowy serwer bazy danych - 192.168.1.111

lokalizacja i nazwa pliku kopii zapasowej - /home/dinesh/db/mydb.backup

twoja źródłowa nazwa db - moja baza danych

/opt/PostgreSQL/9.1/bin/pg_dump --host '192.168.1.111' --port 5432 - nazwa użytkownika "postgres" - brak hasła - format niestandardowy - blobs - plik "/ home / dinesh / db /mydb.backup ”„ moja baza danych ”

3. przywróć plik mydb.backup do miejsca docelowego.

serwer docelowy - localhost

nazwa docelowej bazy danych - moja baza danych

utwórz bazę danych, aby przywrócić kopię zapasową.

/opt/PostgreSQL/9.1/bin/psql -h 'localhost' -p 5432 -U postgres -c "UTWÓRZ BAZY DANYCH moja baza danych"

przywróć kopię zapasową.

/opt/PostgreSQL/9.1/bin/pg_restore --host „localhost” --port 5432 - nazwa użytkownika „postgres” - nazwa_db „moja baza danych” - brak hasła - czysta / home / dinesh / db / mydb. utworzyć kopię zapasową"

Dinesh-SriLanka
źródło
4

Jeśli utworzysz kopię zapasową za pomocą pg_dump, możesz łatwo przywrócić ją w następujący sposób:

  1. Otwórz okno wiersza poleceń
  2. Przejdź do folderu bin Postgres. Na przykład: cd "C:\ProgramFiles\PostgreSQL\9.5\bin"
  3. Wpisz polecenie, aby przywrócić bazę danych. For example: psql.exe -U postgres -d YourDatabase -f D:\Backup\.sql
  4. Wpisz hasło dla swojego użytkownika postgres
  5. Sprawdź proces przywracania

źródło
4

1) Otwórz terminal psql.

2) Rozpakuj / rozpakuj plik zrzutu.

3) Utwórz pustą bazę danych.

4) użyj następującego polecenia, aby przywrócić plik zrzutu

<database_name>-# \i <path_to_.dump_file>
Vaibhav Desai
źródło
4

Spróbuj tego:

psql -U <username> -d <dbname> -f <filename>.sql

Przywróć DB psql z pliku .sql

Faysal Maqsood
źródło
psql -U <nazwa_użytkownika> -d <nazwa_db> -f <nazwa_pliku> .sql
Faysal Maqsood
3

próbować:

pg_restore -h localhost -p 5432 -U <username> -d <dbname> -1 <filename>
Cristhian Gonzalez
źródło
2

Przywrócenie pliku kopii zapasowej Postgres zależy przede wszystkim od sposobu wykonania kopii zapasowej.

Jeśli użyłeś pg_dump z -F c lub -F d, musisz użyć pg_restore, w przeciwnym razie możesz po prostu użyć

psql -h localhost -p 5432 -U postgres <plik kopii zapasowej

9 sposobów tworzenia kopii zapasowych i przywracania baz danych Postgres

Prashant Kumar
źródło
Czy zdajesz sobie sprawę, że przegapiłeś część nazwy bazy danych i narzeka ona na to, że docelowa baza danych nie istnieje?
Pere
2

Spróbuj sprawdzić, czy następujące polecenia mogą ci pomóc:

sudo su - yourdbuser
psql
\i yourbackupfile
Mehmet Ali
źródło
2

Przepraszamy za nekropolię, ale te rozwiązania nie działały dla mnie. Jestem na postgres 10. W systemie Linux:

  1. Musiałem zmienić katalog na mój pg_hba.conf.
  2. Musiałem edytować plik, aby zmienić metodę z peer na md5, jak podano tutaj
  3. Uruchom ponownie usługę: service postgresql-10 restart
  4. Zmień katalog na lokalizację mojej kopii zapasowej.sql i uruchom:
    psql postgres -d database_name -1 -f backup.sql

    -nazwa_bazy danych to nazwa mojej bazy danych

    -backup.sql to nazwa mojego pliku kopii zapasowej .sql.

Tim
źródło
1

Miałem problemy z uwierzytelnieniem podczas uruchamiania pg_dump, więc przeniosłem plik zrzutu

mv database_dump /tmp

do katalogu temp, a następnie uruchomione

su -u postgres
cd /tmp
pg_restore database_dump

Jeśli masz duży zrzut bazy danych, możesz po prostu utworzyć inny katalog, w którym bieżący użytkownik i użytkownik postgres będą mogli uzyskać do niego dostęp i umieścić w nim plik zrzutu bazy danych.

użytkownik1876508
źródło
1

Jeśli masz zapasowy plik SQL, możesz go łatwo przywrócić. Postępuj zgodnie z instrukcjami podanymi poniżej

1. At first, create a database using pgAdmin or whatever you want (for example my_db is our created db name)
2. Now Open command line window
3. Go to Postgres bin folder. For example:  cd "C:\ProgramFiles\PostgreSQL\pg10\bin"
4. Enter the following command to restore your database: psql.exe -U postgres -d my_db -f D:\Backup\backup_file_name.sql 

W razie potrzeby wpisz hasło użytkownika postgres i pozwól Postgres wykonać swoją pracę. Następnie możesz sprawdzić proces przywracania.

Omar
źródło
0

Jeśli chcesz wykonać kopię zapasową danych lub przywrócić dane z kopii zapasowej, możesz uruchomić następujące polecenia:

  1. Aby utworzyć kopię zapasową danych, przejdź do katalogu postgres \ bin \ like, C:\programfiles\postgres\10\bin\a następnie wpisz następujące polecenie:

    pg_dump -FC -U ngb -d ngb -p 5432 >C:\BACK_UP\ngb.090718_after_readUpload.backup
  2. Aby przywrócić dane z kopii zapasowej, przejdź do katalogu postgres \ bin \ like, C:\programfiles\postgres\10\bin\a następnie wpisz poniżej polecenie:

    C:\programFiles\postgres\10\bin> pg_restore -Fc -U ngb -d ngb -p 5432 <C:\ngb.130918.backup

    Upewnij się, że plik kopii zapasowej istnieje.

Girjesh Kumar Suryawanshi
źródło
-3

Zobacz poniższy przykład jego działania

C: / Program Files / PostgreSQL / 9.4 / bin \ pg_restore.exe --host localhost --port 5432 - nazwa użytkownika „postgres” - nazwa_db „nowa baza danych” - brak hasła --verbose

C: \ Users \ Yogesh \ Downloads \ new Download \ DB.backup

użytkownik3881346
źródło