PostgreSQL'de bir veritabanının şemasını nasıl dışa aktarabilirim?


111

Bilgisayarım bozuldu ama neyse ki C: \ Program Files \ PostgreSQL klasörünü yedekledim.

Şimdi yeni bir bilgisayarda çalışıyorum ve harici diskte depolanan önceki Postgres veritabanlarını içe aktarmak istiyorum.

Yedekleme klasöründe bulunan belirli bir veritabanının şemasını dışa aktarmak istiyorum.

Dosya PostgreSQL\8.3\data\global\pg_database, veritabanları ve bunların OID'leri hakkında bilgi içerir; Örneğin:

"db1" 20012
"db2" 23456

"Db1" şemasını dışa aktarmak istiyorum.

"PostgreSQL\8.3\data\base\20012" Çok sayıda dosya [500 dosya] içeren klasörde "20012" adlı bir klasör var .

Bu veritabanının şemasını dışa aktarmanın bir yolu var mı?

Tüm Postgresql veritabanı dosyalarının harici bir sabit diskte bulunduğunu ve bu veritabanının şemasını bir SQL dosyasına aktarmak, o dosyayı almak, çalıştırmak ve aynı veritabanını yerel olarak oluşturmak istiyorum.

Yanıtlar:


141

Şunlara bir göz atmalısınız pg_dump:

pg_dump -s databasename

Yalnızca şemayı stdout olarak .sql olarak döker.

Pencereler için, muhtemelen aramak isteyeceksiniz pg_dump.exe. Bir Windows makinesine erişimim yok ama bellekten eminim ki komut budur. Yardımın sizin için de işe yarayıp yaramadığını görün.


pg_dump'ın çalışacağından emin misiniz? Veritabanındaki dosyaların yerel olarak değil harici bir diskte bulunması neden ...
programcı

Eski veritabanı sunucusunu başlatabilmeniz koşuluyla, evet. pg_dump muhtemelen bildiğiniz gibi bir veritabanı sunucusuna uzaktan bağlanabilir. Yeni makinenize 8.3 yüklemeyi ve eski veritabanı dosyalarınızı kopyalamayı dener ve postgres'i başlatır ve bunun işe yarayıp yaramadığını görmeyi denerdim. Daha genel olarak sadece şemayı terk etmeyi sorduğunu sanıyordum, benim hatam.
2013

postgresql'in 8.3 sürümünü zaten yükledim, veri klasörünü yeni kuruluma kopyaladım, ancak eski veritabanımı göremiyorum ...
programcı

14
@ Yeni teşekkürler işe yarıyor. pg_dump -s databasename > schema.sqlsonucu schema.sqldosyaya
gönderecek

bu durumda özel veri türleri nasıl olur?
Nikita

38

In Linux Böyle yapabilirsiniz

pg_dump -U postgres -s postgres > exportFile.dmp

Pg_dump.exe ile aynı şeyi denemiyorsanız, belki Windows'ta da çalışabilir.

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

pg_dump: [arşivleyici (db)] "goldendemon" veritabanına bağlantı başarısız oldu: geçersiz bağlantı noktası numarası: "-s"
Jamie Hutber

34

Verilerle birlikte belirli bir şemayı dışa aktarmam gereken Postgres 9.6'yı çalıştırıyorum.

Aşağıdaki komutu kullandım:

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

Verisiz yalnızca şemayı istiyorsanız, sbunun yerine anahtarı kullanınn

Pg_dump anahtar listesi aşağıdadır:

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>

Lütfen bu şemaya erişmek için yeterli ayrıcalığa sahip olduğunuza dikkat edin. Yedeklemeyi belirli bir kullanıcı olarak almak istiyorsanız, bu komuta kullanıcı adını ekleyin.-U


1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <dump dosyasının konumu> Yalnızca şemayı almak için bayrağı -d'den -s'ye değiştirin. Bu sadece bunu geliştirmek için ve diğer insanların da bahsettiği.
h0lmes221B

Bu tüm
DB'yi

7

Yalnızca tablo oluşturmak istiyorsanız, pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'


3

For Linux: (veri hariç)

  • pg_dump -s -t tablename databasename > dump.sql (Veritabanındaki belirli bir tablo için)

  • pg_dump -s databasename > dump.sql (Tüm veritabanı için)


2

yeni bir postgresql sunucusu kurun ve veri klasörünü harici diskinizdeki dosyalarla değiştirin.

Daha sonra bu postgresql sunucusunu başlatabilir ve veriyi pg_dump kullanarak alabilirsiniz (belirtildiği gibi yalnızca şema için pg_dump -s)


veri klasörünü eskisiyle değiştirdim, sonra servisi başlattım, pgAdmin III uygulamasını açtım, sunucu simgesine tıkladım [sadece 1 sunucu var, bir önceki sunucu]. Yeni bir sunucu oluşturmalı mıyım? Çünkü işe yaramıyor ... Hala başlangıçta oluşturduğum veritabanlarını görüyorum ... ve yedekleri değil
programcı

Dosyaları doğru veri klasörüne koyduğunuzdan emin misiniz? Windows'ta postgresql kullanmadığım için veri klasörünün nerede olacağından emin değilim. Ayrıca
pgAdmin'in

C: \ Program Files \ PostgreSQL \ 8.3 içindeki eski yedekleme veri dosyasını kopyaladım ve yenisiyle değiştirdim. Ayrıca, pgAdmin'i tekrar açtığımda eski bilgisayarın şifresini soruyor, bu iyi bir işaret ama daha sonra veritabanları ağacında veritabanlarımı görmüyorum
programcı

Hm ... "db1" [eski bilgisayardan bir veritabanı] adlı bir veritabanı oluşturdum, üzerine tıkladığımda pgAdmin çıktı "Bir hata oluştu: 20012 veritabanı için FATAL önbellek araması başarısız oldu", bu ne anlama geliyor?
programcı

1
pgAdmin bir çok bilgiyi önbelleğe alıyor gibi görünüyor. Veritabanı bağlantınızı pgAdmin'e bırakın ve yeniden oluşturun. Sorun önbelleğe alma ile
ilgiliyse bu çözülmelidir

1

Bunun gibi bir şey kullanmalısınız pg_dump --schema=your_schema_name db1, ayrıntılar için buraya bir göz atın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.