Làm cách nào để xuất lược đồ của cơ sở dữ liệu trong PostgreSQL?


111

Máy tính của tôi bị hỏng nhưng may mắn thay tôi đã sao lưu thư mục C: \ Program Files \ PostgreSQL.

Bây giờ tôi đang làm việc trong một máy tính mới và tôi muốn nhập cơ sở dữ liệu Postgres trước đó được lưu trữ trong đĩa ngoài.

Tôi muốn xuất lược đồ của một cơ sở dữ liệu cụ thể nằm trong thư mục sao lưu.

Tệp PostgreSQL\8.3\data\global\pg_databasechứa thông tin về cơ sở dữ liệu và OID của chúng; ví dụ:

"db1" 20012
"db2" 23456

Tôi muốn xuất lược đồ của "db1".

Có một thư mục tên là "20012" trong thư mục "PostgreSQL\8.3\data\base\20012" chứa rất nhiều tệp [500 tệp].

Có cách nào để xuất lược đồ của cơ sở dữ liệu đó không?

Lưu ý rằng tất cả các tệp cơ sở dữ liệu Postgresql đều nằm trong đĩa cứng bên ngoài và tôi muốn xuất lược đồ của cơ sở dữ liệu đó trong tệp SQL, lấy tệp đó, chạy nó và tạo cùng một cơ sở dữ liệu chính xác cục bộ.

Câu trả lời:


141

Bạn nên xem qua pg_dump:

pg_dump -s databasename

Sẽ chỉ kết xuất lược đồ thành stdout dưới dạng .sql.

Đối với cửa sổ, có thể bạn sẽ muốn gọi pg_dump.exe. Tôi không có quyền truy cập vào máy Windows nhưng tôi khá chắc chắn rằng từ bộ nhớ đó là lệnh. Xem sự trợ giúp có hiệu quả với bạn không.


bạn có chắc rằng pg_dump sẽ hoạt động không? Nguyên nhân các tập tin cơ sở dữ liệu được đặt tại một đĩa bên ngoài và không phải địa phương ...
lập trình viên

Với điều kiện là bạn có thể khởi động máy chủ cơ sở dữ liệu cũ lên. pg_dump có thể kết nối từ xa với máy chủ cơ sở dữ liệu như bạn có thể biết. Tôi sẽ cố gắng cài đặt 8.3 trên máy mới của bạn và sao chép các tệp cơ sở dữ liệu cũ của bạn và bắt đầu postgres up và xem cách đó có hoạt động không. Tôi nghĩ rằng bạn đang hỏi một cách tổng quát hơn về việc chỉ bán lược đồ, tệ của tôi.
Mới

tôi đã cài đặt phiên bản 8.3 của postgresql, sao chép thư mục dữ liệu để cài đặt mới, nhưng tôi không thể nhìn thấy cơ sở dữ liệu cũ của tôi ...
lập trình viên

14
@Anew cảm ơn nó hoạt động. pg_dump -s databasename > schema.sqlsẽ xuất kết quả thành schema.sqltệp
Arivarasan L 23/02/15

làm thế nào về các loại dữ liệu tùy chỉnh trong trường hợp này?
Nikita

38

Trong Linux, bạn có thể làm như thế này

pg_dump -U postgres -s postgres > exportFile.dmp

Có thể nó cũng có thể hoạt động trong Windows , nếu không, hãy thử tương tự với pg_dump.exe

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

pg_dump: [archiver (db)] kết nối với cơ sở dữ liệu "goldendemon" không thành công: số cổng không hợp lệ: "-s"
Jamie Hutber

33

Tôi đang chạy Postgres 9.6 nơi tôi phải xuất một lược đồ cụ thể cùng với dữ liệu.

Tôi đã sử dụng lệnh sau:

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

Nếu bạn chỉ muốn giản đồ mà không có dữ liệu, hãy sử dụng công tắc sthay vìn

Dưới đây là danh sách chuyển đổi 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>

Xin lưu ý rằng bạn có đủ đặc quyền để truy cập vào lược đồ đó. Nếu bạn muốn sao lưu dưới dạng người dùng cụ thể, hãy thêm tên người dùng vào lệnh đó trước-U


1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <vị trí của tệp kết xuất> Thay đổi cờ từ -d thành -s để chỉ nhận được lược đồ. Điều này chỉ để cải thiện điều này mà những người khác cũng đã đề cập.
h0lmes221B

Điều này sẽ chiếm toàn bộ DB: /
Jamie Hutber

7

Nếu bạn chỉ muốn tạo bảng, thì bạn có thể làm pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'


3

Đối với Linux: (không bao gồm dữ liệu)

  • pg_dump -s -t tablename databasename > dump.sql (Đối với một bảng cụ thể trong cơ sở dữ liệu)

  • pg_dump -s databasename > dump.sql (Đối với toàn bộ cơ sở dữ liệu)


2

thiết lập một máy chủ postgresql mới và thay thế thư mục dữ liệu của nó bằng các tệp từ đĩa ngoài của bạn.

Sau đó, bạn sẽ có thể khởi động máy chủ postgresql đó lên và truy xuất dữ liệu bằng pg_dump (pg_dump -s chỉ dành cho lược đồ như đã đề cập)


Tôi đã thay thế thư mục dữ liệu bằng thư mục cũ, sau đó tôi khởi động dịch vụ, mở ứng dụng pgAdmin III, nhấp vào biểu tượng máy chủ [tôi chỉ nhận được 1 máy chủ, máy chủ trước đó]. Tôi có nên tạo một máy chủ mới không? Nguyên nhân nó không làm việc ... Tôi vẫn nhìn thấy cơ sở dữ liệu tôi đã có tôi tạo ra ngay từ đầu ... và không phải là những sao lưu
lập trình viên

bạn có chắc bạn đã đưa các tệp vào đúng thư mục dữ liệu không? Tôi chưa sử dụng postgresql trong Windows nên tôi không chắc về vị trí của thư mục dữ liệu. Tôi cũng không chắc liệu pgAdmin có lưu trữ bất kỳ thứ gì không nên bạn cũng có thể cần kết nối lại ...
drone.ah

Tôi vừa sao chép tệp dữ liệu sao lưu cũ trong C: \ Program Files \ PostgreSQL \ 8.3 và tôi đã thay thế nó bằng tệp mới. Ngoài ra, khi tôi mở pgAdmin một lần nữa, nó yêu cầu mật khẩu của máy tính cũ, đó là một tín hiệu đáng mừng nhưng sau đó trong cây cơ sở dữ liệu tôi không thấy cơ sở dữ liệu của tôi
lập trình viên

Hm ... tôi đã tạo một cơ sở dữ liệu có tên "db1" [một cơ sở dữ liệu từ máy tính cũ], khi tôi nhấp vào nó, pgAdmin sẽ xuất ra "Đã xảy ra lỗi: Tra cứu bộ đệm FATAL không thành công cho cơ sở dữ liệu 20012", điều đó có nghĩa là gì?
lập trình viên

1
có vẻ như pgAdmin lưu trữ rất nhiều thông tin. Thả kết nối cơ sở dữ liệu của bạn trong pgAdmin và tạo lại nó. Điều đó sẽ giải quyết nó nếu vấn đề là xung quanh bộ nhớ đệm ...
drone.ah

1

Bạn nên sử dụng một cái gì đó như thế này pg_dump --schema=your_schema_name db1, để biết chi tiết hãy xem tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.