Come posso esportare lo schema di un database in PostgreSQL?


111

Il mio computer si è rotto ma fortunatamente ho eseguito il backup della cartella C: \ Program Files \ PostgreSQL.

Ora sto lavorando su un nuovo computer e vorrei importare i database Postgres precedenti che sono memorizzati nel disco esterno.

Vorrei esportare lo schema di un database specifico che si trova nella cartella di backup.

Il file PostgreSQL\8.3\data\global\pg_databasecontiene informazioni sui database e sui relativi OID; per esempio:

"db1" 20012
"db2" 23456

Vorrei esportare lo schema di "db1".

C'è una cartella denominata "20012" nella cartella "PostgreSQL\8.3\data\base\20012" che contiene molti file [500 file].

C'è un modo per esportare lo schema di quel database?

Si noti che tutti i file del database Postgresql si trovano in un disco rigido esterno e vorrei esportare lo schema di quel database in un file SQL, prendere quel file, eseguirlo e creare lo stesso identico database localmente.

Risposte:


141

Dovresti dare un'occhiata a pg_dump:

pg_dump -s databasename

Eseguirà il dump solo dello schema su stdout come .sql.

Per Windows, probabilmente vorrai chiamare pg_dump.exe. Non ho accesso a una macchina Windows ma sono abbastanza sicuro dalla memoria che sia il comando. Vedi se l'aiuto funziona anche per te.


sei sicuro che pg_dump funzionerà? Perché i file del database si trovano in un disco esterno e non in locale ...
programmatore

A condizione che sia possibile avviare il vecchio server di database, sì. pg_dump può connettersi in remoto a un server di database come probabilmente saprai. Tenterei di installare 8.3 sulla tua nuova macchina e copiare i tuoi vecchi file di database e avviare postgres e vedere se funziona. Pensavo stessi chiedendo più in generale di scaricare solo lo schema, colpa mia.
nuovo

ho già installato la versione 8.3 di postgresql, copiato la cartella dei dati nella nuova installazione, ma non riesco a vedere i miei vecchi database ...
programmatore

14
@ Nuovo grazie funziona. pg_dump -s databasename > schema.sqlpubblicherà il risultato nel schema.sqlfile
Arivarasan L

che ne dici dei tipi di dati personalizzati in questo caso?
Nikita

38

In Linux puoi fare così

pg_dump -U postgres -s postgres > exportFile.dmp

Forse può funzionare anche in Windows , se non prova lo stesso con pg_dump.exe

pg_dump.exe -U postgres -s postgres > exportFile.dmp

pg_dump: connessione [archiver (db)] al database "goldendemon" non riuscita: numero di porta non valido: "-s"
Jamie Hutber

33

Sto eseguendo Postgres 9.6 in cui ho dovuto esportare uno schema particolare insieme ai dati.

Ho usato il seguente comando:

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

Se desideri solo lo schema senza dati, utilizza l'opzione sinvece din

Di seguito è riportato l'elenco degli interruttori 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>.

11
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

Tieni presente che disponi di privilegi sufficienti per accedere a tale schema. Se si desidera eseguire il backup come utente specifico, aggiungere il nome utente in quel comando preceduto da-U


1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file> Modificare il flag da -d a -s per ottenere solo lo schema. Questo è solo per migliorare questo e anche altre persone hanno menzionato.
h0lmes221B

Questo richiederà l'intero DB: /
Jamie Hutber

7

Se vuoi solo creare tabelle, puoi farlo pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'


3

Per Linux: (dati esclusi)

  • pg_dump -s -t tablename databasename > dump.sql (Per una tabella specifica nel database)

  • pg_dump -s databasename > dump.sql (Per l'intero database)


2

configura un nuovo server postgresql e sostituisci la sua cartella dati con i file dal tuo disco esterno.

Sarai quindi in grado di avviare quel server postgresql e recuperare i dati usando pg_dump (pg_dump -s solo per lo schema come menzionato)


ho sostituito la cartella dei dati con quella vecchia, poi ho avviato il servizio, ho aperto l'applicazione pgAdmin III, ho cliccato sull'icona del server [ho solo 1 server, il precedente]. Devo creare un nuovo server? Perché non funziona ... vedo ancora i database che avevo creato all'inizio ... e non quelli di backup
programmatore

sei sicuro di aver inserito i file nella cartella dati corretta? Non ho usato postgresql in Windows, quindi non sono sicuro di dove sarebbe la cartella dei dati. Inoltre, non sono sicuro che pgAdmin memorizzi qualcosa nella cache, quindi potrebbe essere necessario riconnettersi ...
drone.ah

beh, ho appena copiato il vecchio file di dati di backup in C: \ Programmi \ PostgreSQL \ 8.3 e l'ho sostituito con quello nuovo. Inoltre, quando apro di nuovo pgAdmin, mi chiede la password del vecchio computer, questo è un buon segno ma successivamente nell'albero dei database non vedo i miei database
programmatore

Hm ... ho creato un database denominato "db1" [un database dal vecchio computer], quando ci clicco sopra pgAdmin restituisce "Si è verificato un errore: ricerca FATAL nella cache non riuscita per il database 20012", cosa significa?
programmatore

1
sembra che pgAdmin memorizzi nella cache molte informazioni. Rilascia la connessione al database in pgAdmin e ricreala. Questo dovrebbe risolverlo se il problema riguarda il caching ...
drone.ah

1

Dovresti usare qualcosa di simile pg_dump --schema=your_schema_name db1, per i dettagli dai un'occhiata qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.