PostgreSQL 데이터베이스를 다른 서버로 복사


492

프로덕션 PostgreSQL 데이터베이스를 개발 서버에 복사하려고합니다. 이 작업을 수행하는 가장 빠르고 쉬운 방법은 무엇입니까?

답변:


666

중간 파일을 만들 필요가 없습니다. 넌 할 수있어

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

또는

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

사용 psql또는 pg_dump원격 호스트에 연결.

데이터베이스가 크거나 연결 속도가 느린 경우 파일 덤프 및 압축 파일 전송 속도가 더 빠를 수 있습니다.

Kornel이 중간 파일로 덤프 할 필요가 없다고 말했듯이 압축 작업을하려면 압축 터널을 사용할 수 있습니다

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

또는

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

그러나이 솔루션은 양쪽 세션을 가져와야합니다.

참고 : pg_dump 백업용 psql이며 복원 용입니다. 따라서이 답변첫 번째 명령은 local에서 remote로 복사하고 두 번째 명령은 remote에서 local로 복사하는 것입니다 . 추가-> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
중간 파일이 필요하지 않습니다. 압축 된 SSH 터널을 사용하거나 간단히 파이프를 사용할 수 있습니다. pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel

4
bzip2를 사용하는 경우 ssh 압축을 해제하여 전송 속도를 높이십시오!
lzap 2016 년

8
내가 있는지 어떻게 압축 작업 할 수 당겨 개발로 생산에서 아래로 데이터를? 개발에서 프로덕션으로 SSH 연결을 설정했습니다. 그래요 ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy French 2012

2
이름이 x 인 원격 데이터베이스를 이름이 y 인 로컬 데이터베이스에 복사 할 수 있어야하지만 @Ferran의 솔루션은이 기능을 수행하지 못합니다 ... porneL의 솔루션은 bzip2 파일을 한 단계 프로세스가 아닙니다. 이 경우 데이터베이스 y를 삭제하고 x를 복원하는 Ferran 솔루션의 "또는"부분을 사용한 다음 데이터베이스 이름을 y로 바꿉니다.
Darin Peterson

