[Snowflake 101] Day 3: 실수를 되돌리는 힘, Time Travel & Fail-safe
UPDATE 문에 WHERE 절을 빠뜨렸다. 혹은 프로덕션 테이블을 실수로 DROP 했다. 데이터 엔지니어라면 식은땀이 흐르는 순간이다.
전통적인 RDBMS나 온프레미스 DW 환경에서는 백업(Backup)본을 찾아 복원(Restore)하는 긴급 작업을 수행해야 한다. 복원하는 데 수 시간이 걸리고, 백업 시점 이후의 데이터는 잃게 된다.
Snowflake에서는 이 과정이 쿼리 한 줄로 해결된다. 데이터를 별도로 백업하지 않아도 과거 시점의 데이터를 조회하거나 되돌릴 수 있는 기능, Time Travel(시간 여행) 덕분이다.
오늘은 Snowflake의 강력한 데이터 보호 메커니즘인 Time Travel과 Fail-safe에 대해 알아본다.
1. Time Travel: 쿼리로 과거 조회하기
Time Travel은 특정 시점(Point-in-Time)의 데이터를 SQL로 즉시 조회하는 기능이다. 별도의 스냅샷을 찍을 필요가 없다. Snowflake의 아키텍처인 불변(Immutable) 마이크로 파티션 덕분에, 데이터가 수정되어도 기존 데이터 블록은 지워지지 않고 유지되기 때문이다.
1.1. AT / BEFORE 구문
테이블 뒤에 AT나 BEFORE 키워드를 붙이면 된다.
1
2
3
4
5
6
7
8
9
10
-- 1. 특정 시간(Timestamp) 기준 조회
SELECT * FROM orders AT(TIMESTAMP => '2026-01-21 14:00:00'::timestamp);
-- 2. 특정 시간 간격(Offset) 기준 조회 (10분 전 데이터)
SELECT * FROM orders AT(OFFSET => -60 * 10);
-- 3. 특정 쿼리 ID(Statement) 기준 조회
-- (실수로 쿼리를 잘못 날리기 직전 상태를 조회할 때 유용하다)
SELECT * FROM orders BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
1.2. 데이터 복구 패턴
잘못 변경된 테이블을 복구할 때는 CREATE OR REPLACE TABLE ... AS SELECT (CTAS) 구문을 조합하여 사용한다.
1
2
3
4
-- 5분 전 상태로 테이블 원상 복구
CREATE OR REPLACE TABLE orders AS
SELECT * FROM orders AT(OFFSET => -60 * 5);
2. UNDROP: 삭제된 테이블 살리기
테이블을 아예 삭제(DROP)해버린 경우에도 당황할 필요 없다. 휴지통에서 파일을 꺼내듯 UNDROP 명령어로 즉시 복구 가능하다.
1
2
3
4
5
6
DROP TABLE important_users;
-- (아차!)
UNDROP TABLE important_users;
-- (테이블 구조와 데이터, 권한까지 즉시 복구됨)
이 기능은 Database나 Schema 단위에도 적용된다. 실수로 스키마 전체를 날려도 UNDROP SCHEMA로 살릴 수 있다.
3. 보존 기간 (Retention Period)과 비용
Time Travel은 공짜가 아니다. 과거 데이터를 유지하는 만큼 스토리지 비용(Storage Cost)이 발생한다.
- Standard Edition: 기본 1일(24시간)만 보존된다.
- Enterprise Edition: 최대 90일까지 설정 가능하다.
1
2
3
4
-- 테이블 생성 시 보존 기간 설정 (최대 90일)
CREATE TABLE logs (id int, msg string)
DATA_RETENTION_TIME_IN_DAYS = 90;
변경이 잦은(High Churn) 테이블을 90일 동안 보존하면 스토리지 비용이 급증할 수 있다. 따라서 중요하지 않은 임시 데이터나 ETL 중간 단계 테이블은 TRANSIENT 테이블로 생성하여 보존 기간을 제한하는 것이 경제적이다.
4. 최후의 보루, Fail-safe
Time Travel 기간이 지나면 데이터는 삭제될까? 즉시 삭제되지 않고 Fail-safe 영역으로 이동한다.
- 기간: Time Travel 종료 후 7일간 보관.
- 특징: 사용자가 SQL로 조회하거나 복구할 수 없다. 오직 Snowflake 고객 지원팀(Support)에 요청해야만 복구가 가능하다.
- 목적: 시스템 장애나 극단적인 데이터 손실 상황을 대비한 재해 복구(DR)용이다.
데이터의 수명 주기는 다음과 같다. Active Data -> Time Travel (1~90일) -> Fail-safe (7일) -> 영구 삭제
Summary
Snowflake의 Time Travel은 데이터 운영의 안정성을 획기적으로 높여준다. 개발자는 더 이상 백업 테이프를 찾을 필요 없이 AT 구문 하나로 실수를 만회할 수 있다.
하지만 Time Travel 데이터도 스토리지 용량을 차지한다는 점을 명심해야 한다. 모든 테이블을 90일 보존하는 것은 낭비다. 데이터의 중요도에 따라 보존 정책을 다르게 가져가야 한다.