자동 백업(pgBackRest/Barman/Xtrabackup/cron)
증상
목표: 데이터베이스 백업을 자동화한다. 예약된 전체+증분+WAL/binlog 아카이빙, retention, 검증, offsite 사본으로 신뢰할 수 있는 복구 체인을 구축한다.
1. 올바른 백업 도구를 선택한다
엔진에 맞는 도구를 선택한다: PostgreSQL에는 pgBackRest 또는 Barman(물리 백업 + WAL 아카이브 + PITR), MySQL/MariaDB에는 Percona XtraBackup(온라인 물리 백업), 작은 데이터 세트에는 mysqldump/mydumper(논리). 물리 도구는 대형 데이터베이스에서 빠르고 일관된 백업 + 시점 복구를 제공하며, 논리 덤프는 이식성이 있지만 대용량 데이터에서는 느리다.
PostgreSQL
# pgBackRest or BarmanMySQL
# physical: xtrabackup
# logical: mysqldump / mydumper2. 전체 + 증분 + 연속 아카이브 체인을 구축한다
주간/일일 전체 백업, 그 사이의 증분/차등 백업, 연속 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 backupMySQL
# full
xtrabackup --backup --target-dir=/backup/full
# incremental
xtrabackup --backup --target-dir=/backup/incr1 \
--incremental-basedir=/backup/full3. 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 backup4. retention 정책을 정의한다
백업을 무한히 쌓지 말고 보관할 전체 백업 수와 아카이브 일수를 정해 도구가 오래된 것을 자동으로 만료시키게 한다. pgBackRest에서는 repo1-retention-full과 아카이브 retention 설정으로, Barman에서는 retention_policy로 관리한다. retention은 복구 목표(며칠 전까지 돌아가야 하는지)와 일치해야 한다.
PostgreSQL
# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8MySQL
# 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.com6. 백업을 검증한다
백업이 존재한다고 복원할 수 있는 것은 아니므로 무결성을 정기적으로 검증한다. pgBackRest에서는 'verify' 명령과 아카이브 일관성 검사, XtraBackup에서는 성공적인 prepare(--prepare) 단계가 백업이 정상임을 보여 준다. 매 백업 후 검증을 자동 실행하고 실패 시 알람을 발생시킨다.
PostgreSQL
pgbackrest --stanza=appdb verifyMySQL
# make the backup consistent (verification)
xtrabackup --prepare --target-dir=/backup/full7. 정기적으로 복원 훈련을 실행한다
가장 중요한 단계: 주기적으로 백업을 별도 서버에 실제로 복원하고 데이터베이스가 열리며 데이터가 일관된지 검증한다. 이 훈련으로 복구 시간(RTO)을 측정하고 장애 상황이 아닐 때 절차의 허점을 잡을 수 있다. 테스트하지 않은 백업은 백업이 아니다.
PostgreSQL
# restore + PITR on a separate server
pgbackrest --stanza=appdb \
--type=time --target="2026-07-01 03:00:00" restoreMySQL
# copy the prepared backup back to the data directory
xtrabackup --copy-back --target-dir=/backup/full