ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Bigquery] 시간 이동(Time Travel)과 장애 안전(Fail-Safe)이란
    DB/Bigquery 2024. 2. 16. 00:51

    시간 이동(Time Travel)이란

    빅쿼리를 사용하면서 실수로 또는 오류로 인해 데이터가 삭제될 가능성이 있습니다. 데이터를 미리 복사해놨다면 다행이지만 복사본이 없다면 많이 당황을 할텐데 빅쿼리의 시간 이동(time travel) 기능으로 삭제 후 최대 7일까지의 데이터를 손쉽게 복구할 수 있습니다.

    시간 이동은 최소 2일부터 7일까지 설정할 수 있고 기본값은 7일입니다. 이러한 기능은 데이터셋 단위로 지정할 수 있습니다. 시간 이동을 최소 단위(2일)로 설정한다면 physical storage 비용 절약을 할 수 있습니다.

    시간 이동 설정하기

    시간 이동 설정은 다음과 같이 빅쿼리 콘솔에서 간단하게 진행할 수 있습니다.

    시간 이동을 사용해 특정 시점의 데이터 쿼리하기

    FOR SYSTEM_TIME AS OF 절을 사용하여 시간 이동 기간 내의 데이터를 쿼리할 수 있습니다. 주의해야 할 점은 외부 테이블은 시간 이동을 사용해 특정 시점의 데이터를 쿼리할 수 없습니다.

    SELECT *
    FROM `mydataset.mytable`
      FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);

    현재 시간을 사용해 특정 시점을 조회하는 예시

    SELECT *
    FROM `mydataset.mytable`
      FOR SYSTEM_TIME AS OF timestamp('2024-02-15 00:00:00');

    시점을 고정하여 조회하는 예시

     

    타임스탬프가 시간 이동 기간 이전 또는 테이블 생성 이전의 시간을 지정하는 경우 쿼리가 실패하고 다음과 비슷한 오류가 반환됩니다.

    Invalid snapshot time 1601168925462 for table
    myproject:mydataset.table1@1601168925462. Cannot read before 1601573410026.

    CREATE OR REPLACE TABLE 문을 사용하여 기존 테이블을 대체했어도 FOR SYSTEM_TIME AS OF를 사용하면 이전 테이블 버전을 조회할 수 있습니다.

    테이블이 삭제된 경우 쿼리가 실패하고 다음과 비슷한 오류가 반환됩니다.

    Not found: Table myproject:mydataset.table was not found in location US

    시간 이동을 사용해 삭제된 특정 시점의 테이블 복원하기

    삭제된 테이블을 복원해야 할 때, 시간 이동 기간 내라면 복원을 진행할 수 있습니다. 테이블 복원은 쿼리가 아닌 bq 명령어를 통해 진행합니다.

    이전 데이터를 복사하려면 다음 구문을 사용하여 데코레이터를 테이블 이름에 추가합니다.

    • tableid@TIME: TIME은 Unix epoch(유닉스 시간 1970-01-01 00:00:00) 이후의 밀리초 수
    • tableid@-TIME_OFFSET: TIME_OFFSET은 현재 시간 기준의 상대 오프셋(밀리초)
    • tableid@0: 사용 가능한 가장 오래된 이전 데이터를 지정

    예를 들어 다음 bq 명령줄 도구 명령어는 1시간(3600초 * 1000) 전의 table1이라는 테이블을 table1_restored라는 테이블에 복사합니다. 시간 -3600000은 상대 오프셋을 사용하여 밀리초 단위로 지정됩니다.

    $ bq cp mydataset.tableid@-3600000 mydataset.table1_restored

    시간 이동을 사용해 특정 시점의 데이터 테이블 스냅샷 만들기

    시간 이동을 사용한다면 특정 시간 전의 테이블 스냅샷을 만들 수 있습니다.

    CREATE SNAPSHOT TABLE SNAPSHOT_PROJECT_ID.SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME
    CLONE TABLE_PROJECT_ID.TABLE_DATASET_NAME.TABLE_NAME
    FOR SYSTEM_TIME AS OF
      TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);
    • SNAPSHOT_PROJECT_ID: 스냅샷을 만들 프로젝트의 프로젝트 ID
    • SNAPSHOT_DATASET_NAME: 스냅샷을 만들 데이터 세트의 이름
    • SNAPSHOT_NAME: 만들려는 스냅샷의 이름
    • TABLE_PROJECT_ID: 스냅샷을 만들 테이블이 포함된 프로젝트의 프로젝트 ID
    • TABLE_DATASET_NAME: 스냅샷을 만들 테이블이 포함된 데이터 세트의 이름
    • TABLE_NAME: 스냅샷을 만들 테이블의 이름

    위 쿼리는 1시간 이전의 테이블 스냅샷을 남기는 예시입니다.

    장애 안전(Fail-Safe)이란

    장애 안전이란 시간 이동이 지난 데이터를 7일 동안 보관하여 복구할 수 있는 2차 안전 장치입니다. 테이블 단위로 복구할 수 있지만 직접 진행할 순 없고 Cloud Customer Care 에 문의를 해야 합니다.

    예를 들어, 시간 이동이 2일로 설정되어 있는 데이터셋에서 테이블을 삭제했다면 다음과 같이 시간 이동, 장애 안전이 설정됩니다.

    1. 2024-02-16 00:00:00 테이블 삭제
    2. 2024-02-16 00:00:00 ~ 2024-02-17 23:59:59 시간 이동으로 복구 가능
    3. 2024-02-18 00:00:00 ~ 2024-02-14 23:59:59 장애 안전으로 복구 가능

    비용

    Physical storage 청구 모델을 사용한다면 Physical storage 비용 뿐만 아니라 시간 이동 및 장애 안전에 사용되는 저장 비용도 포함이 됩니다. logical storage를 사용한다면 해당 비용이 청구되진 않습니다. 따라서 Physical storage로 전환을 진행하고자 한다면 physical storage 설명 에서의 비용 계산 쿼리를 필수적으로 실행해봐야 합니다.

    physical storage를 사용하는 경우 INFORMATION_SCHEMA의 TABLE_STORAGETABLE_STORAGE_BY_ORGANIZATION 뷰의 TIME_TRAVEL_PHYSICAL_BYTESFAIL_SAFE_PHYSICAL_BYTES 컬럼을 보면 시간 이동 및 장애 안전에 사용된 크기를 확인할 수 있습니다.

    요약

    • 빅쿼리에선 삭제된 데이터 및 테이블을 조회, 복구할 수 있는 시간 이동, 장애 안전 이란 2차 장치가 존재
    • 시간 이동은 직접 복구할 수 있지만 장애 안전은 문의를 해야함
    • physical storage를 사용하는 경우, 시간 이동, 장애 안전의 저장 비용도 청구가 됨

    레퍼런스

    https://cloud.google.com/bigquery/docs/time-travel?hl=ko

    https://cloud.google.com/bigquery/docs/table-snapshots-create?hl=ko#create_a_table_snapshot_using_time_travel

    https://cloud.google.com/bigquery/docs/access-historical-data?hl=ko

    https://medium.com/google-cloud/restore-deleted-data-from-bigquery-using-time-travel-feature-3dd3abf0af8d

    https://hevodata.com/learn/bigquery-time-travel/#btt

    댓글