Jak mogę wyeksportować schemat bazy danych w PostgreSQL?

111

Mój komputer się zepsuł, ale na szczęście utworzyłem kopię zapasową folderu C: \ Program Files \ PostgreSQL.

Teraz pracuję na nowym komputerze i chciałbym zaimportować poprzednie bazy danych Postgres, które są przechowywane na dysku zewnętrznym.

Chciałbym wyeksportować schemat konkretnej bazy danych, która znajduje się w folderze kopii zapasowej.

Plik PostgreSQL\8.3\data\global\pg_databasezawiera informacje o bazach danych i ich identyfikatorach OID; na przykład:

"db1" 20012
"db2" 23456

Chciałbym wyeksportować schemat „db1”.

W folderze znajduje się folder o nazwie „20012”, "PostgreSQL\8.3\data\base\20012" który zawiera wiele plików [500 plików].

Czy istnieje sposób na wyeksportowanie schematu tej bazy danych?

Zwróć uwagę, że wszystkie pliki bazy danych Postgresql znajdują się na zewnętrznym dysku twardym i chciałbym wyeksportować schemat tej bazy danych w pliku SQL, pobrać ten plik, uruchomić go i utworzyć lokalnie tę samą dokładną bazę danych.

programista
źródło

Odpowiedzi:

141

Powinieneś spojrzeć na pg_dump:

pg_dump -s databasename

Zrzuci tylko schemat na standardowe wyjście jako .sql.

W przypadku systemu Windows prawdopodobnie będziesz chciał zadzwonić pg_dump.exe. Nie mam dostępu do komputera z systemem Windows, ale jestem prawie pewien, że z pamięci to polecenie. Sprawdź, czy pomoc działa również dla Ciebie.

Nowo
źródło
czy jesteś pewien, że pg_dump będzie działać? Bo pliki bazy danych znajdują się na dysku zewnętrznym a nie lokalnie ...
programista
Pod warunkiem, że możesz uruchomić stary serwer bazy danych, tak. pg_dump może łączyć się zdalnie z serwerem bazy danych, jak zapewne wiesz. Spróbowałbym zainstalować 8.3 na nowym komputerze i skopiować stare pliki bazy danych, uruchomić postgres i sprawdzić, czy to zadziała. Myślałem, że bardziej ogólnie pytasz o zrzucenie schematu, mój błąd.
Ponownie
mam już zainstalowaną wersję 8.3 postgresql, skopiowałem folder danych do nowej instalacji, ale nie widzę moich starych baz danych ...
programista
14
@Anew dzięki, to działa. pg_dump -s databasename > schema.sqlzapisze wynik do schema.sqlpliku
Arivarasan L
a co z niestandardowymi typami danych w tym przypadku?
Nikita
38

W Linuksie możesz to zrobić

pg_dump -U postgres -s postgres > exportFile.dmp

Może może działać również w systemie Windows , jeśli nie, spróbuj tego samego z pg_dump.exe

pg_dump.exe -U postgres -s postgres > exportFile.dmp
lev09
źródło
pg_dump: [archiwizator (db)] połączenie z bazą danych „goldendemon” nie powiodło się: nieprawidłowy numer portu: „-s”
Jamie Hutber
33

Korzystam z Postgres 9.6, w którym musiałem wyeksportować określony schemat wraz z danymi.

Użyłem następującego polecenia:

pg_dump.exe -U username -d databasename -n schemaname > C:\mylocation\mydumpfilename.dmp

Jeśli potrzebujesz tylko schematu bez danych, użyj przełącznika szamiastn

Poniżej znajduje się lista przełączników pg_dump:

C:\Program Files\PostgreSQL\9.6\bin>pg_dump --help
pg_dump dumps a database as a text file or to other formats.

Usage:
  pg_dump [OPTION]... [DBNAME]

General options:
  -f, --file=FILENAME          output file or directory name
  -F, --format=c|d|t|p         output file format (custom, directory, tar,
                               plain text (default))
  -j, --jobs=NUM               use this many parallel jobs to dump
  -v, --verbose                verbose mode
  -V, --version                output version information, then exit
  -Z, --compress=0-9           compression level for compressed formats
  --lock-wait-timeout=TIMEOUT  fail after waiting TIMEOUT for a table lock
  -?, --help                   show this help, then exit

