PostgreSQL : pg_dump, pg_restore 성능 향상


80

시작했을 때 pg_dump기본 일반 형식을 사용했습니다. 나는 깨닫지 못했다.

연구에 따르면 pg_dump -Fc | gzip -9 -c > dumpfile.gz. 나는 깨달았다.

데이터베이스를 새로 만들 때가되면

# create tablespace dbname location '/SAN/dbname';
# create database dbname tablespace dbname;
# alter database dbname set temp_tablespaces = dbname;

% gunzip dumpfile.gz              # to evaluate restore time without a piped uncompression
% pg_restore -d dbname dumpfile   # into a new, empty database defined above

나는 깨닫지 못했다고 느꼈다. 복원은 데이터베이스를 만드는 데 12 시간이 걸렸다.

# select pg_size_pretty(pg_database_size('dbname'));
47 GB

이 데이터베이스가 몇 테라 바이트가 될 것이라는 예측이 있기 때문에 지금 성능 향상을 살펴 봐야합니다.

제발 계몽 해주세요.

답변:


59

먼저 디스크 설정에서 적절한 IO 성능을 얻고 있는지 확인하십시오. 그런 다음 PostgreSQL 설치가 적절하게 조정되었는지 확인합니다. 특히 shared_buffers올바르게 설정 maintenance_work_mem되어야하며, 복원 중에는 증가해야하며, 복원 full_page_writes중에는 꺼져 있어야하며, 복원 wal_buffers중에는 16MB checkpoint_segments로 증가해야하며, 복원 중에는 16과 같은 값으로 증가해야하며, 불합리한 로그온이 없어야합니다. (실행 된 모든 명령문 로깅과 같이) auto_vacuum복원 중에는 비활성화해야합니다.

8.4를 사용중인 경우 병렬 복원도 실험 해보고 pg_restore에 대한 --jobs 옵션을 사용합니다.


슬레이브가 연결되어 있고 마스터의 부하가 이미 상당한 경우 대신 슬레이브에서 백업을 수행하는 것이 좋습니다. 특히 슬레이브는 읽기 전용이므로 어느 정도 도움이 될 수 있다고 생각합니다. 대규모 클러스터에서는 백업 시간이 오래 걸리는 경우 스 태거 백업 전용 슬레이브를 하나 이상 사용하는 것이 도움이 될 수 있습니다. 아무것도 놓치지 않도록 스트리밍 복제를 통해 이러한 스탠바이가 연결되어 마스터의 WAL에서 기록되도록 할 수 있습니다.
— StartupGuy 2013

13
shared_buffers should be set correctly그게 무슨 뜻이야?
— Juan Carlos Oropeza

1
@JuanCarlosOropeza — shared_buffers도움이 될만한 다음 문서를 보았습니다 .
— Darragh Enright

25

pg 덤프 및 복원 개선

PG_DUMP | 항상 형식 디렉토리 및 -j옵션 사용

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

PG_RESTORE | postgres.conf 및 format-directory 및 -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/

1
여기에 사용 된 구성 매개 변수는 성능을 크게 향상 시켰습니다
— ramnar

3
링크가 끊어졌습니다
— Hamed

와! 이것은 나를 많이 도왔습니다! 감사합니다!
— stasdeep

14

두 가지 문제 / 아이디어 :

  1. -Fc를 지정하면 pg_dump 출력이 이미 압축되어 있습니다. 압축은 최대가 아니므로 "gzip -9"를 사용하여 약간의 공간 절약을 찾을 수 있지만 백업의 -Fc 버전을 압축 및 압축 해제하는 데 사용되는 추가 시간 (및 I / O)을 보장하는 것으로는 충분하지 않습니다. .

  2. PostgreSQL 8.4.x를 사용하는 경우 새로운 pg_restore 명령 줄 옵션 "-j n"을 사용하여 -Fc 백업에서 복원 속도를 높일 수 있습니다. 여기서 n은 복원에 사용할 병렬 연결 수입니다. 이렇게하면 pg_restore가 둘 이상의 테이블 데이터를로드하거나 동시에 둘 이상의 인덱스를 생성 할 수 있습니다.


우리는 현재 8.3에 있습니다. 업그레이드해야하는 새로운 이유.
— Joe Creighton

8.4 버전의 pg_restore를 8.3 버전의 서버와 함께 사용할 수 있습니다. 8.3의 pg_dump를 사용하는지 확인하십시오.
— Magnus Hagander

바. 우리는 Postgres의 Solaris10 패키지 설치를 사용하고 "현재로서는 PG8.4를 S10에 통합 할 계획이 없습니다."라는 이유로 8.3에 머물러 있습니다. [참고. mail-archive.com/pgsql-general@postgresql.org/msg136829.html] 오픈 소스 postgres를 설치하고 유지하는 작업을 맡아야합니다. 여기서 할 수 있을지 모르겠네요 ... Feh.
— 조 크 레이튼

10

데이터베이스의 주요 업그레이드가 아니라 백업이 필요하다고 가정합니다.

대형 데이터베이스의 백업을 위해 당신은 설정해야 지속적인 보관 대신을 pg_dump.

  1. WAL 보관을 설정합니다 .

  2. 예를 들어
    psql template1 -c "select pg_start_backup('`date + % F- % T '' 를 사용하여 매일 기본 백업을 만드십시오. ) " rsync -a --delete / var / lib / pgsql / data / / var / backups / pgsql / base / psql template1- c "pg_stop_backup () 선택"`

복원은 pg_start_backup백업 위치에서 시간이 지나지 않은 데이터베이스 및 WAL 로그를 복원 하고 Postgres를 시작 하는 것처럼 간단 합니다. 그리고 훨씬 빨라질 것입니다.


1
PITR (WAL 아카이빙)은 시스템이 그다지 트랜잭션이 많지는 않지만 대신 많은 기록 레코드를 유지하기 때문에 고려하지 않았습니다. 그러나 지금 생각해 보면보다 "증분"백업이 도움이 될 수 있습니다. 조사하겠습니다. 감사.
— Joe Creighton

7
zcat dumpfile.gz | pg_restore -d db_name

현재 병목 현상 인 디스크에 압축되지 않은 데이터의 전체 쓰기를 제거합니다.


3

백업을 압축하면 성능이 더 빨라진다는 사실만으로 짐작할 수 있듯이 백업은 I / O 바운드입니다. 백업이 거의 항상 I / O 바운드이기 때문에 이것은 놀라운 일이 아닙니다. 데이터를 압축하면 I / O로드가 CPU로드와 교환되며 대부분의 CPU는 몬스터 데이터 전송 중에 유휴 상태이므로 압축이 순이익으로 나옵니다.

따라서 백업 / 복원 시간을 단축하려면 더 빠른 I / O가 필요합니다. 하나의 거대한 단일 인스턴스가되지 않도록 데이터베이스를 재구성하는 것 외에도 할 수있는 일은 거의 없습니다.


v9.3부터 병렬 덤프를 사용하여 pg_dump 시간 만 최적화하면 압축> 0은 많은 피해를 줄 수 있습니다! 이는 pg_dump 및 postmaster 프로세스가 이미 CPU를 많이 사용하여 압축> = 1을 추가하면 전체 작업이 I / O 바운드 대신 CPU 바운드가 크게 증가하기 때문입니다. 기본적으로 CPU가 압축없이 유휴 상태라는 이전 가정은 병렬 덤프에서 유효하지 않습니다.
— Acumenus 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.