본문 바로가기

PostgreSQL

PostgreSQL 9.6 Backup and Recovery

Backup & Recovery

SQL Dump

pg_dump 에 의해 만들어지는 백업은 수행이 시작되는 시점의 스냅을가집니다.

또 이는 DB 상의 다른 오퍼레이션을 블록킹하지 않습니다.

( Exclusive lock 을 획득해야 하는 ALTER TABLE 같은 오퍼레이션 제외 )

SQL Dump 는 오라클의 Datapump, MariaDB 의 mysqldump 와 같은 역할을 합니다.

backup 예시

pg_dump dbname > outfile

pg_dumpall > outfile

pg_dump dbname | gzip > filename.gz

gunzip -c filename.gz | psql dbname

pg_dump dbname | split -b 1m - filename

recover 예시

cat filename.gz | gunzip | psql dbname

cat filename* | psql dbname

psql dbname < infile

psql --set ON_ERROR_STOP=on dbname < infile

에러가 발생 시 중지

psql -f infile postgres

backup and recovery

pg_dump -h host1 dbname | psql -h host2 dbname

 

Continuous Archiving and Point-in-Time Recovery ( PITR )

PostgreSQL 은 WAL ( Write ahead logging ) 를 통해 다음의 장점을 가집니다.

  1. PostgreSQL 의 datafile 이 특정 시점에 대해 consistent 하지 않아도 됩니다.
    이는 WAL 을 통해 log replaying 이 되며, 최종적으로 PITR 을 가능케 합니다.
  2. 상당히 큰 사이즈의 케이스에 대해서도, WAL 의 지속적인 백업을 통해
    FULL BACKUP 을 빈번히 해야 하는 부담을 경감할 수 있습니다.
    ( 최초의 FULL BACKUP 은 필요 )
  3. WAL 의 최근 시점 뿐만 아니라 원하는 특정 시점의 스냅샷을 얻을 수 있습니다.
  4. Warm - standby 시스템 운용에 활용할 수 있습니다.

이 방법을 사용한 백업은 hot backup 에 해당하며, MariaDB 의 xtrabackup 과 유사합니다.

백업 방법

pg_start_backup, pg_stop_backup 을 사용한 방법

  1. SELECT pg_start_backup('label', true);
  2. pg_dump 및 pg_dumpall 도구를 제외한 OS 상의 파일 관련 도구 ( ex : cp ) 로 복사
  3. SELECT pg_stop_backup();

pg_basebackup

pg_start_backup, pg_stop_backup 내용이 포함 된 도구입니다.

더불어 파일을 기존에 수동으로 tar, cp 등의 OS 도구를 통해 처리했던 과정도 포함되어 있습니다.

 

pg_basebackup -h localhost -D /usr/local/pgsql/data -Ft -z -P

 

pg_hba.conf 관련해 정상적인 접근이 가능함에도 불구하고, 접근에 대한 권한 획득이 실패하는 문제가 있습니다.

Recovering Using a Continuous Archive Backup

리커버는 다음의 과정으로 진행됩니다.

  1. PostgreSQL 을 중지
  2. 파일 시스템 공간이 된다면 Cold backup 
    공간이 부족하다면 최소한 클러스터의 pg_xlog 디렉토리를 백업
  3. 클러스터 데이터 디렉토리와 테이블 스페이스 경로의 모든 파일을 삭제
  4. 백업을 리스토어 ( 오너쉽과, 퍼미션을 확인 )
  5. 이미 아카이브 된 pg_xlog 의 파일을 삭제
  6. 필요시 2에서 백업 한 pg_xlog 파일을 복사
  7. recovery.conf 파일을 클러스터 데이터 디렉토리에 생성
    더불어 외부연결을 막기 위해 pg_hba.conf 를 수정
  8. 서버를 기동. 서버는 recovery mode 로 들어가고 필요 시 archived WAL 파일을 읽어들입니다.
    리커버리가 완료되면 recovery.conf -> recovery.done 으로 변경 됩니다.
  9. 클러스터를 확인하고 pg_hba.conf 를 원복합니다.

recover.conf 파일의 내용은 restore_command 입니다.

restore_command = 'cp (file_path)/%f %p'

 

TEST CASE ( BACKUP ~ RECOVERY )
  1. SELECT PG_START_BACKUP('LABEL', TRUE);
  2. tar cvf pg9_6.tar pg9_6
  3. SELECT PG_STOP_BACKUP();
  4. ( 클러스터 문제 발생 )
  5. ( 프로세스가 살아있는 경우 셧다운 )
  6. rm -rf pg9_6
  7. tar xvf pg9_6.tar
  8. pg_xlog 복원 ( 3번 시점을 포함해야 함 )
  9. recovery.conf 작성
  10. 클러스터 기동

주의사항은 3번 시점을 포함하는 아카이브 WAL 혹은 WAL 을 가지고 있어야 FAIL 시점까지 복원 가능합니다.