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 ) 를 통해 다음의 장점을 가집니다.
- PostgreSQL 의 datafile 이 특정 시점에 대해 consistent 하지 않아도 됩니다.
이는 WAL 을 통해 log replaying 이 되며, 최종적으로 PITR 을 가능케 합니다. - 상당히 큰 사이즈의 케이스에 대해서도, WAL 의 지속적인 백업을 통해
FULL BACKUP 을 빈번히 해야 하는 부담을 경감할 수 있습니다.
( 최초의 FULL BACKUP 은 필요 ) - WAL 의 최근 시점 뿐만 아니라 원하는 특정 시점의 스냅샷을 얻을 수 있습니다.
- Warm - standby 시스템 운용에 활용할 수 있습니다.
이 방법을 사용한 백업은 hot backup 에 해당하며, MariaDB 의 xtrabackup 과 유사합니다.
백업 방법
pg_start_backup, pg_stop_backup 을 사용한 방법
- SELECT pg_start_backup('label', true);
- pg_dump 및 pg_dumpall 도구를 제외한 OS 상의 파일 관련 도구 ( ex : cp ) 로 복사
- 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
리커버는 다음의 과정으로 진행됩니다.
- PostgreSQL 을 중지
- 파일 시스템 공간이 된다면 Cold backup
공간이 부족하다면 최소한 클러스터의 pg_xlog 디렉토리를 백업 - 클러스터 데이터 디렉토리와 테이블 스페이스 경로의 모든 파일을 삭제
- 백업을 리스토어 ( 오너쉽과, 퍼미션을 확인 )
- 이미 아카이브 된 pg_xlog 의 파일을 삭제
- 필요시 2에서 백업 한 pg_xlog 파일을 복사
- recovery.conf 파일을 클러스터 데이터 디렉토리에 생성
더불어 외부연결을 막기 위해 pg_hba.conf 를 수정 - 서버를 기동. 서버는 recovery mode 로 들어가고 필요 시 archived WAL 파일을 읽어들입니다.
리커버리가 완료되면 recovery.conf -> recovery.done 으로 변경 됩니다. - 클러스터를 확인하고 pg_hba.conf 를 원복합니다.
recover.conf 파일의 내용은 restore_command 입니다.
restore_command = 'cp (file_path)/%f %p'
TEST CASE ( BACKUP ~ RECOVERY )
- SELECT PG_START_BACKUP('LABEL', TRUE);
- tar cvf pg9_6.tar pg9_6
- SELECT PG_STOP_BACKUP();
- ( 클러스터 문제 발생 )
- ( 프로세스가 살아있는 경우 셧다운 )
- rm -rf pg9_6
- tar xvf pg9_6.tar
- pg_xlog 복원 ( 3번 시점을 포함해야 함 )
- recovery.conf 작성
- 클러스터 기동
주의사항은 3번 시점을 포함하는 아카이브 WAL 혹은 WAL 을 가지고 있어야 FAIL 시점까지 복원 가능합니다.