GCP BigQuery 데이터를 특정 시점으로 전환(PITR)

6763 단어 gcpBigQuery
소위 포인트 인 타임 복원 (Point In Time Restore, PITR) 등이라고 불리는 데이터를 특정 지점으로 되돌리는 기능이 GCP BigQuery에서도 사용할 수 있다는 것을 알았으므로 시도해 보겠습니다. BigQuery에서는 시간 여행이라는 기능인 것 같습니다.

기본적으로 아래 문서와 같습니다만, 실제로 해 보겠습니다.

환경



2021/07/13 시점의 GCP BigQuery를 사용하고 있습니다.

테스트 데이터 작성


sandbox 라는 데이터 세트를 만들어 두고 적절한 테이블을 만듭니다.
CREATE TABLE sandbox.sushi (
  id INT,
  name STRING,
  updated_at DATETIME
);

올바른 데이터 만들기



적절한 테스트 데이터를 만듭니다. 뭐든지 좋지만 CLOUD SHELL 터미널에서 아래 명령을 실행하여 적절한 데이터를 생성했습니다.
$ seq 1 10 | while read -r i; do
  bq query --use_legacy_sql=false "INSERT into sandbox.sushi VALUES ($i, 'まぐろ$i', DATETIME_TRUNC(CURRENT_DATETIME('Asia/Tokyo'), SECOND));"
  echo $i; sleep 1;
done


まぐろ 가 많이 들어 있습니다. 이 상태의 데이터가 올바른 상태, 즉 되돌아 가는 상태라고 가정합시다.

잘못된 데이터 삽입



여기서 잘못된 데이터로 1건 업데이트했습니다.
UPDATE sandbox.sushi
SET name = 'たまご', updated_at = CURRENT_DATETIME('Asia/Tokyo')
WHERE id = 8



id=8에 잘못된 たまご가 포함되었습니다.

이번은 20시 09분( '2021-07-13 20:09:00' )에 불량일까 일어나, 그 이전에 생성된 데이터는 올바르고, 그 이후에 갱신된 데이터가 잘못되어 있다는 상황을 상정합니다. updated_at 라고 하는 컬럼이 있어, 그래서 잘라낼 수 있는 이미지입니다.

올바른 데이터 확인


FOR SYSTEM_TIME AS OF 구문을 사용하면 특정 시점의 데이터를 SELECT 할 수 있습니다.
SELECT *
FROM sandbox.sushi
  FOR SYSTEM_TIME AS OF TIMESTAMP('2021-07-13 20:09:00', 'Asia/Tokyo')
ORDER BY id



올바른 まぐろ8 데이터를 얻었습니다.

올바른 데이터 복원



위의 SELECT 결과를 DML에 사용하는 등 몇 가지 방법이 있습니다만, $ bq cp 명령을 사용하면 특정의 타임 스탬프의 테이블을 가져올 수가 있습니다.

자르려는 시점의 타임 스탬프가 필요하지만 BigQuery에서도 얻을 수 있습니다.
SELECT UNIX_MILLIS(TIMESTAMP('2021-07-13 20:09:00', 'Asia/Tokyo'))


1626174540000 를 얻을 수 있었으므로, 이것을 스냅 샷 데코레이터로서 부여한 커멘드를 CLOUD SHELL로 실행합니다.
$ bq cp sandbox.sushi@1626174540000 sandbox.sushi_restored

확인해 보겠습니다.
SELECT * FROM sandbox.sushi_restored ORDER BY id



올바른 데이터 시점의 테이블이 만들어졌습니다.

이대로 잘라버리고 OK라면 ALTER TABLE ... RENAME TO ... 로 바꿉니다. 실은 2021년 5월에 가능하게 된 최신 기능 입니다.
ALTER TABLE sandbox.sushi RENAME TO sushi_mistake;
ALTER TABLE sandbox.sushi_restored RENAME TO sushi;

이것으로 자르기가 완료되었습니다.
SELECT * FROM sandbox.sushi ORDER BY id

요약



BigQuery 데이터를 특정 시점으로 전환할 수 있었습니다. 주의점으로서, 지난 7일간 밖에 데이터는 보존되지 않기 때문에 주의가 필요합니다.

참고


  • 포인트 인 타임 복원 (PITR) - Azure SQL Managed Instance | Microsoft Docs
  • 좋은 웹페이지 즐겨찾기