Backup?
정상적으로 운영 중인 서버도 여러 사항에 의해 시스템 충돌이 발생할 수 있습니다.
주기적인 백업은 이러한 상황에 대비하여 서버의 가용성을 높일 수 있습니다.
백업은 기준에 따라서 다양하게 분류가 가능합니다.
이 문서에서는 백업 방식을 기준으로 종류를 분류하였습니다.
백업 종류
- Physical Backup
- Cold Backup
- Hot Backup
- WAL Archiving (Continous Archiving)
- Logical Backup
- Database Backup
- Database Cluster Backup
Physical Backup
Cold Backup
데이터베이스 클러스터 파일 전체를 백업하는 방식입니다.
가장 간단한 방법이지만 아래와 같은 제약사항이 있습니다.
제약사항
- 데이터베이스 서버를 종료해야 합니다.
- 일반적인 파일 시스템 단위의 백업의 경우는, 스냅샷 기능을 지원하지 않습니다.
- 따라서 서버가 종료되지 않으면 백업 도중에 파일 시스템이 변경될 수 있습니다.
- 해당 제약사항의 경우, OS에서 스냅샷 기능을 지원하거나 그러한 기능을 지원하는 Tool을 사용할 경우 해결할 수 있습니다.
- 다른 백업 방식 대비 디스크 공간을 많이 차지합니다.
- 예를 들자면, 인덱스의 경우 다른 방식들은 인덱스를 생성하는 SQL만 저장하면 됩니다.
- 하지만, 파일 시스템 방식 백업의 경우 인덱스가 생성되고 저장되어 있는 파일까지 존재하므로 추가적인 용량을 차지합니다.
- 추가적으로, vacuuming 작업을 위한 fsm, vm 파일 등이 저장되기 때문도 있습니다.
- 문제 발생 시 데이터 손실을 줄이기 위해 WAL Archiving이 동시에 진행되어야 합니다.
- 백업 파일은 운영중인 시스템과 비교 시에 항상 과거 시점의 데이터를 가지고 있을 수밖에 없습니다.
- 백업 파일과 운영중이던 시스템과의 데이터 차이를 최대한 줄이기 위해서는 WAL(Write-Ahead-Log)를 Archiving 함으로써, 필요시 복구에 이용할 수 있습니다.
- WAL Archiving에 대한 자세한 내용은 아래의 WAL Archiving (Continous Archiving)에서 설명 하도록 하겠습니다.
백업방법
- 운영중인 PostgreSQL 서버를 종료합니다.
- 데이터베이스 클러스터 디렉토리를 복사합니다.
- 아래의 디렉토리의 내용들은 PostgreSQL 시작 시 초기화되므로 백업 대상에서 제외할 수 있습니다.
- 디렉토리 안의 파일만 제외하고 디렉토리 자체는 백업 대상이어야 합니다.
- pg_dynshmem
- pg_notify
- pg_serial
- pg_snapshot
- pg_stat_tmp
- pg_subtrans
- pg_wal은 Archiving을 하고 있다면 내용을 백업할 필요가 없으나, Archiving을 사용하지 않을 시 백업해야 합니다.
- 테이블스페이스를 복사합니다.
- 테이블 스페이스는 클러스터 데이터 디렉토리의 pg_tblspc 디렉토리안에 링크로 걸려있습니다.
- 실제 파일의 위치를 확인해서 같이 백업해야 합니다.
- DATA 디렉토리 안에 tablespace.map 파일을 생성하여, 테이블스페이스명 / 디렉토리 위치를 기록하는 방법이 추천됩니다.
Hot Backup
Cold Backup과 마찬가지로 데이터베이스 클러스터 파일 전체를 백업하는 방식입니다.
차이점으로는, 현재 운영중인 Database를 종료하거나 접속 및 이용을 제한할 필요가 없이 운영중인 서버를 백업할 수 있습니다.
외부 툴을 사용하는 방법을 제외 하고는 Low Level Backup과 pg_basebackup 모듈을 이용하는 방법이 있습니다.
제약사항
- 운영중인 Database 서버에 Disk I/O 부하가 생길 수 있습니다.
- Disk I/O 상태를 확인 후에 백업을 진행 하시길 바랍니다.
- WAL archiving mode가 on이고 WAL archiving이 실제로 물리적인 저장 매체에 동작하고 있어야 합니다.
- 백업을 진행하는 도중에 변경되는 파일에 대해서는 Archive된 WAL을 이용해서 백업이 끝난 시점의 데이터와 정합성이 일치하도록 복구할 수 있습니다.
- 파일 복사시 사용하는 프로그램이 복사 대상 파일이 변경되었을 때 오류를 발생하는지 확인이 필요합니다.
- 핫 백업 특성상 파일 복사 도중에 대상 파일이 변경될 수 있습니다. 이 때, 프로그램에 따라 오류를 발생시킬 수 있습니다.
백업방법
Low Level API
PostgreSQL에서 제공하는 Low Level API를 사용하는 백업 방식 입니다.
- archiving_mode 및 archive_command 를 설정합니다.
- pg_start_backup 함수를 실행합니다.
- Ex) SELECT pg_start_backup('full-2022-01-01', false, false);
- EXECUTE 권한이 있는 사용자나 SUPERUSER만 실행할 수 있으며, 아무 데이터베이스나 접속해도 클러스터 전체를 백업할 수 있습니다.
- pg_start_backup은 3개의 파라미터를 가지고 있습니다.
- 1번 파라미터 : label
- label은 백업을 구분할 수 있는 유일한 이름을 지정해주어야 합니다.
- Non-Exclusive 방식으로 백업할 시 동시에 여러 개의 백업을 진행할 수 있기 때문에 관리할 수 있는 label이 필요하고, 백업 이후에 어떤 목적으로 한 백업인지 구분할 때 사용할 수 있습니다.
- 2번 파라미터 : 체크포인트를 즉시 수행 여부를 지정할 수 있습니다.
- 기본 값은 false 이며, 이 것은 checkpoint_completion_target 값의 반절의 시간 동안 CHECKPOINT 작업을 기다리겠다는 뜻입니다.
- true로 변경 시 가능한 많은 I/O 작업을 요청해서 CHECKPOINT를 즉시 수행합니다.
- 3번 파라미터 : Non-exclusive 방식 백업 여부를 지정할 수 있습니다.
- 기본 값은 false 이며 이 것은 백업을 수행 하면서 다른 백업 요청 또한 수행할 수 있도록 하는 백업 모드입니다.
- true로 사용 시, 이 백업이 끝나기 전까지 다른 백업을 수행 요청할 수 없습니다.
- 1번 파라미터 : label
- 파일 시스템 백업을 수행합니다.
- DATABASE 서버 안에서 PSQL Client를 사용중이라면 \! COMMAND 형식으로 OS 명령어를 사용하여 백업할 수 있습니다.
- Ex) \! cp $PGDATA /bak -R
pg_basebackup
pg_basebackup은 실행중인 PostgreSQL 클러스터의 백업을 수행하는 데 사용됩니다.백업은 데이터베이스의 다른 클라이언트에 영향을 주지 않고 수행되며 지정시간 복구와 log-shipping 이나 streaming replication의 standby 서버의 시작점으로 사용할 수 있습니다.
백업은 항상 클러스터(전체 데이터베이스)에 대해서 이루어지며, 특정 데이터베이스나 특정 오브젝트만 백업할 수 없습니다.
pg_basebackup은 replication protocol 을 통해 데이터베이스 서버와 연결합니다. 따라서, 백업을 시도할 때 해당 유저에게 replication 권한이 부여되어 있어야 하며, pg_hba.conf 또한 replication 연결이 가능하도록 설정해주어야 합니다.
pg_basebackup 모듈에 대한 자세한 사용 방법은 다른 포스트에 올라갈 예정입니다.
WAL Archiving (Continous Archiving)
데이터 무결성 보장을 위해 PostgreSQL은 트랜잭션이 일어나기 전에 모든 변경 사항을 WAL file에 저장합니다.
WAL 파일은 WAL Record의 연속된 집합으로 이루어진 파일이며, WAL 파일 위치는 Data Cluster($PGDATA) 내부의 $PGDATA/pg_wal/ 입니다.
WAL 파일은 데이터베이스 복원 및 복구에 사용되기 때문에, 백업 시점 이후의 WAL 파일은 항상 보관하는 것이 좋습니다.
PostgreSQL에는 작성이 완료된 WAL 파일을 처리할 수 있는 Archive 기능이 있습니다.
이 기능을 사용하기 위해서는 archive_mode와 archive_command를 지정 해주어야 합니다.
먼저, archive_mode 파라미터에 대해 설명 해드리자면 on과 always 옵션이 있으며 이 두 가지의 옵션은 평소에는 같은 동작을 하나 always는 archive recovery 상황에도 동작(restore_command로 복구된 wal 또한 archive에 저장)하고 standby 모드일때도 동작합니다.
archive_command는 WAL 파일 작성 완료 또는 archive_timeout이상의 시간이 경과 되었을 때 해당 WAL 파일에 대한 처리 명령어를 지정할 수 있습니다.
cp 등의 OS 명령어로 파일을 다른 곳에 복사할 수도 있고, Shell Script 실행 또한 가능합니다.
해당 명령어의 수행 시 exit code가 0으로 프로그램이 정상적으로 종료되어야 PostgreSQL은 archive에 성공한 것으로 판단하게 되며, 실패 시 재시도를 하게 됩니다.
주의 사항
WAL 파일의 기록 Level에 따라 archive를 활성화 할 수 없을 수 있으므로 매뉴얼을 참조하시기 바랍니다.
WAL 파일을 저장하기 때문에 저장장치의 공간 관리에 주의를 기울여야 합니다.
Logical Backup
Database Backup
현재 데이터베이스의 상태와 동일하게 만들 수 있는 SQL 파일을 생성하여 백업하는 SQL Dump 형태의 방식입니다.
PostgreSQL에서는 이 방식의 백업을 위해 pg_dump 및 pg_dumpall 이라는 유틸리티 프로그램을 제공합니다.
pg_dump : 한번에 하나의 데이터베이스만 추출하며 role, tablespace 등에 대한 정보는 dump하지 않습니다.
pg_dumpall: 데이터베이스 클러스터 전체를 추출합니다.
데이터베이스 백업은 pg_dump 유틸리티를 사용하며, 특정 데이터베이스 단위나, 스키마, 테이블 등 세부 단위로 백업이 가능합니다.
Database Cluster Backup
데이터베이스 클러스터 전체를 SQL Dump로 백업하는 방식입니다.
pg_dumpall 유틸리티를 사용할 수 있습니다.
pg_dump와 pg_dumpall두 모듈에 대해서도 다른 포스팅에 올라갈 예정이며, 올라가는 대로 이 게시글에 링크를 걸어두도록 하겠습니다.