2013-03-28 3 views
15

데이터베이스의 pg_dump를 수행했으며 이제 결과 .sql 파일을 다른 서버에 설치하려고합니다.postgresql 데이터베이스를 복사하는 더 빠른 방법 (또는 가장 좋은 방법)

다음 명령을 사용하고 있습니다.

psql -f databasedump.sql 

오늘 이전에 데이터베이스 설치를 시작했으며 7 시간 후 데이터베이스가 계속 채워집니다. 이 시간이 얼마나 걸릴 지 모르겠지만 계속 모니터하고 있습니다. 지금까지 12 밀론 이상의 인서트와 카운팅을 보았습니다. 나는 이것을하는 더 빠른 방법이 있다고 의심한다.

+0

어느 쪽이든, 1200 만 개 삽입 튜닝을 사용, 그것은 일반적으로 중간 괜찮은에 분 같은의 문제 하드웨어, psql 및 일반 SQL 덤프 포함. 7 시간이 걸렸다면, 셋업에 문제가 생길 수 있습니다. –

+0

이것은 아마도 명백 할 것이지만, 덤프에 cross-db 호환성 옵션'--inserts' 또는'--column-inserts'를 제공하지 않았는지 확인하십시오. ASCII 스크립트가'COPY'를 사용하여 데이터를 다시로드하는지 점검 할 수도 있습니다. –

+0

자세한 내용은 EC2 마이크로 인스턴스로 작업 중이므로 약간의 메모리 제한이 있습니다. 데이터가 이전 7.4 설정에서 왔기 때문에 Postgresql 7.4 (직접 컴파일해야 함)입니다. –

답변

3

일반적으로 의 사용은 psql 대신 pg_restore과 쌍을 이루는 것이 좋습니다. 이 방법은 등의 --jobs 플래그를 전달하여 로딩 프로세스 속도를 높이기 위해 코어 사이에 분할 될 수

$ pg_restore --jobs=8 dump.sql 

자체가 대량의 데이터로드에 guide이 포스트 그레스.

또한 postgresql.conf 구성 파일을 크게 조정하고 maintenance_work_memcheckpoint_segments 값에 적절한 값을 적절히 설정하는 것이 좋습니다. 이 값이 높을수록 쓰기 성능이 크게 향상 될 수 있습니다.

+0

분명히 잘못된 정보를 게시하지 마십시오. 질문에 대한 답을 모르는 경우 대답하지 마십시오. 당신의 대답은 누군가의 삶을 더 어렵게 만들지 않을 것이라는 것을 알게 될 것입니다. –

+0

사과드립니다. 나는 대답을 게시 한 후 꽤 틀렸다는 것을 깨달았다. 필자가 아는 한 최선의 답변을 업데이트했지만, pg_restore에 대한 나의 이해와 사용이 올바르지 않으면 간단히 대답을 제거 할 것입니다. – hoxworth

+0

수정 된 답변이 훨씬 유용합니다. 나는 내 downvote를 제거했습니다. 내 의견을 삭제 하겠지만이 체인이 그다지 의미가 없을 것이라고 생각하지 않습니다. –

10

왜 원시 .sql 덤프를 생성합니까? pg_dump의 개시 설명은 "사용자 정의"형식 -Fc을 권장합니다.

그런 다음 pg_restore를 사용하여 데이터 (또는 선택한 부분)를 복원 할 수 있습니다. 복수 코어를 사용할 수있는 "작업 수"옵션 -j이 있습니다 (디스크가 아직 제한 요소가 아니라고 가정). 대부분의 경우, 현대 기계에서는이 점을 고려하여 최소한의 이익을 기대할 수 있습니다.

이제 너는 "얼마나 오래 걸릴 지 모르겠다."라고 말합니다. 글쎄, 당신이 약간의 복원을 할 때까지 당신은 알 수 없을 것이다. 시스템이 수행중인 작업과 CPU 또는 디스크 I/O로 제한되는지 모니터링하십시오.

마지막으로 데이터베이스를 복원하려는 구성 설정은 실행하려는 구성 설정이 아닙니다. 유용한 우선 몇 :

  1. 증가는 그래서 당신은 복원 중에 fsync를 끄고
  2. 큰 덩어리
  3. 에 인덱스를 구축 할 수 있습니다 maintenance_work_mem. 컴퓨터가 다운되면 어쨌든 처음부터 다시 시작합니다.

