¿Cómo puedo exportar el esquema de una base de datos en PostgreSQL?

111

Mi computadora se averió, pero afortunadamente hice una copia de seguridad de la carpeta C: \ Archivos de programa \ PostgreSQL.

Ahora estoy trabajando en una computadora nueva y me gustaría importar las bases de datos de Postgres anteriores que están almacenadas en el disco externo.

Me gustaría exportar el esquema de una base de datos específica que se encuentra en la carpeta de respaldo.

El archivo PostgreSQL\8.3\data\global\pg_databasecontiene información sobre bases de datos y sus OID; por ejemplo:

"db1" 20012
"db2" 23456

Me gustaría exportar el esquema de "db1".

Hay una carpeta llamada "20012" en la carpeta "PostgreSQL\8.3\data\base\20012" que contiene muchos archivos [500 archivos].

¿Hay alguna forma de exportar el esquema de esa base de datos?

Tenga en cuenta que todos los archivos de la base de datos de Postgresql están ubicados en un disco duro externo y me gustaría exportar el esquema de esa base de datos en un archivo SQL, tomar ese archivo, ejecutarlo y crear la misma base de datos exacta localmente.

programador
fuente

Respuestas:

141

Deberías echarle un vistazo a pg_dump:

pg_dump -s databasename

Volcará solo el esquema en stdout como .sql.

Para Windows, probablemente querrás llamar pg_dump.exe. No tengo acceso a una máquina con Windows, pero estoy bastante seguro de que ese es el comando. Vea si la ayuda también funciona para usted.

De nuevo
fuente
¿Estás seguro de que pg_dump va a funcionar? Porque los archivos de la base de datos están ubicados en un disco externo y no localmente ...
programador
Siempre que pueda iniciar el antiguo servidor de base de datos, sí. pg_dump puede conectarse de forma remota a un servidor de base de datos como probablemente sepa. Intentaría instalar 8.3 en su nueva máquina y copiar sus archivos de base de datos antiguos y comenzar a postgres y ver si funciona. Pensé que estabas preguntando de manera más general acerca de deshacerse del esquema solamente, mi mal.
nuevo
Ya instalé la versión 8.3 de postgresql, copié la carpeta de datos en la nueva instalación, pero no puedo ver mis bases de datos antiguas ...
programador
14
@Nuevo gracias funciona. pg_dump -s databasename > schema.sqlgenerará el resultado en un schema.sqlarchivo
Arivarasan L
¿Qué hay de los tipos de datos personalizados en este caso?
Nikita
38

En Linux puedes hacer esto

pg_dump -U postgres -s postgres > exportFile.dmp

Tal vez también pueda funcionar en Windows , si no intenta lo mismo con pg_dump.exe

pg_dump.exe -U postgres -s postgres > exportFile.dmp
lev09
fuente
pg_dump: [archiver (db)] la conexión a la base de datos "goldendemon" falló: número de puerto no válido: "-s"
Jamie Hutber
33

Estoy ejecutando Postgres 9.6 donde tuve que exportar un esquema particular junto con los datos.

Usé el siguiente comando:

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

Si solo desea el esquema sin datos, use el interruptor en slugar den

A continuación se muestra la lista de conmutadores 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
fuente
11
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

Tenga en cuenta que tiene suficientes privilegios para acceder a ese esquema. Si desea realizar una copia de seguridad como usuario específico, agregue el nombre de usuario en ese comando precedido por-U

alfons
fuente
1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <ubicación del archivo de volcado> Cambie el indicador de -d a -s para obtener solo el esquema. Esto es solo para mejorar esto y otras personas también lo han mencionado.
h0lmes221B
Esto tomará todo el DB: /
Jamie Hutber
7

Si solo desea crear tablas, puede hacerlo pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'

una varilla
fuente
3

Para Linux: (datos excluidos)

  • pg_dump -s -t tablename databasename > dump.sql (Para una tabla específica en la base de datos)

  • pg_dump -s databasename > dump.sql (Para toda la base de datos)

Lalit Bangad
fuente
2

configure un nuevo servidor postgresql y reemplace su carpeta de datos con los archivos de su disco externo.

Luego podrá iniciar ese servidor postgresql y recuperar los datos usando pg_dump (pg_dump -s para el esquema solo como se mencionó)

drone.ah
fuente
Reemplacé la carpeta de datos con la anterior, luego inicié el servicio, abrí la aplicación pgAdmin III, hice clic en el ícono del servidor [obtuve solo 1 servidor, el anterior]. ¿Debo crear un nuevo servidor? Porque no funciona ... sigo viendo las bases de datos que creé al principio ... y no las de respaldo
programador
¿Está seguro de que colocó los archivos en la carpeta de datos correcta? No he usado postgresql en Windows, por lo que no estoy seguro de dónde estaría la carpeta de datos. Tampoco estoy seguro de si pgAdmin almacena en caché algo, por lo que es posible que deba volver a conectarse también ...
drone.ah
Bueno, acabo de copiar el antiguo archivo de datos de respaldo en C: \ Archivos de programa \ PostgreSQL \ 8.3 y lo reemplacé por el nuevo. Además, cuando abro pgAdmin nuevamente, me pide la contraseña de la computadora anterior, eso es una buena señal, pero luego en el árbol de bases de datos no veo mis bases de datos
programador
Hm ... creé una base de datos llamada "db1" [una base de datos de la computadora antigua], cuando hago clic en ella, pgAdmin muestra "Ha ocurrido un error: FATAL cache lookup fall for database 20012", ¿qué significa eso?
programador
1
parece que pgAdmin almacena en caché mucha información. Elimine la conexión de su base de datos en pgAdmin y vuelva a crearla. Eso debería resolverlo si el problema está relacionado con el almacenamiento en caché ...
drone.ah
1

Deberías usar algo como esto pg_dump --schema=your_schema_name db1, para más detalles, echa un vistazo aquí

Hayk Petrosyan
fuente