PostgreSQL에서 데이터베이스 스키마를 내보내려면 어떻게해야합니까?


111

내 컴퓨터가 고장 났지만 다행히 C : \ Program Files \ PostgreSQL 폴더를 백업했습니다.

이제 새 컴퓨터에서 작업 중이며 외부 디스크에 저장된 이전 Postgres 데이터베이스를 가져오고 싶습니다.

백업 폴더에있는 특정 데이터베이스의 스키마를 내보내고 싶습니다.

이 파일 PostgreSQL\8.3\data\global\pg_database에는 데이터베이스 및 해당 OID에 대한 정보가 포함되어 있습니다. 예를 들면 :

"db1" 20012
"db2" 23456

"db1"의 스키마를 내보내고 싶습니다.

"PostgreSQL\8.3\data\base\20012" 많은 파일 [500 개 파일]이 포함 된 폴더에 "20012"라는 이름의 폴더 가 있습니다.

해당 데이터베이스의 스키마를 내보내는 방법이 있습니까?

모든 Postgresql 데이터베이스 파일은 외부 하드 디스크에 있으며 해당 데이터베이스의 스키마를 SQL 파일로 내보내고 해당 파일을 가져 와서 실행하고 동일한 정확한 데이터베이스를 로컬로 만들고 싶습니다.

답변:


141

다음을 살펴보아야합니다 pg_dump.

pg_dump -s databasename

스키마 만 stdout에 .sql로 덤프합니다.

Windows의 경우 pg_dump.exe. 나는 Windows 시스템에 액세스 할 수 없지만 메모리에서 명령 인 것을 확신합니다. 도움이 당신에게도 효과가 있는지 확인하십시오.


pg_dump가 작동 할 것이라고 확신합니까? 데이터베이스의 파일이 로컬이 아닌 외부 디스크에 있기 때문에 ...
프로그래머

예전 데이터베이스 서버를 시작할 수 있다면 가능합니다. pg_dump는 아마 알고있는 것처럼 데이터베이스 서버에 원격으로 연결할 수 있습니다. 새 컴퓨터에 8.3을 설치하고 이전 데이터베이스 파일을 복사하고 postgres를 시작하고 작동하는지 확인하려고합니다. 나는 당신이 스키마 만 덤핑하는 것에 대해 더 일반적으로 묻는 것이라고 생각했습니다.
새로 워진

이미 8.3 버전의 postgresql을 설치하고 데이터 폴더를 새 설치에 복사했지만 이전 데이터베이스를 볼 수 없습니다 ...
프로그래머

14
@ 다시 작동합니다. pg_dump -s databasename > schema.sql결과를 schema.sql파일 로 출력 합니다
Arivarasan L

이 경우 사용자 정의 데이터 유형은 어떻습니까?
Nikita

38

Linux 에서는 다음과 같이 할 수 있습니다.

pg_dump -U postgres -s postgres > exportFile.dmp

pg_dump.exe 와 동일하게 시도하지 않으면 Windows 에서도 작동 할 수 있습니다.

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

pg_dump : [archiver (db)] 데이터베이스 "goldendemon"연결 실패 : 잘못된 포트 번호 : "-s"
Jamie Hutber

33

데이터와 함께 특정 스키마를 내 보내야하는 Postgres 9.6을 실행 중입니다.

다음 명령을 사용했습니다.

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

데이터없이 스키마 만 원하는 경우 s대신 스위치 를 사용하십시오.n

다음은 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>

해당 스키마에 액세스 할 수있는 충분한 권한이 있습니다. 특정 사용자로 백업하려면 해당 명령 앞에 사용자 이름을 추가하십시오.-U


1
pg_dump -s <databasename> -h <hostname> -p <port> -n <schemaname> -f <location of the dump file> 스키마 만 가져 오려면 플래그를 -d에서 -s로 변경합니다. 이것은 다른 사람들도 언급 한 것을 개선하기위한 것입니다.
h0lmes221B

이것은 전체 DB를 취할 것입니다 : /
Jamie Hutber

7

테이블 만들기 만 원하는 경우 다음을 수행 할 수 있습니다. pg_dump -s databasename | awk 'RS="";/CREATE TABLE[^;]*;/'


3

들어 리눅스 : (데이터는 제외)

  • pg_dump -s -t tablename databasename > dump.sql (데이터베이스의 특정 테이블)

  • pg_dump -s databasename > dump.sql (전체 데이터베이스)


2

새 postgresql 서버를 설정하고 데이터 폴더를 외부 디스크의 파일로 바꿉니다.

그러면 해당 postgresql 서버를 시작하고 pg_dump를 사용하여 데이터를 검색 할 수 있습니다 (설명 된대로 스키마 전용의 경우 pg_dump -s).


데이터 폴더를 이전 폴더로 바꾼 다음 서비스를 시작하고 pgAdmin III 애플리케이션을 열고 서버 아이콘을 클릭했습니다. [이전 서버는 1 대뿐입니다]. 새 서버를 만들어야합니까? 작동하지 않기 때문에 ... 처음에 생성 한 데이터베이스가 여전히 표시됩니다 ... 백업 데이터베이스가 아닌
프로그래머

파일을 올바른 데이터 폴더에 넣었습니까? Windows에서 postgresql을 사용하지 않았으므로 데이터 폴더가 어디에 있는지 잘 모르겠습니다. 또한 pgAdmin이 캐시에 어떤 것이 있는지 확실하지 않으므로 다시 연결해야 할 수도 있습니다.
drone.ah

C : \ Program Files \ PostgreSQL \ 8.3에 이전 백업 데이터 파일을 복사하고 새 파일로 교체했습니다. 또한, 언제 다시 내가 개방 pgAdmin, 좋은 기호하지만 나중에 데이터베이스 트리에서 난 내 데이터베이스에 표시되지 않습니다 이전 컴퓨터의 암호를 묻습니다
프로그래머

흠 ... "db1"[이전 컴퓨터의 데이터베이스]라는 이름의 데이터베이스를 만들었습니다.이 데이터베이스를 클릭하면 pgAdmin이 "오류가 발생했습니다 : 데이터베이스 20012에 대한 FATAL 캐시 조회 실패"라는 메시지를 출력합니다. 그게 무슨 뜻입니까?
프로그래머

1
pgAdmin이 많은 정보를 캐시하는 것처럼 보입니다. pgAdmin에서 데이터베이스 연결을 삭제하고 다시 만듭니다. 문제가 캐싱 주위에 있다면 그 ... 그것을 해결한다
drone.ah

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.