복원 후에도 재설정해야합니다.

+0

이것은 매우 유용한 정보입니다. 비록 내가 과거에 그것을 사용해 왔지만 Postgresql에 관해서는 분명히 우둔 해. 귀하의 의견이 매우 계몽 적이라는 것을 발견했습니다. –

+0

psql을 사용하는 데 약 9 시간이 걸렸습니다. 나는 pg_restore를 사용하여이를 테스트하고 싶습니다. pg_restore를 실행해야합니까? 그렇지 않으면 데이터 디렉토리를 지우고 처음부터 시작하는 것이 더 낫습니다 (이것은 테스트 상자입니다. 중요한 데이터는 모두 라이브 박스에 있습니다)? –

+0

새로운 덤프 (-Fc)가 필요합니다. 디스크 공간이 있으면 원하는 경우 다른 이름으로 데이터베이스를 복원 할 수 있습니다. 이번에 모니터링 할 계획입니다. 인덱스는 테이블 데이터보다 쉽게 ​​오래 걸릴 수 있습니다. 더 작은 테스트 DB (동일한 구조)를 만들고 덤프/복원을 여러 번 수행하면 작업이 상호 작용하는 방식을 더 잘 이해할 수 있습니다. –

21

pg_dump -Fc -Z 9 --file=file.dump myDb 

된 Fc와 덤프를 만듭니다 pg_restore에에 입력에 적합한 출력 사용자 정의 아카이브를. 이것은 데이터를로드하고 오브젝트 정의를 다시 정렬 할 수있는 가장 유연한 형식입니다. 이 형식은 기본적으로 압축되어 있습니다.

Z 9 --compress = 0..9 사용할 압축 수준을 지정하십시오. 0은 압축이 없음을 의미합니다. 사용자 정의 아카이브 형식의 경우 개별 테이블 데이터 세그먼트의 압축을 지정하며 기본값은 중간 수준에서 압축하는 것입니다.일반 텍스트 출력의 경우, 0이 아닌 압축 레벨을 설정하면 gzip을 통해 공급 된 것처럼 전체 출력 파일이 압축됩니다. 그러나 기본값은 압축되지 않습니다. tar 아카이브 형식은 현재 압축을 전혀 지원하지 않습니다.

pg_restore -Fc -j 8 file.dump 

-j 그것을 복원 : --jobs = 수 - 중 - 일 pg_restore에 가장 시간이 많이 걸리는 부분 실행 - 그 부하 데이터, 인덱스를 만들거나 제약 조건을 만들 - 여러 개의 동시 작업 사용. 이 옵션은 대형 데이터베이스를 다중 프로세서 시스템에서 실행중인 서버로 복원하는 시간을 크게 줄여줍니다.

각 작업은 운영 체제에 따라 하나의 프로세스 또는 하나의 스레드이며 서버에 별도의 연결을 사용합니다.

이 옵션의 최적 값은 서버, 클라이언트 및 네트워크의 하드웨어 설정에 따라 다릅니다. CPU 코어 수 및 디스크 설정 등이 요인입니다. 시작하기 좋은 곳은 서버의 CPU 코어 수이지만 그보다 큰 값은 많은 경우에 더 빠른 복원 시간을 초래할 수 있습니다. 물론 너무 높은 값은 스 래싱 때문에 성능이 저하 될 수 있습니다.

이 옵션에서는 사용자 지정 보관 형식 만 지원됩니다. 입력 파일은 정규 파일이어야합니다 (예 : 파이프가 아님). 이 옵션은 데이터베이스 서버에 직접 연결하지 않고 스크립트를 내보낼 때 무시됩니다. 또한 여러 작업을 --single-transaction 옵션과 함께 사용할 수 없습니다.

링크 :

pg_dump

pg_restore

6

pg 덤프 개선 & 복원

PG_DUMP | 항상 -j 옵션

time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external 

pg_restore에와 형식 디렉토리를 사용 | 항상 더 많은 정보 -j 옵션

work_mem = 32MB 
shared_buffers = 4GB 
maintenance_work_mem = 2GB 
full_page_writes = off 
autovacuum = off 
wal_buffers = -1 

time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/` 

으로 형식 디렉토리와 postgres.conf에 대한

https://gitlab.com/yanar/Tuning/wikis/improve-pg-dump&restore

관련 문제