Comment puis-je exporter le schéma d'une base de données dans PostgreSQL?

111

Mon ordinateur est tombé en panne mais, heureusement, j'ai sauvegardé le dossier C: \ Program Files \ PostgreSQL.

Maintenant, je travaille sur un nouvel ordinateur et je voudrais importer les bases de données Postgres précédentes qui sont stockées sur le disque externe.

Je souhaite exporter le schéma d'une base de données spécifique qui se trouve dans le dossier de sauvegarde.

Le fichier PostgreSQL\8.3\data\global\pg_databasecontient des informations sur les bases de données et leurs OID; par exemple:

"db1" 20012
"db2" 23456

Je voudrais exporter le schéma de "db1".

Il y a un dossier nommé "20012" dans le dossier "PostgreSQL\8.3\data\base\20012" qui contient beaucoup de fichiers [500 fichiers].

Existe-t-il un moyen d'exporter le schéma de cette base de données?

Notez que tous les fichiers de la base de données Postgresql sont situés sur un disque dur externe et je voudrais exporter le schéma de cette base de données dans un fichier SQL, prendre ce fichier, l'exécuter et créer la même base de données exacte localement.

programmeur
la source

Réponses:

141

Vous devriez jeter un œil à pg_dump:

pg_dump -s databasename

Videra uniquement le schéma sur stdout en tant que .sql.

Pour Windows, vous voudrez probablement appeler pg_dump.exe. Je n'ai pas accès à une machine Windows mais je suis presque sûr de mémoire que c'est la commande. Voyez si l'aide fonctionne pour vous aussi.

Un nouveau
la source
êtes-vous sûr que pg_dump fonctionnera? Parce que les fichiers de la base de données sont situés sur un disque externe et non localement ...
programmeur
À condition que vous puissiez démarrer l'ancien serveur de base de données, oui. pg_dump peut se connecter à distance à un serveur de base de données comme vous le savez probablement. J'essaierais d'installer 8.3 sur votre nouvelle machine et de copier vos anciens fichiers de base de données et de démarrer postgres et de voir si cela fonctionne. Je pensais que vous posiez une question plus générale sur le vidage du schéma uniquement, mon mauvais.
Anew
J'ai déjà installé la version 8.3 de postgresql, copié le dossier de données dans la nouvelle installation, mais je ne peux pas voir mes anciennes bases de données ...
programmeur
14
@Anew merci ça marche. pg_dump -s databasename > schema.sqlaffichera le résultat dans un schema.sqlfichier
Arivarasan L
qu'en est-il des types de données personnalisés dans ce cas?
Nikita du
38

Sous Linux, vous pouvez faire comme ça

pg_dump -U postgres -s postgres > exportFile.dmp

Peut-être que cela peut aussi fonctionner sous Windows , sinon essayez la même chose avec pg_dump.exe

pg_dump.exe -U postgres -s postgres > exportFile.dmp
lev09
la source
pg_dump: [archiver (db)] connexion à la base de données "goldendemon" a échoué: numéro de port non valide: "-s"
Jamie Hutber
33

J'utilise Postgres 9.6 où je devais exporter un schéma particulier avec des données.

J'ai utilisé la commande suivante:

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

Si vous voulez uniquement le schéma sans données, utilisez le commutateur sau lieu den

Voici la liste des commutateurs 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
la source
11
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

Veuillez noter que vous disposez des privilèges suffisants pour accéder à ce schéma. Si vous souhaitez effectuer une sauvegarde en tant qu'utilisateur spécifique, ajoutez le nom d'utilisateur dans cette commande précédé de-U

Alfons
la source
1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <emplacement du fichier de vidage> Changez l'indicateur de -d à -s pour obtenir uniquement le schéma. Ce n'est que pour améliorer cela et d'autres personnes l'ont également mentionné.
h0lmes221B
Cela prendra toute la DB: /
Jamie Hutber
7

Si vous ne voulez que créer des tables, vous pouvez faire pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'

une tige
la source
3

Pour Linux: (données exclues)

  • pg_dump -s -t tablename databasename > dump.sql (Pour une table spécifique dans la base de données)

  • pg_dump -s databasename > dump.sql (Pour toute la base de données)

Lalit Bangad
la source
2

configurez un nouveau serveur postgresql et remplacez son dossier de données par les fichiers de votre disque externe.

Vous pourrez alors démarrer ce serveur postgresql et récupérer les données en utilisant pg_dump (pg_dump -s pour le schéma uniquement comme mentionné)

drone.ah
la source
J'ai remplacé le dossier de données par l'ancien, puis j'ai démarré le service, ouvert l'application pgAdmin III, cliqué sur l'icône du serveur [je n'ai eu qu'un seul serveur, le précédent]. Dois-je créer un nouveau serveur? Parce que ça ne fonctionne pas ... Je vois toujours les bases de données que j'avais créées au début ... et pas celles de sauvegarde
programmeur
êtes-vous sûr d'avoir placé les fichiers dans le bon dossier de données? Je n'ai pas utilisé postgresql dans Windows, donc je ne suis pas sûr de l'emplacement du dossier de données. Je ne sais pas non plus si pgAdmin met en cache quelque chose, vous devrez peut-être vous reconnecter également ...
drone.ah
Eh bien, je viens de copier l'ancien fichier de données de sauvegarde dans C: \ Program Files \ PostgreSQL \ 8.3 et je l'ai remplacé par le nouveau. De plus, quand j'ouvre à nouveau pgAdmin, il demande le mot de passe de l'ancien ordinateur, c'est bon signe mais ensuite dans l'arborescence des bases de données, je ne vois pas mes bases de données
programmeur
Hm ... j'ai créé une base de données nommée "db1" [une base de données de l'ancien ordinateur], quand je clique dessus, le pgAdmin affiche "Une erreur s'est produite: la recherche de cache FATAL a échoué pour la base de données 20012", qu'est-ce que cela signifie?
programmeur
1
il semble que pgAdmin met en cache beaucoup d'informations. Déposez votre connexion à la base de données dans pgAdmin et recréez-la. Cela devrait le résoudre si le problème concerne la mise en cache ...
drone.ah
1

Vous devriez utiliser quelque chose comme ça pg_dump --schema=your_schema_name db1, pour plus de détails, regardez ici

Hayk Petrosyan
la source