Options controlling the output content:
  -a, --data-only              dump only the data, not the schema
  -b, --blobs                  include large objects in dump
  -c, --clean                  clean (drop) database objects before recreating
  -C, --create                 include commands to create database in dump
  -E, --encoding=ENCODING      dump the data in encoding ENCODING
  -n, --schema=SCHEMA          dump the named schema(s) only
  -N, --exclude-schema=SCHEMA  do NOT dump the named schema(s)
  -o, --oids                   include OIDs in dump
  -O, --no-owner               skip restoration of object ownership in
                               plain-text format
  -s, --schema-only            dump only the schema, no data
  -S, --superuser=NAME         superuser user name to use in plain-text format
  -t, --table=TABLE            dump the named table(s) only
  -T, --exclude-table=TABLE    do NOT dump the named table(s)
  -x, --no-privileges          do not dump privileges (grant/revoke)
  --binary-upgrade             for use by upgrade utilities only
  --column-inserts             dump data as INSERT commands with column names
  --disable-dollar-quoting     disable dollar quoting, use SQL standard quoting
  --disable-triggers           disable triggers during data-only restore
  --enable-row-security        enable row security (dump only content user has
                               access to)
  --exclude-table-data=TABLE   do NOT dump data for the named table(s)
  --if-exists                  use IF EXISTS when dropping objects
  --inserts                    dump data as INSERT commands, rather than COPY
  --no-security-labels         do not dump security label assignments
  --no-synchronized-snapshots  do not use synchronized snapshots in parallel jobs
  --no-tablespaces             do not dump tablespace assignments
  --no-unlogged-table-data     do not dump unlogged table data
  --quote-all-identifiers      quote all identifiers, even if not key words
  --section=SECTION            dump named section (pre-data, data, or post-data)
  --serializable-deferrable    wait until the dump can run without anomalies
  --snapshot=SNAPSHOT          use given snapshot for the dump
  --strict-names               require table and/or schema include patterns to
                               match at least one entity each
  --use-set-session-authorization
                               use SET SESSION AUTHORIZATION commands instead of
                               ALTER OWNER commands to set ownership

Connection options:
  -d, --dbname=DBNAME      database to dump
  -h, --host=HOSTNAME      database server host or socket directory
  -p, --port=PORT          database server port number
  -U, --username=NAME      connect as specified database user
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)
  --role=ROLENAME          do SET ROLE before dump

If no database name is supplied, then the PGDATABASE environment
variable value is used.

Report bugs to <pgsql-bugs@postgresql.org>.
James Jithin
źródło
11
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

Zwróć uwagę, że masz wystarczające uprawnienia dostępu do tego schematu. Jeśli chcesz wykonać kopię zapasową jako określony użytkownik, dodaj nazwę użytkownika w tym poleceniu poprzedzoną-U

alfons
źródło
1
pg_dump -s <nazwa bazy danych> -h <nazwa hosta> -p <port> -n <nazwa katalogu> -f <lokalizacja pliku zrzutu> Zmień flagę z -d na -s, aby uzyskać tylko schemat. Ma to na celu tylko poprawę tego, a inne osoby również wspomniały.
h0lmes221B
To zajmie cały DB: /
Jamie Hutber
7

Jeśli chcesz tylko tworzyć tabele, możesz to zrobić pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'

arod
źródło
3

Dla Linux: (dane wyłączone)

  • pg_dump -s -t tablename databasename > dump.sql (Dla określonej tabeli w bazie danych)

  • pg_dump -s databasename > dump.sql (Dla całej bazy danych)

Lalit Bangad
źródło
2

skonfiguruj nowy serwer postgresql i zamień jego folder danych na pliki z dysku zewnętrznego.

Będziesz wtedy mógł uruchomić ten serwer postgresql i pobrać dane za pomocą pg_dump (pg_dump -s tylko dla schematu, jak wspomniano)

drone.ah
źródło
Zastąpiłem folder danych starym, następnie uruchomiłem usługę, otworzyłem aplikację pgAdmin III, kliknąłem w ikonę serwera [mam tylko 1 serwer, poprzedni]. Czy mam utworzyć nowy serwer? Bo to nie działa ... Nadal widzę bazy danych, które utworzyłem na początku ... a nie te zapasowe
programista
Czy na pewno umieściłeś pliki w odpowiednim folderze danych? Nie korzystałem z postgresql w systemie Windows, więc nie jestem pewien, gdzie będzie folder danych. Nie jestem też pewien, czy pgAdmin cokolwiek buforuje, więc może być konieczne ponowne połączenie ...
drone.ah
cóż, właśnie skopiowałem stary plik danych kopii zapasowej w C: \ Program Files \ PostgreSQL \ 8.3 i zastąpiłem go nowym. Ponadto, kiedy ponownie otwieram pgAdmin, prosi o hasło starego komputera, to dobry znak, ale potem w drzewie baz danych nie widzę moich baz danych
programista
Hm ... utworzyłem bazę danych o nazwie „db1” [baza danych ze starego komputera], po kliknięciu na nią pgAdmin wyświetla komunikat „Wystąpił błąd: FATAL wyszukiwanie pamięci podręcznej nie powiodło się dla bazy danych 20012”, co to oznacza?
programista
1
wygląda na to, że pgAdmin buforuje wiele informacji. Porzuć połączenie z bazą danych w pgAdmin i utwórz je ponownie. To powinno rozwiązać problem, jeśli problem dotyczy buforowania ...
drone.ah
1

Powinieneś użyć czegoś takiego pg_dump --schema=your_schema_name db1, po szczegóły zajrzyj tutaj

Hayk Petrosyan
źródło