삭제한 Cloudflare D1, 30일 안에 복구하면 될까?

유료 요금제의 30일 Time Travel만 믿고 있다가 D1 데이터베이스를 통째로 지웠다. 삭제 취소에는 며칠이 남아 있고, 되살린 뒤 예전 기록까지 돌아올까?

삭제한 Cloudflare D1, 30일 안에 복구하면 될까?
세 줄 요약
  • D1 데이터베이스 삭제 취소는 삭제 시점부터 7일, 즉 168시간 안에 요청해야 한다.
  • Time Travel의 보존 기간은 Workers Paid 30일·Free 7일이며, DB 삭제 취소 기한을 늘리지 않는다.
  • 삭제 취소 후에는 그 시점 이전의 Time Travel 기록으로 복원할 수 없다.

유료 요금제여도 DB 삭제 취소는 7일 안에 요청한다

Cloudflare D1 데이터베이스 자체를 지웠다면 30일을 기다릴 수 없다. Cloudflare는 10월 23일 변경 안내에서 삭제한 지 7일이 지난 데이터베이스의 undelete 요청은 오류로 끝난다고 밝혔다. API 문서는 이를 7×24시간으로 명시한다.

유료 D1의 30일은 Time Travel의 과거 데이터 보존 기간다. 삭제된 데이터베이스를 되살릴 수 있는 기간과 같은 숫자가 아니다. 사고를 발견한 날짜가 아니라 실제 삭제 시각을 기준으로 판단해야 한다.

SQL로 행을 지웠는지, 데이터베이스를 없앴는지부터 가른다

잘못 실행한 SQL을 되돌리는 작업과 DB 리소스를 복구하는 작업은 출발점이 다르다. Time Travel은 실패한 스키마 변경이나 잘못된 UPDATE·DELETE 이전으로 데이터를 돌리는 기능이다. 별도로 켤 필요 없이 활성화돼 있다.

현재 상황해당 복구 경로핵심 조건
DB는 남아 있고 행이나 스키마를 잘못 바꿨다Time TravelPaid 30일·Free 7일 안의 시점으로 복원한다.
DB 자체를 삭제했다Undelete API삭제 후 7일 안에 요청한다.
삭제 취소 뒤, 삭제 전의 북마크로 돌아가려 한다해당 Time Travel 복원은 불가하다삭제 취소 시점과 그 이전 기록은 복원 대상이 아니다.

Time Travel도 데이터를 읽어 보기만 하는 기능은 아니다. 기존 DB를 해당 시점의 내용으로 덮어쓰고 진행 중인 쿼리를 취소한다. 원하는 과거 시점을 정하는 일과 현재 데이터에 미칠 영향을 판단하는 일이 함께 필요하다.

계정 ID와 삭제한 DB의 UUID로 요청한다

삭제 취소 API는 DB 이름 대신 계정 ID와 데이터베이스 UUID를 경로에 넣는다. 요청 경로는 다음과 같다.

POST /accounts/ACCOUNT_ID/d1/database/DATABASE_ID/undelete

API 기준 주소는 https://api.cloudflare.com/client/v4이며, 인증에는 Cloudflare API 토큰을 사용할 수 있다. 배포 설정에 남아 있는 DB ID를 찾았다면 삭제한 대상의 ID와 일치하는지 대조해야 한다. 같은 이름으로 새로 만든 DB의 ID를 보내는 것으로 삭제 취소를 대신할 수는 없다.

기본적으로 예전 이름으로 돌아오지만, 계정 안의 다른 DB가 이미 그 이름을 사용한다면 요청 본문의 new_name에 다른 이름을 지정해야 한다. 복구된 DB도 계정 한도에 포함된다. 따라서 기한뿐 아니라 이름 충돌과 남은 한도도 확인할 항목이다.

삭제 취소는 예전 복원 기록까지 되살리지 않는다

복구 후 다시 과거로 돌아갈 수 있다고 예상하면 복구 계획이 어긋날 수 있다. API 문서에 따르면 삭제 취소를 마친 DB는 삭제 취소 시점과 그 이전의 북마크·타임스탬프로 복원할 수 없다. 이후에 만들어진 상태만 Time Travel 대상이 된다. 잘못된 SQL 실행 뒤 DB까지 삭제한 경우라면 특히 이 제약을 고려해야 한다.

더 오래 남길 데이터에는 별도 SQL 사본을 보관하는 방법이 있다. D1은 내보내기와 가져오기를 지원하지만, 내보내는 동안 다른 DB 요청이 막히며 가상 테이블이 있는 DB에는 내보내기 제약이 있다. 단순히 백업 명령 하나를 예약하는 것으로 모든 복구 상황을 해결할 수는 없다.

이미 삭제 사고가 났다면 삭제 후 7일이 지나기 전에 삭제 취소를 요청해야 한다. 그다음 복구된 DB에서 필요한 데이터가 돌아왔는지 확인하고, 다음 사고에 대비할 보관 사본의 범위를 정해야 한다.