LabHub
배우기 러닝패스 코스

バックアップとリストア

検証の三段階

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

백업 검증은 존재하는가 → 읽히는가 → 복구되는가 세 단계다. 앞의 둘은 자동화할 수 있고, 마지막은 사람이 해야 한다.

階層図: 존재하는가 → 읽히는가 → 복구되는가・"최근 성공이 24시간 이내인가"・압축이 정상인데 tar 구조가 깨진 경우도 있고 그 반대도 있다.・이것만이 진짜 검증이다.

왜 이게 필요했나

백업이 매일 돌고 있다. 로그에는 성공이라고 찍힌다. 그런데 정작 복구가 필요한 날 파일이 열리지 않는다. 이 상황은 드물지 않다.

어떻게 동작하나

1단계 — 존재하는가

가장 기본이고 의외로 여기서 걸리는 문제가 많다.

ls -lh /backup/prod/ | tail -5
find /backup/prod -type f -mtime -1 | wc -l

파일 크기가 0 이 아니고, 최신 시각인지 확인한다. "최근 성공이 24시간 이내인가" 를 모니터링이 감시하게 하는 것이 로그를 읽는 것보다 훨씬 낫다.

2단계 — 읽히는가

압축 무결성과 아카이브 목록을 확인한다.

gzip -t /backup/etc-2026-08-20.tar.gz && echo 'gzip OK'
tar -tzf /backup/etc-2026-08-20.tar.gz > /dev/null && echo 'archive OK'
sha256sum -c /backup/checksums.sha256

세 가지가 각각 다른 것을 본다. gzip -t 는 압축 스트림의 CRC, tar -t 는 아카이브 구조, sha256sum -c 는 파일 전체의 해시다. 압축이 정상인데 tar 구조가 깨진 경우도 있고 그 반대도 있다.

3단계 — 실제로 복구되는가

이것만이 진짜 검증이다. 다른 호스트나 임시 환경에 복원해 서비스를 띄워 보고, 데이터가 기대한 시점의 것인지 확인한다.

리허설 체크리스트.

암호화 키 보관은 특히 자주 빠진다. 백업을 암호화해 두고 키를 백업 대상 서버에만 두면, 그 서버가 사라졌을 때 백업은 무의미한 이진 파일이 된다.

리허설 주기는 분기 1회가 현실적인 최소선이다. 그리고 리허설은 백업을 만든 사람이 아닌 다른 사람이 문서만 보고 수행해야 절차의 빈틈이 드러난다.

검증 스크립트의 모양

#!/usr/bin/env bash
set -euo pipefail
ARCHIVE="${1:?usage: verify.sh <archive>}"

[ -s "$ARCHIVE" ] || { echo "빈 파일이거나 없음: $ARCHIVE" >&2; exit 1; }
gzip -t "$ARCHIVE" || { echo "압축 스트림 손상" >&2; exit 2; }
tar -tzf "$ARCHIVE" > /dev/null || { echo "아카이브 구조 손상" >&2; exit 3; }
echo "OK $ARCHIVE"

종료 코드를 단계별로 다르게 주는 것이 요령이다. 모니터링에서 어느 단계에서 실패했는지 바로 알 수 있다.

현장에서 만나는 모습

비트 부패(bit rot). 오래 보관한 아카이브가 조용히 손상된다. 디스크 자체는 정상이라고 보고하는데 몇 바이트가 뒤집힌다. 정기적인 체크섬 재검증이 이걸 잡는다. 백업 저장소로 ZFS 나 Btrfs 를 쓰는 이유 중 하나가 자체 체크섬이다.

테이프/오브젝트 스토리지의 조용한 실패. 쓰기는 성공했다고 답했는데 실제로는 저장되지 않는 경우가 있다. 쓰기 직후 읽어서 확인하는 절차가 필요하다.

3-2-1 이 지금도 유효한 이유

오래된 규칙이지만 클라우드에서도 그대로입니다.

사본 3개 · 매체 2종 · 오프사이트 1개

여기에 요즘은 두 가지가 더 붙습니다.

두 번째가 이 모듈의 요점입니다. 백업 개수를 자랑하는 것보다 복원해 본 백업이 하나라도 있는지 가 중요합니다.

무결성 검증을 자동화하기

사람이 기억해서 하는 검증은 언젠가 멈춥니다. 세 층을 자동으로 돌립니다.

# 1) 파일이 온전한가 — 매일
sha256sum -c backup-2026-09-06.sha256
gzip -t backup-2026-09-06.sql.gz          # 압축 무결성만 확인(빠르다)

# 2) 읽을 수 있는가 — 주마다
pg_restore --list backup.dump > /dev/null  # 목록만 뽑아 본다

# 3) 복원되는가 — 분기마다
pg_restore -d verify_db backup.dump && psql verify_db -c "select count(*) from orders"

1번은 몇 초, 2번은 몇 분, 3번은 몇 시간입니다. 비용에 맞춰 주기를 다르게 두는 것이 실무의 답입니다. 셋 다 안 하면 "백업이 있다" 는 믿음만 남습니다.

검증 결과를 어디에 남기나

검증이 실패했는데 아무도 모르면 안 한 것과 같습니다. 세 가지를 갖춥니다.

# 백업이 돌지 않는다 (심각)
time() - backup_last_success_timestamp > 86400 * 2

# 백업은 도는데 검증이 실패한다 (더 심각 — 있다고 믿었던 것이 없다)
backup_verify_success == 0

두 번째가 더 심각합니다. 백업이 안 도는 것은 알아채기 쉽지만, 돌고 있는데 쓸 수 없는 상태 는 필요한 순간까지 아무도 모릅니다.

다음 실습에서 할 것

체크섬 매니페스트를 만들고, 손상을 인위적으로 만들어 탐지하고, 단계별 종료 코드를 가진 검증 스크립트를 작성한다. 채점기가 정상 아카이브와 손상 아카이브 양쪽으로 그 스크립트를 실행한다.