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活用を推進するチームで働いています。日々の学びやつまずきを、このブログに記録しています。