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

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



답변

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

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


답변

pg_dump the_db_name > the_backup.sql

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

psql the_new_dev_db < the_backup.sql


답변

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


답변

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

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

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


답변

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


답변

백업하려는 데이터베이스 이름으로이 명령을 실행하여 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


답변

나는 상당히 많은 어려움을 겪었고 결국 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이 다르므로 덤프에서 모든 소유자 이름을 찾아 교체해야했습니다.