Bagaimana cara mengekspor skema database di PostgreSQL?

111

Komputer saya rusak tetapi untungnya saya membuat cadangan folder C: \ Program Files \ PostgreSQL.

Sekarang saya bekerja di komputer baru dan saya ingin mengimpor database Postgres sebelumnya yang disimpan di disk eksternal.

Saya ingin mengekspor skema database tertentu yang terletak di folder cadangan.

File tersebut PostgreSQL\8.3\data\global\pg_databaseberisi informasi tentang database dan OID-nya; sebagai contoh:

"db1" 20012
"db2" 23456

Saya ingin mengekspor skema "db1".

Ada folder bernama "20012" di folder "PostgreSQL\8.3\data\base\20012" yang berisi banyak file [500 file].

Apakah ada cara untuk mengekspor skema database itu?

Perhatikan bahwa semua file database Postgresql terletak di hard disk eksternal dan saya ingin mengekspor skema database itu dalam file SQL, mengambil file itu, menjalankannya, dan membuat database yang sama persis secara lokal.

programmer
sumber

Jawaban:

141

Anda harus melihat pg_dump:

pg_dump -s databasename

Hanya akan membuang skema ke stdout sebagai .sql.

Untuk Windows, Anda mungkin ingin menelepon pg_dump.exe. Saya tidak memiliki akses ke mesin Windows tetapi saya cukup yakin dari memori itulah perintahnya. Lihat apakah bantuan tersebut berhasil untuk Anda juga.

Lagi
sumber
apakah kamu yakin pg_dump akan bekerja? Penyebab file database terletak di disk eksternal dan bukan secara lokal ...
programmer
Asalkan Anda bisa memulai server database lama, ya. pg_dump dapat terhubung dari jarak jauh ke server database seperti yang mungkin Anda ketahui. Saya akan mencoba menginstal 8.3 di mesin baru Anda dan menyalin file database lama Anda dan memulai postgres dan melihat apakah itu berfungsi. Saya pikir Anda bertanya secara lebih umum tentang membuang skema saja, saya salah.
Baru
saya telah menginstal postgresql versi 8.3, menyalin folder data ke instalasi baru, tetapi saya tidak dapat melihat database lama saya ...
programmer
14
@Terima kasih baru berhasil. pg_dump -s databasename > schema.sqlakan menampilkan hasilnya ke dalam schema.sqlfile
Arivarasan L
bagaimana dengan tipe data khusus dalam kasus ini?
Nikita
38

Di Linux Anda bisa melakukan seperti ini

pg_dump -U postgres -s postgres > exportFile.dmp

Mungkin bisa juga bekerja di Windows , jika tidak coba sama dengan pg_dump.exe

pg_dump.exe -U postgres -s postgres > exportFile.dmp
lev09
sumber
pg_dump: [archiver (db)] koneksi ke database "goldendemon" gagal: nomor port tidak valid: "-s"
Jamie Hutber
33

Saya menjalankan Postgres 9.6 di mana saya harus mengekspor skema tertentu bersama dengan data.

Saya menggunakan perintah berikut:

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

Jika Anda hanya menginginkan skema tanpa data, gunakan tombol salih-alihn

Di bawah ini adalah daftar sakelar 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
sumber
11
pg_dump -d <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file>

Harap perhatikan bahwa Anda mempunyai hak cukup untuk mengakses skema itu. Jika Anda ingin mengambil cadangan sebagai pengguna tertentu, tambahkan nama pengguna dalam perintah yang diawali dengan-U

alfons
sumber
1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file> Ubah flag dari -d ke -s untuk hanya mendapatkan skema. Ini hanya untuk meningkatkan ini dan orang lain juga telah menyebutkan.
h0lmes221B
Ini akan mengambil seluruh DB: /
Jamie Hutber
7

Jika Anda hanya ingin membuat tabel, maka Anda bisa melakukannya pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'

arod
sumber
3

Untuk Linux: (data tidak termasuk)

  • pg_dump -s -t tablename databasename > dump.sql (Untuk tabel tertentu dalam database)

  • pg_dump -s databasename > dump.sql (Untuk seluruh database)

Lalit Bangad
sumber
2

atur server postgresql baru dan ganti folder datanya dengan file dari disk eksternal Anda.

Anda kemudian akan dapat memulai server postgresql itu dan mengambil data menggunakan pg_dump (pg_dump -s untuk skema-saja seperti yang disebutkan)

drone.ah
sumber
saya mengganti folder data dengan yang lama, kemudian saya memulai layanan, membuka aplikasi pgAdmin III, mengklik ikon server [saya hanya punya 1 server, yang sebelumnya]. Haruskah saya membuat server baru? Penyebabnya tidak berfungsi ... Saya masih melihat database yang saya buat di awal ... dan bukan yang cadangan
programmer
apakah Anda yakin Anda memasukkan file ke folder data yang benar? Saya belum menggunakan postgresql di Windows jadi saya tidak yakin di mana folder datanya berada. Saya juga tidak yakin apakah pgAdmin menyimpan cache apa pun sehingga Anda mungkin perlu menyambungkan kembali juga ...
drone.ah
Nah saya baru saja menyalin file data cadangan lama di C: \ Program Files \ PostgreSQL \ 8.3 dan saya menggantinya dengan yang baru. Juga, ketika saya membuka pgAdmin lagi, ia meminta kata sandi komputer lama, itu pertanda baik tetapi setelah itu di pohon database saya tidak melihat database saya
programmer
Hm ... saya membuat database bernama "db1" [database dari komputer lama], ketika saya mengkliknya, pgAdmin akan menampilkan "Terjadi kesalahan: Pencarian cache FATAL gagal untuk database 20012", apa artinya?
programmer
1
Sepertinya pgAdmin menyimpan banyak informasi. Jatuhkan koneksi database Anda di pgAdmin dan buat ulang. Itu seharusnya menyelesaikannya jika masalahnya ada di sekitar cache ...
drone.ah
1

Anda harus menggunakan sesuatu seperti ini pg_dump --schema=your_schema_name db1, untuk detailnya lihat di sini

Hayk Petrosyan
sumber