新卒エンジニアの備忘録

BigQueryでテーブルを壊しても、7日間は巻き戻せる(タイムトラベル)

本番テーブルをうっかり上書きしてヒヤッとした。でもBigQueryにはタイムトラベルがあって、最大7日前の状態を読み直せる。慌てず復元する手順を残しておく。

本番のテーブルをうっかり上書きして、一瞬血の気が引いた。

でも結論から言うと、BigQuery なら慌てなくていい。タイムトラベルという機能で、最大7日前までの状態を読み直せる。今日はその復元手順をメモしておく。

タイムトラベルって?

BigQuery は、テーブルを変更・削除しても、変更前のデータを最大7日間は裏で保持している。FOR SYSTEM_TIME AS OF を付けてクエリすると「あの時点のテーブル」を読める。過去に遡って SELECT できる、という感覚。

方法1: 別テーブルに復元する(いちばん安全)

いきなり本番を触らず、まず別テーブルに過去の状態を吐き出して中身を確認する。

CREATE TABLE `PROJECT.DATASET.TABLE_RESTORED` AS
SELECT *
FROM `PROJECT.DATASET.TABLE`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 HOUR);

間隔(INTERVAL 5 HOUR)は「壊す前」に届く時刻に調整する。

方法2: 本番を上書きして戻す

復元データが正しいと確認できたら、本番を置き換える。今の中身は消えるので、必ず方法1で確認してから

CREATE OR REPLACE TABLE `PROJECT.DATASET.TABLE` AS
SELECT *
FROM `PROJECT.DATASET.TABLE`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 HOUR);

方法3: 消えた行だけ戻す

全部戻すと今の更新まで巻き戻ってしまう時は、消えた行だけ差し込む。

INSERT INTO `PROJECT.DATASET.TABLE`
SELECT *
FROM `PROJECT.DATASET.TABLE`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 HOUR)
WHERE id NOT IN (SELECT id FROM `PROJECT.DATASET.TABLE`);

今日の学び

  • やらかしても7日以内なら大体戻せる。まず落ち着く
  • いきなり本番を上書きしない。方法1で別テーブルに出して確認してから
  • 7日を超えると消えるので、気づいたら早めに動く

「壊しても戻せる」と知っているだけで、データを触るときの心理的な安全度が全然違う。

いむた

2026年新卒のデータエンジニア。福岡でD2Cのデータ基盤を作りながら、AI活用を推進するチームで働いています。日々の学びやつまずきを、このブログに記録しています。