DBAtlas · 데이터베이스 운영 아틀라스

자동 백업(pgBackRest/Barman/Xtrabackup/cron)

증상

목표: 데이터베이스 백업을 자동화한다. 예약된 전체+증분+WAL/binlog 아카이빙, retention, 검증, offsite 사본으로 신뢰할 수 있는 복구 체인을 구축한다.

1. 올바른 백업 도구를 선택한다

엔진에 맞는 도구를 선택한다: PostgreSQL에는 pgBackRest 또는 Barman(물리 백업 + WAL 아카이브 + PITR), MySQL/MariaDB에는 Percona XtraBackup(온라인 물리 백업), 작은 데이터 세트에는 mysqldump/mydumper(논리). 물리 도구는 대형 데이터베이스에서 빠르고 일관된 백업 + 시점 복구를 제공하며, 논리 덤프는 이식성이 있지만 대용량 데이터에서는 느리다.

PostgreSQL

# pgBackRest or Barman

MySQL

# physical: xtrabackup
# logical: mysqldump / mydumper

2. 전체 + 증분 + 연속 아카이브 체인을 구축한다

주간/일일 전체 백업, 그 사이의 증분/차등 백업, 연속 WAL(PostgreSQL) 또는 binlog(MySQL) 아카이빙으로 시점 복구를 구성한다. pgBackRest는 full/diff/incremental 백업 유형과 WAL 아카이브를 관리하며, PostgreSQL에서는 archive_command를 pgBackRest로 지정한다. 증분 백업 + 아카이브로 임의 시점으로 돌아갈 수 있다.

PostgreSQL

# postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=appdb archive-push %p'

# full backup
pgbackrest --stanza=appdb --type=full backup
# incremental
pgbackrest --stanza=appdb --type=incr backup

MySQL

# full
xtrabackup --backup --target-dir=/backup/full
# incremental
xtrabackup --backup --target-dir=/backup/incr1 \
  --incremental-basedir=/backup/full

3. cron/timer로 백업을 스케줄링한다

cron 또는 systemd timer로 백업 명령을 정기 실행한다: 예를 들어 일요일 밤 전체 백업, 다른 날 밤 증분 백업. 업무 시간 외로 스케줄링하고 full과 incr 작업이 겹치지 않도록 한다. 출력 로그를 기록하고 실패 시 알림을 발생시킨다.

PostgreSQL

# crontab
0 1 * * 0 pgbackrest --stanza=appdb --type=full backup
0 1 * * 1-6 pgbackrest --stanza=appdb --type=incr backup

4. retention 정책을 정의한다

백업을 무한히 쌓지 말고 보관할 전체 백업 수와 아카이브 일수를 정해 도구가 오래된 것을 자동으로 만료시키게 한다. pgBackRest에서는 repo1-retention-full과 아카이브 retention 설정으로, Barman에서는 retention_policy로 관리한다. retention은 복구 목표(며칠 전까지 돌아가야 하는지)와 일치해야 한다.

PostgreSQL

# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8

MySQL

# purge old backups with cron (example)
find /backup -type d -mtime +14 -exec rm -rf {} +

5. 백업을 offsite / S3로 복사한다

백업은 데이터베이스와 같은 머신/리전에 남아 있어서는 안 된다. 다른 위치나 오브젝트 스토리지(S3, GCS)로 복사한다. pgBackRest는 S3 호환 스토리지에 직접 기록할 수 있으며, 그렇지 않으면 rsync/rclone으로 offsite 대상에 동기화한다. 재해(로컬 디스크/리전 손실) 시에는 offsite 사본만이 구원이 된다.

PostgreSQL

# pgbackrest.conf S3 repository
[global]
repo1-type=s3
repo1-s3-bucket=company-backup
repo1-s3-region=eu-central-1
repo1-s3-endpoint=s3.eu-central-1.amazonaws.com

6. 백업을 검증한다

백업이 존재한다고 복원할 수 있는 것은 아니므로 무결성을 정기적으로 검증한다. pgBackRest에서는 'verify' 명령과 아카이브 일관성 검사, XtraBackup에서는 성공적인 prepare(--prepare) 단계가 백업이 정상임을 보여 준다. 매 백업 후 검증을 자동 실행하고 실패 시 알람을 발생시킨다.

PostgreSQL

pgbackrest --stanza=appdb verify

MySQL

# make the backup consistent (verification)
xtrabackup --prepare --target-dir=/backup/full

7. 정기적으로 복원 훈련을 실행한다

가장 중요한 단계: 주기적으로 백업을 별도 서버에 실제로 복원하고 데이터베이스가 열리며 데이터가 일관된지 검증한다. 이 훈련으로 복구 시간(RTO)을 측정하고 장애 상황이 아닐 때 절차의 허점을 잡을 수 있다. 테스트하지 않은 백업은 백업이 아니다.

PostgreSQL

# restore + PITR on a separate server
pgbackrest --stanza=appdb \
  --type=time --target="2026-07-01 03:00:00" restore

MySQL

# copy the prepared backup back to the data directory
xtrabackup --copy-back --target-dir=/backup/full
DBAtlas에서 열기 →