programing

Postgre 복사 중SQL 데이터베이스를 다른 서버로

goodsources 2023. 5. 26. 20:54
반응형

Postgre 복사 중SQL 데이터베이스를 다른 서버로

프로덕션 포스트그레를 복사하려고 합니다.SQL 데이터베이스에서 개발 서버로.이것을 하는 가장 빠르고 쉬운 방법은 무엇입니까?

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

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복원을 위한 것입니다.따라서 이 답변의 첫 번째 명령은 로컬에서 원격으로 복사하는 것이고 두 번째 명령은 원격에서 로컬로 복사하는 것입니다.더 보기 -> 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 옵션을 pg_dump로 선택할지 -Fp 또는 -Fc 옵션을 선택할지에 따라 pg_dump를 사용하고 나중에 psql 또는 pg_restore를 사용합니다.

사용 예:

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하며, 모드()는 9.3 이상의 tar 형식에서만 작동합니다.--format=tar현재 버전의 )은 서버 버전 9.5 이상에서만 작동합니다.

원본 서버에 필요한 경우:

  1. listen_addresses = '*' 대상 서버에서 연결할 수 있습니다.해당 문제에 대해 포트 5432가 열려 있는지 확인합니다.
  2. 하나 이상의 사용 가능한 복제 연결: (-X fetch),2위해서-X stream의 경우 기본값)SQL 12) 이상입니다.
  3. wal_level = replica 설정할 수 있는 이상.max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trustpg_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

허용된 답변이 올바르지만 암호를 대화형으로 입력하지 않으려면 다음을 사용할 수 있습니다.

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}}

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

: 데터베덤:pg_dump database_name_name > backup.sql


가져옵니다.psql db_name < backup.sql

저는 꽤 많은 어려움을 겪었고 결국 Rails 4와 함께 작동할 수 있게 된 방법은 다음과 같습니다.

이전 서버에서

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

나는 dump를 만들기 위해 postgres Linux 사용자를 사용해야 했고, 새 서버에 데이터베이스를 강제로 만들기 위해 -c를 사용해야 했습니다. --inserts는 그렇지 않으면 나에게 통하지 않을 INSERT() 구문을 사용하라고 말합니다.

그러면 새 서버에서 simpy:

sudo su - postgres
psql new_database_name < dump.sql

서버 간에 dump.sql 파일을 전송하기 위해 "cat"을 사용하여 컨텐츠를 인쇄하고 "nano"를 사용하여 컨텐츠를 복사 붙여넣기를 다시 생성했습니다.

또한 두 데이터베이스에서 사용하던 역할이 달라서 덤프에서 모든 소유자 이름을 찾아야 했습니다.

Linux 셸 스크립트를 공유하여 한 서버에서 다른 서버로 테이블 데이터를 복사합니다.SQL 서버.

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

Postgre 간의 데이터 마이그레이션을 위한 Linux Bash Shell 스크립트SQL 서버:

#!/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

에 다은다음사예입다니용을 사용한 .pg_basebackup

전체 데이터베이스 클러스터(사용자, 데이터베이스 등)를 백업하기 때문에 이 경로를 선택했습니다.

제가 취해야 했던 모든 단계가 자세히 설명되어 있기 때문에 해결책으로 여기에 게시합니다. 여기에 대한 다른 답변을 읽고 좀 더 연구한 후에 언제든지 권장 사항이나 개선 사항을 추가하십시오.

Postgres 12 및 Ubuntu 18.04의 경우 다음 작업을 수행해야 했습니다.


현재 데이터베이스를 실행 중인 서버에서:

pg_hba.conf에는있나는에 있는 ./etc/postgresql/12/main/pg_hba.conf

다음 행을 추가합니다(데이터베이스를 복사할 서버의 IP 주소로 192.168.0.100 대체).

host  replication  postgres  192.168.0.100/32  trust

갱신하다postgresql.conf에 있는 나로서는/etc/postgresql/12/main/postgresql.conf다음 행을 추가합니다.

listen_addresses = '*'

postgres 다시 시작:

sudo 서비스 postgresql 다시 시작


데이터베이스 클러스터를 복사할 호스트에서 다음 위치:

sudo 서비스 postgresql 중지

sudosu 뿌리

rm -rf /var/lib/postgresql/12/main/*

퇴장

sudo -u postgres pg_basebackup -h 192.168.0.101 -U postgres -D /var/lib/postgresql/12/main/

sudo 서비스 postgresql 시작

큰 그림 - 서비스를 중지하고 데이터 디렉토리의 모든 것을 삭제합니다(내 것은 다음에 있습니다)./var/lib/postgreql/12) 이 디렉토리에 대한 권한은 다음과 같습니다.drwx------사용자 및 그룹 포함postgres제가 할 수 있는 일은root에 조차도 없는sudo -u postgres왜 그런지 모르겠어요.데이터베이스를 복사할 새 서버에서 이 작업을 수행해야 합니다!전체 데이터베이스 클러스터를 삭제합니다.

IP 주소를 변경해야 합니다.192.168.0.101데이터베이스를 복사할 IP 주소로 이동합니다.원본 서버에서 데이터 복사pg_basebackup서비스를 시작합니다.

갱신하다pg_hba.conf그리고.postgresql.conf서버를 추가하기 전에 원래 서버 구성과 일치시킵니다.replication라인과listen_addressesline (내가 관리할 때는 md5를 통해 pg_hba.conf에 로컬로 로그인하는 기능을 추가해야 했습니다.)

다음에 대한 고려 사항이 있습니다.max_wal_senders그리고.wal_level문서에서 확인할 수 있습니다.나는 이것으로 아무것도 할 필요가 없었습니다.

GUI가 더 익숙한 경우 pgAdmin 소프트웨어를 사용할 수 있습니다.

  • 원본 및 대상 서버에 연결
  • source db > backup을 마우스 오른쪽 버튼으로 클릭합니다.
  • 대상 서버 > 생성 > 데이터베이스를 마우스 오른쪽 버튼으로 클릭합니다.source db와 동일한 속성 사용 (우클릭 > properties로 source db의 속성을 확인할 수 있습니다)
  • 생성된 db > restore를 마우스 오른쪽 버튼으로 클릭합니다.

여기에 이미지 설명 입력

이것이 가장 쉬운 해결책입니다.

pg_dump --dbname=postgresql://[user]:[password]@[host]:[port]/[database] | psql --dbname=postgresql://[user]:[password]@[host]:[port]/[database]

첫 번째 부분은.pg_dump복사할 데이터베이스를 다운로드하는 중입니다.

파트, 번부분은째두.psql해당 주소로 업로드 중입니다.

예:

pg_dump --dbname=postgresql://postgres:password@originaldatabase.cluster-awsstring.eu-west-1.rds.amazonaws.com:5432/originaldatabasename | psql --dbname=postgresql://postgres:password@newdatabase.cluster-awsstring.eu-west-1.rds.amazonaws.com:5432/newdatabasename

저는 앞의 예들이 --dbname 문자열을 구성하는 방법이나 문서에서 설명하지 않았다는 것을 발견했습니다.참조: Postgre의 형식은 무엇입니까?SQL 연결 문자열 / URL?

언급URL : https://stackoverflow.com/questions/1237725/copying-postgresql-database-to-another-server

반응형