데이터를 잘못 지웠을 때 가장 먼저 필요한 정보는 ‘어떤 복구 명령을 쓰면 되나’보다 ‘무엇을 실행했나’입니다. 행을 삭제한 것인지, 테이블을 비운 것인지, 데이터베이스 자체가 사라진 것인지에 따라 가능한 방법이 달라집니다.
기존 글의 서비스 규모와 복구 시간은 확인 가능한 사고 기록을 함께 제시하지 못해 이번 글에서는 제외했습니다. 여기서는 특정 장애를 직접 복구했다는 이야기 대신, 사고 유형을 구분하고 복구 경로를 확인하는 절차를 다룹니다.
명령과 시각부터 보존한다
실행한 SQL, 접속한 DB와 스키마, 실행 시각과 타임존, 트랜잭션의 커밋 여부를 남깁니다. GUI 작업이었다면 실행 이력이나 감사 로그를 확인합니다. 영향받은 테이블과 행 범위, 애플리케이션의 후속 쓰기가 이어졌는지도 중요합니다.
임의로 서버를 재시작하거나 파일을 정리하면 남아 있는 증거와 복구 수단을 잃을 수 있습니다. 추가 쓰기를 제한할지는 운영 책임자와 영향 범위를 보고 정하고, 백업과 복구 로그의 보존 상태를 먼저 확인합니다. 명령을 급하게 여러 번 시도하기보다 복구 담당자에게 이 정보를 한 번에 전달하는 것이 도움이 됩니다.
DELETE와 DROP을 같은 문제로 보지 않는다
| 상황 | 확인할 경로 | 주의점 |
|---|---|---|
| 아직 커밋하지 않은 변경 | 해당 세션의 트랜잭션 상태와 롤백 가능 여부 | 자동 커밋·DDL 동작은 DB마다 다름 |
| 커밋한 행 삭제 | 과거 버전 조회 또는 백업·로그 기반 복원 | 엔진과 사전 설정에 의존 |
| TRUNCATE나 DROP | 해당 DB의 복구 기능과 백업 | 행 삭제용 방법을 그대로 적용하지 않음 |
| DB·스토리지 손실 | 별도 백업, 로그, 스토리지 복구 정책 | 같은 저장소의 복사본도 함께 손실될 수 있음 |
제품마다 차이가 커서 ‘커밋했으니 끝’이나 ‘UNDO가 있으니 돌아온다’ 어느 쪽도 일반적인 답은 아닙니다.
Oracle의 UNDO_RETENTION은 복구 타이머가 아니다
Oracle Flashback Query는 필요한 UNDO가 남아 있고 권한과 객체 조건이 맞을 때 과거 시점 데이터를 조회하는 방법입니다. UNDO_RETENTION=900을 보고 ‘최근 15분은 반드시 복구되고 그 뒤에는 불가능하다’고 해석하면 안 됩니다. 실제 보존은 공간과 워크로드, 설정에 영향을 받으며 retention guarantee 여부도 구분해야 합니다.
아래는 Oracle에서 과거 행을 조회하는 형태를 보여주는 예제입니다. orders와 order_id는 예시이며 실제 스키마·바인드 값·권한을 확인한 뒤 사용해야 합니다.
SELECT order_id, status
FROM orders AS OF TIMESTAMP :before_incident
WHERE order_id = :affected_order_id;
과거 값이 조회되더라도 그대로 전체 INSERT를 실행하지 않습니다. 현재의 정상 데이터, 이후 발생한 주문이나 결제, 고유 키와 외래 키를 함께 비교해야 합니다. 원래 행을 되살리는 것과 현재 서비스 상태를 일관되게 만드는 것은 별도 작업입니다.
백업은 원본 위에 덮기 전에 별도 환경에서 연다
PostgreSQL의 PITR처럼 기본 백업과 연속된 로그를 이용하는 복구는 사고 전에 필요한 자료가 확보되어 있어야 합니다. 사고가 난 뒤 기능을 켜는 것으로 과거 로그가 생기지는 않습니다.
별도 환경에서 목표 시점으로 복원한 뒤 행 수, 핵심 데이터, 애플리케이션 조회를 확인합니다. 필요한 일부 행을 옮길지, 전체 전환이 필요한지는 그다음에 결정합니다. 복제본도 삭제 명령이 이미 전파되었다면 정상 시점 백업을 대신하지 못할 수 있습니다.
테이블 이름을 바꾸는 것은 백업이 아닙니다. 같은 저장소에 남아 있고 참조나 배치가 깨질 수 있습니다. 삭제 유예 절차로 쓰더라도 의존성 확인과 독립적인 백업이 따로 필요합니다.
다음 복원 연습에 남길 기록
백업 완료 메시지만 확인하지 말고 복원 결과를 남깁니다. 사용한 백업의 시각과 식별자, 로그 범위, 복구 목표 시점, 소요 시간, 검증한 조회, 전환·복귀 절차를 한곳에 기록합니다. 그 기록이 있어야 어느 시점까지 데이터를 지킬 수 있고 얼마나 오래 중단될 수 있는지 설명할 수 있습니다.
