Wie kann ich das Schema einer Datenbank in PostgreSQL exportieren?

111

Mein Computer ist ausgefallen, aber zum Glück habe ich den Ordner C: \ Programme \ PostgreSQL gesichert.

Jetzt arbeite ich auf einem neuen Computer und möchte die vorherigen Postgres-Datenbanken importieren, die auf der externen Festplatte gespeichert sind.

Ich möchte das Schema einer bestimmten Datenbank exportieren, die sich im Sicherungsordner befindet.

Die Datei PostgreSQL\8.3\data\global\pg_databaseenthält Informationen zu Datenbanken und deren OIDs. beispielsweise:

"db1" 20012
"db2" 23456

Ich möchte das Schema von "db1" exportieren.

Es gibt einen Ordner mit dem Namen "20012" im Ordner "PostgreSQL\8.3\data\base\20012" , der viele Dateien enthält [500 Dateien].

Gibt es eine Möglichkeit, das Schema dieser Datenbank zu exportieren?

Beachten Sie, dass sich alle Postgresql-Datenbankdateien auf einer externen Festplatte befinden und ich das Schema dieser Datenbank in eine SQL-Datei exportieren, diese Datei übernehmen, ausführen und lokal genau dieselbe Datenbank erstellen möchte.

Programmierer
quelle

Antworten:

141

Sie sollten sich Folgendes ansehen pg_dump:

pg_dump -s databasename

Gibt nur das Schema als .sql an stdout aus.

Für Windows möchten Sie wahrscheinlich anrufen pg_dump.exe. Ich habe keinen Zugriff auf einen Windows-Computer, bin mir aber aus dem Speicher ziemlich sicher, dass dies der Befehl ist. Überprüfen Sie, ob die Hilfe auch für Sie funktioniert.

Eine neue
quelle
Bist du sicher, dass pg_dump funktionieren wird? Weil sich die Dateien der Datenbank auf einer externen Festplatte befinden und nicht lokal ...
Programmierer
Vorausgesetzt, Sie können den alten Datenbankserver starten, ja. Wie Sie wahrscheinlich wissen, kann pg_dump eine Remoteverbindung zu einem Datenbankserver herstellen. Ich würde versuchen, 8.3 auf Ihrem neuen Computer zu installieren, Ihre alten Datenbankdateien zu kopieren und postgres zu starten und zu prüfen, ob dies funktioniert. Ich dachte, Sie fragen allgemeiner nach dem Dumping des Schemas, mein schlechtes.
Neu
Ich habe bereits die 8.3-Version von Postgresql installiert, den Datenordner in die neue Installation kopiert, aber ich kann meine alten Datenbanken nicht sehen ...
Programmierer
14
@ Neu danke danke es funktioniert. pg_dump -s databasename > schema.sqlwird das Ergebnis in schema.sqlDatei
ausgeben
Wie wäre es in diesem Fall mit benutzerdefinierten Datentypen?
Nikita
38

Unter Linux können Sie dies tun

pg_dump -U postgres -s postgres > exportFile.dmp

Vielleicht kann es auch unter Windows funktionieren , wenn Sie es nicht mit pg_dump.exe versuchen

pg_dump.exe -U postgres -s postgres > exportFile.dmp
lev09
quelle
33

Ich verwende Postgres 9.6, bei dem ich ein bestimmtes Schema zusammen mit Daten exportieren musste.

Ich habe den folgenden Befehl verwendet:

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

Wenn Sie nur das Schema ohne Daten möchten, verwenden Sie sstattdessen den Schaltern

Unten ist die Schalterliste 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
quelle
10
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

Bitte beachten Sie, dass Sie über ausreichende Berechtigungen verfügen, um auf dieses Schema zuzugreifen. Wenn Sie eine Sicherung als bestimmten Benutzer erstellen möchten, fügen Sie den Benutzernamen in den vorangestellten Befehl ein-U

Alfons
quelle
1
pg_dump -s <Datenbankname> -h <Hostname> -p <Port> -n <Schemaname> -f <Speicherort der Speicherauszugsdatei> Ändern Sie das Flag von -d in -s, um nur das Schema abzurufen. Dies dient nur dazu, dies zu verbessern, und andere Leute haben es ebenfalls erwähnt.
h0lmes221B
7

Wenn Sie nur Tabellen erstellen möchten, können Sie dies tun pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'

Eine Stange
quelle
3

Für Linux: (Daten ausgeschlossen)

  • pg_dump -s -t tablename databasename > dump.sql (Für eine bestimmte Tabelle in der Datenbank)

  • pg_dump -s databasename > dump.sql (Für die gesamte Datenbank)

Lalit Bangad
quelle
2

Richten Sie einen neuen Postgresql-Server ein und ersetzen Sie dessen Datenordner durch die Dateien von Ihrer externen Festplatte.

Sie können dann diesen Postgresql-Server starten und die Daten mit pg_dump abrufen (pg_dump -s nur für das Schema, wie erwähnt).

drone.ah
quelle
Ich habe den Datenordner durch den alten ersetzt, dann den Dienst gestartet, die pgAdmin III-Anwendung geöffnet und auf das Serversymbol geklickt [ich habe nur 1 Server, den vorherigen]. Soll ich einen neuen Server erstellen? Weil es nicht funktioniert ... Ich sehe immer noch die Datenbanken, die ich zu Beginn erstellt habe ... und nicht die Backup-Datenbanken
Programmierer
Sind Sie sicher, dass Sie die Dateien in den richtigen Datenordner verschoben haben? Ich habe postgresql in Windows nicht verwendet, daher bin ich mir nicht sicher, wo sich der Datenordner befinden würde. Ich bin mir auch nicht sicher, ob pgAdmin irgendetwas zwischenspeichert, so dass Sie möglicherweise auch eine
neue
Nun, ich habe gerade die alte Sicherungsdatendatei in C: \ Programme \ PostgreSQL \ 8.3 kopiert und durch die neue ersetzt. Auch wenn ich pgAdmin wieder öffne, fragt es nach dem Passwort des alten Computers, das ist ein gutes Zeichen, aber danach im Datenbankbaum sehe ich meine Datenbanken nicht
Programmierer
Hm ... ich habe eine Datenbank mit dem Namen "db1" [eine Datenbank vom alten Computer] erstellt. Wenn ich darauf klicke, gibt pgAdmin "Ein Fehler ist aufgetreten: Die Suche nach dem FATAL-Cache für die Datenbank 20012 ist fehlgeschlagen". Was bedeutet das?
Programmierer
1
es sieht so aus, als ob pgAdmin viele Informationen zwischenspeichert. Löschen Sie Ihre Datenbankverbindung in pgAdmin und erstellen Sie sie neu. Das sollte es lösen, wenn das Problem beim Zwischenspeichern liegt ...
drone.ah
1

Sie sollten so etwas verwenden pg_dump --schema=your_schema_name db1, Details finden Sie hier

Hayk Petrosyan
quelle