3
이것이 내가 한 일입니다 : (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x"RENAME TO "y"'
Darin Peterson

131
pg_dump the_db_name > the_backup.sql

그런 다음 백업을 개발 서버에 복사하고 다음을 사용하여 복원하십시오.

psql the_new_dev_db < the_backup.sql

3
어떤 사람은 이것이 문제가 될 수 있다고 말했습니다. 트리거에 부딪 칠 때 덤프 또는 복원을 죽이는 권한 문제?
Robin Barnes

17
@rmbarnes : 문제가있는 경우 수정해야합니다. 이 "일부"가 한 일에 대한 자세한 지식이 없으면 아무도이 주장을 확인하거나 무시할 수 없습니다.

4
pg_dump와 함께 --no-owner 플래그를 사용하십시오. 이것은 문제를 건너 뛰고이 게시물의 첫 번째 편집에서이를 사용했지만 원본 데이터베이스에 대해 더 정확한 충실도가 필요할 것이라고 생각했습니다.
마운트 해제

4
나를 위해, 위의 접근 방식은 pg_dump -C -h host -U username db_name> / any_directory / dump_schema_and_data_file. 파일에서 복원하기 위해 psql -h host -U username db_name <dump_schema_and_data_file
Ali Raza Bhayani

그것은 나에게 많은 악화를 구했다. Google 드라이브를 사용하여 컴퓨터간에 파일을 이동했습니다. 새 컴퓨터에 데이터베이스가 이미 있었지만 (공백) 많은 중복 키 오류가 발생했습니다. 그러나 그것은 개발 환경이며 아무것도 아프지 않았습니다.
Chris Mendla

37

pg_dump 및 이후 psql 또는 pg_restore를 사용하십시오.-Fp 또는 -Fc 옵션을 pg_dump로 선택할지 여부에 따라 .

사용 예 :

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql

22

버전 간 마이그레이션을 원할 경우 (예 : postgres를 업데이트하고 localhost : 5432에서 9.1을 실행하고 localhost : 5434에서 9.3을 실행) 다음을 실행할 수 있습니다.

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

마이그레이션 문서를 확인하십시오 .


(myuser91 / postgres) 비밀번호를 여러 번 요청했는데 비밀번호를 한 번만 입력해야하는 방법이 있습니까?
Martin Weber

이 문서에 따라 A, pgpass 파일을 만듭니다 @MartinWeber postgresql.org/docs/9.4/static/libpq-pgpass.html
스콧 워렌에게

포트가 모두 같은 경우 어떻게합니까?
ggnoredo

서로 다른 서버에있는 경우 -h를 사용하여 호스트를 지정할 수 있습니다.
Haroldo_OK

16

pg_basebackup 특히 대규모 데이터베이스의 경우이 작업을 수행하는 더 좋은 방법 인 것 같습니다.

주 버전이 같거나 이전 인 서버에서 데이터베이스를 복사 할 수 있습니다. 또는 더 정확하게 :

pg_basebackup동일하거나 이전 버전의 서버에서 9.1까지 작동합니다. 그러나 WAL 스트리밍 모드 ( -X stream)는 서버 버전 9.3 이상 --format=tar에서만 작동하며 현재 버전의 tar 형식 모드 ( )는 서버 버전 9.5 이상에서만 작동합니다.

이를 위해 소스 서버에 필요합니다.

  1. listen_addresses = '*'대상 서버에서 연결할 수 있습니다. 해당 문제에 대해 포트 5432가 열려 있는지 확인하십시오.
  2. 최소 1 개의 사용 가능한 복제 연결 : max_wal_senders = 1( -X fetch), 2for -X stream(PostgreSQL 12의 경우 기본값) 이상.
  3. wal_level = replica이상으로 설정할 수 있습니다 max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trust에서 pg_hba.conf. 이를 pg통해 DST_IP시스템의 모든 사용자에게 클러스터에 대한 액세스 권한을 부여 합니다. 보다 안전한 옵션을 원할 수도 있습니다.

변경 1, 2, 3은 서버를 다시 시작해야하며 변경 4는 다시로드해야합니다.

대상 서버에서 :

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

11
예를 들어 답변에 더 자세한 정보를 제공해 주시겠습니까?
Magnilex

7
그러나 두 머신의 PG 버전이 동일한 경우에만 작동합니다.
sm

개발 및 프로덕션에 다른 데이터베이스 버전을 사용할 가능성은 적습니다. 지난번에는 팀원 중 한 명과 불쾌한 대화를 나 she습니다. 그 당시 프로덕션에서 9.5를 사용하는 동안 일부 코드가 PG 9.6에서 작동하지 않는다는 문제를 제출하려고했습니다. 기본 백업이 훨씬 빠릅니다. 그런 다음 pg_upgrade는 필요한 경우 갈 길입니다.
Zorg

2
새 버전으로 마이그레이션하고 PostgreSQL을 중지하고 싶지 않을 수 있습니다.
x-yuri

1
데이터베이스를 업그레이드 할 때마다 프로덕션에서 수행하기 전에 개발 및 스테이징에서 데이터베이스를 업그레이드 할 수 있습니다.
Andrew Lorien

8

백업하려는 데이터베이스 이름으로이 명령을 실행하여 DB 덤프를 수행하십시오.

 pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql

이제이 덤프 파일을 DB를 복사하려는 원격 시스템으로 scp하십시오.

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

원격 머신에서 ~ / some / folder에서 다음 명령을 실행하여 DB를 복원하십시오.

 psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql

7

나는 상당히 많은 어려움을 겪었고 결국 Rails 4에서 작동하게하는 방법은 다음과 같습니다.

기존 서버에서

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql

덤프를 작성하기 위해 postgres Linux 사용자를 사용해야했습니다. 또한 -c를 사용하여 새 서버에서 데이터베이스를 강제로 작성해야했습니다. --inserts는 그렇지 않으면 INSERT () 구문을 사용하도록 지시합니다.

그런 다음 새 서버에서 simpy :

sudo su - postgres
psql new_database_name < dump.sql

서버간에 dump.sql 파일을 전송하기 위해 간단히 "cat"을 사용하여 내용을 인쇄하고 "nano"보다 내용을 복사하여 내용을 복사하여 다시 작성했습니다.

또한 두 데이터베이스에서 사용하고있는 ROLE이 다르므로 덤프에서 모든 소유자 이름을 찾아 교체해야했습니다.


6

데이터베이스를 덤프하십시오. pg_dump database_name_name > backup.sql


데이터베이스를 다시 가져 오십시오. psql db_name < backup.sql


5

한 서버에서 다른 PostgreSQL 서버로 테이블 데이터를 복사하기 위해 Linux 쉘 스크립트를 공유하겠습니다.

이 블로그에서 가져온 참조 :

PostgreSQL 서버 간 데이터 마이그레이션을위한 Linux Bash Shell Script :

#!/bin/bash
psql \
    -X \
    -U user_name \
    -h host_name1 \
    -d database_name \
    -c "\\copy tbl_Students to stdout" \
| \
psql \
    -X \
    -U user_name \
    -h host_name2 \
    -d database_name \
    -c "\\copy tbl_Students from stdin"

데이터를 마이그레이션하는 중입니다. 대상 / 두 번째 데이터베이스 서버에 빈 테이블을 작성하십시오.

이것은 유틸리티 스크립트입니다. 또한 host_name, database_name, table_name 및 기타 매개 변수를 추가하여 일반적인 용도로 스크립트를 수정할 수 있습니다


5

허용되는 답변은 맞지만 대화식으로 비밀번호를 입력하지 않으려면 다음을 사용할 수 있습니다.

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.