백업과 복구
백업의 가치는 복구해봤는지에서 나온다
두 가지 목표
| 지표 | 뜻 | 정하는 것 |
|---|
| RPO | 얼마만큼의 데이터를 잃어도 되는가 | 백업 주기 |
| RTO | 얼마 안에 복구되어야 하는가 | 복구 방식과 준비 상태 |
RPO 가 1시간이면 한 시간마다 백업하면 되고, 0 에 가까워야 하면 변경 로그를 계속 보관해야 합니다. RTO 가 짧아야 하면 대기 서버를 미리 띄워 둡니다.
백업 종류
| 종류 | 내용 | 특징 |
|---|
| 논리 백업 | SQL 문장으로 내보낸다 | 버전 간 이동이 쉽다. 크고 느리다 |
| 물리 백업 | 데이터 파일을 그대로 복사 | 빠르다. 같은 버전에서만 복원 |
| 스냅샷 | 저장 볼륨 수준의 복사 | 매우 빠르다. 클라우드에서 흔하다 |
| 변경 로그 보관 | 백업 이후의 모든 변경을 남긴다 | 원하는 시점으로 되돌릴 수 있다 |
마지막이 특정 시점 복구를 가능하게 합니다. 어제 자정 백업 + 그 이후 변경 로그가 있으면, "오늘 14시 32분 직전"으로 되돌릴 수 있습니다. 실수로 테이블을 지웠을 때 필요한 것이 이것입니다.
실수로 지웠을 때
| 상황 | 대응 |
|---|
| 트랜잭션을 커밋하지 않았다 | 롤백 |
| 커밋했지만 시점 복구가 가능하다 | 지운 직전 시점으로 복구 |
| 시점 복구가 안 된다 | 마지막 백업으로 복구. 그 이후 데이터를 잃는다 |
| 복제본이 있다 | 복제도 함께 지워졌다. 복제는 백업이 아니다 |
네 번째가 중요한 오해입니다. 복제는 백업이 아닙니다. DROP TABLE 은 복제본에도 그대로 전파됩니다. 복제는 서버 장애에 대비하는 것이고, 잘못된 명령에 대비하는 것은 백업입니다.
복구 시간을 줄이려면
| 방법 | 내용 |
|---|
| 지연 복제본 | 복제를 일부러 몇 시간 늦춘다. 실수를 그 안에 발견하면 그것으로 복구 |
| 대기 서버 | 이미 복원된 서버를 띄워 두고 승격만 한다 |
| 부분 복구 | 필요한 테이블만 별도 인스턴스에 복원해 옮긴다 |
| 정기 복구 연습 | 실제로 복원해 시간을 재고 절차를 검증한다 |
세 번째가 실무에서 유용합니다. 전체를 되돌리면 그동안의 정상 데이터도 사라지므로, 별도 인스턴스에 복원한 뒤 필요한 행만 옮깁니다.
검증하지 않은 백업
백업이 돌고 있다는 것과 복구가 된다는 것은 다릅니다. 확인할 것들입니다.
| 항목 | 내용 |
|---|
| 실제로 복원되는가 | 정기적으로 다른 인스턴스에 복원해본다 |
| 얼마나 걸리는가 | RTO 를 만족하는지 시간을 잰다 |
| 무엇이 빠졌는가 | 새로 만든 테이블이 백업 대상에 들어 있는지 |
| 어디에 보관되나 | 원본과 같은 계정, 같은 지역에만 두면 함께 잃는다 |
Q.실수로 테이블을 DROP 했습니다. 어떻게 복구하나요?
| 상황 | 대응 | 잃는 것 |
|---|
| 트랜잭션을 커밋하지 않았다 | 롤백 | 없음 |
| 시점 복구가 가능하다 | 지운 직전 시점으로 복원 | 그 이후의 정상 변경 |
| 마지막 백업만 있다 | 백업 시점으로 복원 | 백업 이후 전부 |
| 지연 복제본이 있다 | 아직 반영되지 않았으면 그것에서 가져온다 | 거의 없음 |
가장 좋은 경로는 별도 인스턴스에 복원한 뒤 테이블만 옮기는 것입니다. 운영 DB 전체를 되돌리면 그동안 들어온 정상 데이터까지 사라집니다.
| 순서 | 작업 |
|---|
| 1 | 추가 피해를 막는다. 관련 작업을 멈춘다 |
| 2 | 지운 정확한 시각을 확인한다 |
| 3 | 별도 인스턴스에 그 직전 시점으로 복원한다 |
| 4 | 그 인스턴스에서 테이블을 내보내 운영에 넣는다 |
| 5 | 그동안 쌓였어야 할 변경을 보정한다 |
복제본에서 가져오려 해도 대개 안 됩니다. DROP 은 복제에 그대로 전파되므로 복제본에서도 사라집니다.
흔한 실수: 복제본이 있으니 백업이 필요 없다고 보는 것. 복제는 서버 장애에 대비하고, 잘못된 명령에는 대비하지 못합니다. 두 가지는 다른 위험에 대한 대비입니다.
Q.RPO 와 RTO 는 무엇을 정하는 지표인가요?
| 지표 | 묻는 것 | 결정하는 것 |
|---|
| RPO | 얼마만큼의 데이터를 잃어도 되는가 | 백업 주기와 변경 로그 보관 |
| RTO | 얼마 안에 복구되어야 하는가 | 복구 방식과 준비 상태 |
예를 들어 이렇게 갈립니다.
| 요구 | 필요한 구성 |
|---|
| RPO 24시간 | 하루 한 번 백업으로 충분 |
| RPO 5분 | 변경 로그를 계속 보관하고 자주 전송 |
| RPO 0 | 동기 복제. 쓰기 지연을 감수한다 |
| RTO 8시간 | 백업에서 복원하는 시간이면 된다 |
| RTO 10분 | 대기 서버를 미리 띄워 승격만 한다 |
| RTO 1분 | 자동 승격까지 구성한다 |
두 지표를 함께 정해야 비용이 나옵니다. RPO 0 과 RTO 1분을 요구하면 동기 복제와 자동 승격이 필요하고, 인프라 비용이 배로 듭니다.
그리고 서비스 안에서도 데이터별로 다릅니다. 결제 기록은 RPO 0 에 가까워야 하고, 접속 로그는 하루를 잃어도 됩니다.
흔한 실수: 두 지표를 정하지 않고 백업만 돌리는 것. 장애가 났을 때 "얼마나 잃었고 얼마나 걸리는지" 아무도 모르는 상태가 됩니다.
Q.백업이 돌고 있는데 복구가 안 되는 경우는 왜 생기나요?
백업이 성공했다는 것과 복구가 된다는 것은 다른 사실입니다.
| 원인 | 내용 |
|---|
| 복원을 해본 적이 없다 | 파일이 손상됐거나 절차가 틀려도 모른다 |
| 대상이 빠졌다 | 새로 만든 테이블이나 스키마가 백업 목록에 없다 |
| 버전 불일치 | 물리 백업은 같은 버전에서만 복원된다 |
| 보관 위치 | 원본과 같은 계정과 지역에만 두어 함께 잃는다 |
| 복구 시간 초과 | 복원은 되지만 RTO 를 넘긴다 |
| 권한과 절차 | 담당자만 알고 있어 부재 시 진행이 안 된다 |
첫 번째가 근본입니다. 그래서 정기적으로 실제 복원을 해보고 시간을 재는 것이 백업 운영의 일부입니다.
| 점검 항목 | 주기 |
|---|
| 다른 인스턴스에 복원 | 분기 또는 반기 |
| 복원 시간 측정 | 함께 |
| 백업 대상 목록 검토 | 스키마 변경 때마다 |
| 절차 문서와 권한 확인 | 담당자 변경 때 |
흔한 실수: 백업 성공 알림만 보고 안심하는 것. 알림은 "파일이 만들어졌다"를 말하고 "그 파일로 서비스를 되살릴 수 있다"를 말하지 않습니다.
Q.지연 복제본은 무엇에 쓰나요?
복제를 일부러 몇 시간 늦춰 두고, 실수를 그 시간 안에 발견하면 그것으로 복구합니다.
| 구성 | 반영 시점 | 용도 |
|---|
| 일반 복제본 | 즉시 | 읽기 분산, 서버 장애 대비 |
| 지연 복제본 | 예를 들어 1시간 뒤 | 잘못된 명령에 대비 |
DROP TABLE 이나 잘못된 UPDATE 는 일반 복제본에 즉시 전파되어 그곳에서도 사라집니다. 지연 복제본은 아직 그 변경을 적용하지 않았으므로 원래 데이터가 남아 있습니다.
| 장점 | 단점 |
|---|
| 복구가 빠르다. 백업 복원보다 훨씬 | 지연 시간을 넘겨 발견하면 쓸 수 없다 |
| 시점 복구 절차보다 단순하다 | 인스턴스 비용이 든다 |
| 읽기 분산에도 쓸 수 있다 | 지연된 데이터라 실시간 조회에는 부적합 |
발견 시간이 관건입니다. 1시간 지연이면 1시간 안에 알아채야 하므로, 이상 감지와 알림이 함께 있어야 의미가 있습니다.
흔한 실수: 지연 복제본을 백업 대신으로 삼는 것. 지연 시간이 지나면 같은 상태가 되므로, 오래된 실수나 장기 보관 요구에는 답이 되지 않습니다. 백업과 함께 두는 장치입니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
데이터베이스 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.