타임 트래블
타임 트래블 (Time Travel)
테이블을 실수로 지웠거나, 예전 시점의 데이터가 필요해진 적이 있나요? Snowflake의 타임 트래블(Time Travel) 을 쓰면 정의된 기간 안에서 언제라도 변경되거나 삭제된 과거 데이터에 접근할 수 있어요. 실수로 지운 객체를 복원하고, 과거의 특정 시점을 복제·백업하며, 기간별 데이터 사용을 분석하는 데 쓰는 기능이에요.
출처: Understanding & using Time Travel - Snowflake Documentation
무엇을 할 수 있나요
정의된 기간 안에서는 다음 작업이 가능해요.
- 이후에 갱신되거나 삭제된 과거 데이터를 조회
- 과거의 특정 시점이나 그 이전 시점을 기준으로 테이블·스키마·데이터베이스 전체를 클론
- 드랍된 테이블·스키마·데이터베이스를 복원
정의된 기간이 지나면 그 데이터는 Fail-safe로 이동해 더 이상 위 작업을 할 수 없어요. 또 유의할 점은, 오래 걸리는 타임 트래블 쿼리가 실행되는 동안에는 계정의 데이터·객체가 Fail-safe로 옮겨지는 것이 지연된다는 거예요.
타임 트래블 SQL 확장
타임 트래블을 지원하기 위해 Snowflake는 두 가지 SQL 확장을 도입했어요.
AT | BEFORE절:SELECT문과CREATE ... CLONE명령(객체 이름 바로 뒤)에서 사용해요. 시점을 지정하는 방법은 세 가지예요.TIMESTAMPOFFSET(현재 시점으로부터의 초 단위 차이)STATEMENT(쿼리 ID)
UNDROP <object>명령: 테이블·스키마·데이터베이스·계정·외부 볼륨·태그에 사용할 수 있어요.
데이터 보존 기간
타임 트래블의 핵심은 데이터 보존 기간(Data retention period) 이에요. 테이블의 데이터가 수정되거나, 데이터를 가진 객체가 드랍되면, Snowflake는 갱신 이전의 상태를 보존해요. 보존 기간은 그 과거 상태를 얼마나 오래 유지할지(일 수)를 지정하고, 그 동안 SELECT·CREATE ... CLONE·UNDROP이 가능해요.
- 기본 보존 기간은 1일(24시간) 이고 모든 계정에 자동으로 켜져 있어요.
- Standard Edition은 계정·객체(데이터베이스·스키마·테이블) 수준에서 0으로 설정하거나 기본 1일로 되돌릴 수 있어요.
- **Enterprise Edition(이상)**은 transient·temporary 객체는 0
1일, permanent 데이터베이스·스키마·테이블은 090일까지 설정할 수 있어요.
보존 기간이 0이면 그 객체의 타임 트래블이 사실상 꺼진 것이에요. 보존 기간이 끝나면 과거 데이터가 Fail-safe로 가고, 조회·클론·복원이 모두 불가능해져요.
보존 기간 지정·변경
보존 기간은 DATA_RETENTION_TIME_IN_DAYS 객체 파라미터로 다뤄요.
ACCOUNTADMIN역할 사용자가 계정의 기본 보존 기간을 설정할 수 있어요.- 데이터베이스·스키마·테이블을 만들 때 그 파라미터로 기본값을 덮어쓸 수 있어요.
- 데이터베이스·스키마에 보존 기간을 지정하면 그 안에서 만드는 객체가 기본으로 상속해요.
- 계정 수준의
MIN_DATA_RETENTION_TIME_IN_DAYS를 설정하면 최소 보존 기간이 강제되고, 실제 보존 기간은MAX(DATA_RETENTION_TIME_IN_DAYS, MIN_DATA_RETENTION_TIME_IN_DAYS)로 결정돼요.
주의할 점이 있어요. 객체의 보존 기간을 0으로 설정하기 전에, 그 객체를 지웠을 때 복구할 수 없게 된다는 뜻인지 먼저 고민해 봐야 해요. 보존 기간이 0인 객체가 드랍되면 복원이 불가능하니까요. 일반적으로 어떤 객체든 최소 1일은 유지하는 걸 권장해요.
보존 기간 확인하기
객체별 현재 보존 기간은 SHOW 명령의 retention_time 컬럼으로 확인할 수 있어요. SHOW TABLES, SHOW SCHEMAS, SHOW DATABASES가 대표적이에요. 스트림은 SHOW STREAMS 출력의 stale_after 컬럼을 보면 돼요. 이미 드랍된 객체까지 보려면 SHOW 명령에 HISTORY 절을 붙여요.
예를 들어 특정 테이블들의 보존 기간을 필터링하려면 SHOW TABLES의 결과를 $1이라는 임시 결과로 받아 조회할 수 있어요.
SHOW TABLES
>> SELECT "name", "retention_time" FROM $1
WHERE "name" IN ('MY_TABLE1', 'MY_TABLE2');
타임 트래블이 꺼진 스키마를 찾으려면 다음처럼 돌려요.
SHOW SCHEMAS
>> SELECT "name", "retention_time" FROM $1
WHERE "retention_time" = 0;
드랍된 객체를 포함해 보존 기간이 기본값보다 긴 데이터베이스를 보려면 HISTORY를 붙여요.
SHOW DATABASES HISTORY
>> SELECT "name", "retention_time", "dropped_on" FROM $1
WHERE "retention_time" > 1;
실제 복원 예시
타임 트래블의 대표적인 쓰임은 드랍된 테이블 복원이에요. 다음 흐름을 보면 loaddata1 테이블을 만들고 지웠다가, 다른 테이블을 만들고 다시 UNDROP으로 살리는 과정을 확인할 수 있어요.
DROP TABLE loaddata1;
CREATE TABLE loaddata1 (c1 varchar);
SHOW TABLES HISTORY;
-- (여러 버전의 LOADDATA1이 HISTORY 결과에 나타남)
ALTER TABLE loaddata1 RENAME TO loaddata3;
UNDROP TABLE loaddata1;
SHOW TABLES HISTORY;
SHOW TABLES HISTORY의 dropped_on 컬럼을 보면 같은 이름의 테이블이 과거에 여러 번 존재했고 각각 언제 드랍됐는지 파악할 수 있어요. 이 지식을 바탕으로 원하는 시점의 테이블을 선택해 복원하면 돼요.