Jak utworzyć kopię zapasową pojedynczej tabeli w bazie danych postgres?

160

Czy istnieje sposób na utworzenie kopii zapasowej pojedynczej tabeli w bazie danych przy użyciu postgres? I jak? Czy to działa również z poleceniem pg_dump?

Elitmiar
źródło

Odpowiedzi:

211

Służy --tabledo określania pg_dumptabeli, którą ma wykonać kopię zapasową:

pg_dump --host localhost --port 5432 --username postgres --format plain --verbose --file "<abstract_file_path>" --table public.tablename dbname
Frank Heikens
źródło
9
I jak przywrócić ten plik kopii zapasowej. (.backup), użyłem, pg_restore --host localhost --port 5432 --username postgres --dbname "anydb" --table public.tablename -Ft --verbose "/path/filename.backup"ale wyszło:pg_restore: [tar archiver] corrupt tar header found in --
Anderson Dorregaray Linares
13
psql -U username -d database -1 -f your_dump.sql
rnaud
5
co miałeś na myśli: abstract_file_path?
bandungeuy
3
Nie jestem pewien, dlaczego głosowano na tę odpowiedź, ludzie klikają +1 bez sprawdzania rzeczy samodzielnie ani próbowania. Problem z tą odpowiedzią, który czyni ją całkowicie bezużyteczną, polega na tym, że podane rozwiązanie / polecenia nie eksportują sekwencji utworzonych w tabeli (klucz podstawowy), więc import się nie powiedzie. Nie znam pojedynczej produkcyjnej bazy danych PG, która nie używa kluczy podstawowych z sekwencjami. To połowa odpowiedzi, nie daje wyczerpującej odpowiedzi na pytanie i wymaga dodatkowej pracy, aby wyeksportować / zaimportować pojedynczą tabelę.
user10664542
1
z nieco innym zwrotem akcji sudo od tego, skończyło się na błędzie uprawnień do zrzutu pliku (jest to logiczne, ponieważ użytkownik postgres nie ma dostępu do zapisu w moich katalogach) i miałem nieznany błąd flagi dla --ignore-version. Odpowiedź Prashanta Kumara, która jest prostsza, zadziałała dla mnie.
JL Peyret
84

Jeśli korzystasz z Ubuntu,

  1. Zaloguj się do swojego użytkownika postgres sudo su postgres
  2. pg_dump -d <database_name> -t <table_name> > file.sql

Upewnij się, że jesteś wykonaniem polecenia, gdzie postgresużytkownik ma uprawnienia do zapisu (np /tmp)

Edytować

Jeśli chcesz zrzucić plik .sql na inny komputer, możesz rozważyć pominięcie informacji o właścicielu zapisywanych w pliku .sql.

Możesz użyć pg_dump --no-owner -d <database_name> -t <table_name> > file.sql

Sri Harsha Kappala
źródło
1
A co, jeśli chcesz mieć wszystkie tabele bez konieczności określania nazwy każdej z nich?
shekeine
3
Po prostu usuń opcję -t! pg_dump -d <database_name> > file.sql
Sri Harsha Kappala,
4
Nie wiem dlaczego, ale opcja -d nie jest poprawna dla psql9.3 i podana komenda nie działa dla mnie. Działający to pg_dump -U nazwa_użytkownika nazwa_bazy -t nazwa_tabeli> nazwa_pliku .
serkan kucukbay
pg_dump -t <table_name> <database_name> > file.sql
Sriram
@ user10664542: Przeczytaj instrukcję, a szczególnie ten rozdział: „W tym celu„ tabela ”obejmuje widoki, zmaterializowane widoki, sekwencje i obce tabele”.
Frank Heikens
42

pg_dump -h localhost -p 5432 -U postgres -d mydb -t moja_tabela> backup.sql

Możesz wykonać kopię zapasową pojedynczej tabeli, ale sugerowałbym wykonanie kopii zapasowej całej bazy danych, a następnie przywrócenie dowolnej tabeli, której potrzebujesz. Zawsze dobrze jest mieć kopię zapasową całej bazy danych.

9 sposobów korzystania z pg_dump

Prashant Kumar
źródło
Nie jestem pewien, dlaczego głosowano na tę odpowiedź, ludzie klikają +1 bez sprawdzania rzeczy samodzielnie ani próbowania. Problem z tą odpowiedzią, który czyni ją całkowicie bezużyteczną, polega na tym, że podane rozwiązanie / polecenia nie eksportują sekwencji utworzonych w tabeli (klucz podstawowy), więc import się nie powiedzie. Nie znam pojedynczej produkcyjnej bazy danych PG, która nie używa kluczy podstawowych z sekwencjami. To połowa odpowiedzi, nie daje wyczerpującej odpowiedzi na pytanie i wymaga dodatkowej pracy, aby wyeksportować / zaimportować pojedynczą tabelę.
user10664542
jak wspomniano powyżej, mam silne podejrzenie, że użytkownik10664542, bez żadnych odpowiedzi SO postgres na jego nazwisko, jest tutaj poza jego głębią. podczas gdy sekwencja powoduje dodatkowe komplikacje, wystarczająco dużo głosów pozytywnych jest przy podobnych odpowiedziach, że ludzie prawdopodobnie sprawili, że działali, nawet jeśli musieli dostosować sekwencję po fakcie. gdybym musiał przywrócić zrzut, szukałbym sposobów zaktualizowania ostatniego identyfikatora sekwencji z a max(id)na moim stole. to jest odpowiedź, która zadziałała i jestem przekonany, patrząc na wygenerowany sql, że mogłem go przywrócić.
JL Peyret
9

Jeśli wolisz graficzny interfejs użytkownika, możesz użyć pgAdmin III (Linux / Windows / OS X). Wystarczy kliknąć prawym przyciskiem myszy wybrany stół, a następnie wybrać opcję „kopia zapasowa”. Stworzy pg_dumpdla ciebie polecenie.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Franck Dernoncourt
źródło
2

Jako dodatek do odpowiedzi Franka Heikena, jeśli chcesz użyć INSERTinstrukcji zamiast copy from stdin, powinieneś określić --insertsflagę

pg_dump --host localhost --port 5432 --username postgres --format plain --verbose --file "<abstract_file_path>" --table public.tablename --inserts dbname

Zauważ, że pominąłem --ignore-versionflagę, ponieważ jest przestarzała.

user3207874
źródło
Nie jestem pewien, dlaczego głosowano na tę odpowiedź, ludzie klikają +1 bez sprawdzania rzeczy samodzielnie ani próbowania. Problem z tą odpowiedzią, który czyni ją całkowicie bezużyteczną, polega na tym, że podane rozwiązanie / polecenia nie eksportują sekwencji utworzonych w tabeli (klucz podstawowy), więc import się nie powiedzie. Nie znam pojedynczej produkcyjnej bazy danych PG, która nie używa kluczy podstawowych z sekwencjami. To połowa odpowiedzi, nie daje wyczerpującej odpowiedzi na pytanie i wymaga dodatkowej pracy, aby wyeksportować / zaimportować pojedynczą tabelę.
user10664542