BigQueryには、誤ったテーブルの上書きやデータの削除が発生した際に、過去の特定の時点の状態を参照・復元できるタイムトラベル(Time Travel)機能が備わっています。

本記事では、この機能の技術的な仕組み、具体的な復元手順、そして過去データとの比較による調査への活用法について解説します。

1. タイムトラベル機能の概要

タイムトラベル機能は、過去の特定の時点(Point-in-Time)のテーブルデータを参照したり、新しいテーブルとして復旧したりできる機能です。

事前のバックアップ設定なしで、BigQueryが自動的に過去の変更履歴を保持しているため、操作ミスが発生した際の確実なデータ保護手段となります。

2. データ保持期間とストレージ料金

データ保持のサイクル

データの変更・削除が行われた後、以下のサイクルでデータが保持されます。

  1. タイムトラベル期間(デフォルト7日間):
    • ユーザー自身がSQLやコマンドを使用して、過去のデータを直接参照・復元できる期間です。
    • データセットの設定により、2日間〜7日間の間で保持期間をカスタマイズできます。
  2. フェイルセーフ期間(一律7日間):
    • タイムトラベル期間の終了後、さらに7日間Google側でデータが保持される期間です。
    • ユーザーは直接アクセスできず、データの復元にはGoogle Cloud サポートへの依頼が必要です。

ストレージ構成による課金モデルの違い

タイムトラベル期間中に保持されるデータの課金体系は、データセットのストレージ構成によって異なります。

  • 論理ストレージ(デフォルト): タイムトラベルおよびフェイルセーフ期間のデータ保持に対して、追加のストレージ料金は発生しません
  • 物理ストレージ: 実際にディスクを占有している圧縮後のデータ量に対して課金されるため、タイムトラベルおよびフェイルセーフ期間の保持データも課金対象となります。

3. 具体的な操作手順

① 過去のデータのクエリ(参照)

特定の時点の状態を確認するには、FOR SYSTEM_TIME AS OF 句を使用します。

日本時間(JST)を指定してクエリする例:

SELECT *
FROM `your-project.your_dataset.your_table`
FOR SYSTEM_TIME AS OF '2025-03-17 10:00:00+09';

② テーブルの復元

誤って更新・削除したデータを復元するには、過去時点のデータを新しいテーブル(または元のテーブル)に書き出します。

SQL(CREATE TABLE AS SELECT)による復元:

CREATE OR REPLACE TABLE `your-project.your_dataset.restored_table` AS
SELECT *
FROM `your-project.your_dataset.your_table`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 MINUTE);

③ bqコマンド(CLI)による復元

テーブル自体を削除(DROP)した場合はSQLが実行できないため、bq cp コマンドを使用します。テーブル名の末尾に @ とミリ秒単位のUNIXタイムスタンプを付与してコピーします。

# 特定時点(1647482400000)の状態を新しいテーブルとして復元
bq cp your_dataset.your_table@1647482400000 your_dataset.restored_table

ミリ秒単位のUNIXタイムスタンプを取得する方法
以下のSQLを実行することで、特定の日時から必要な数値を算出できます。

SELECT UNIX_MILLIS(TIMESTAMP '2025-03-17 10:00:00+09') AS millis;

4. 過去データとの比較による変更履歴の調査

タイムトラベルはデータの復旧だけでなく、過去の状態と「現在のデータ」を比較して、何が変更されたかを特定する調査ツールとしても活用できます。

主な活用シーン

  • バッチ処理の影響調査: 処理の前後を比較し、更新・削除されたレコードを特定する。
  • 誤操作の範囲特定: UPDATE 文の条件ミスにより、意図せず更新されたレコードを特定する。
  • 局所的なデータ修復: テーブル全体を戻さず、特定のIDを持つレコードのみを過去の値に更新する。

調査の考え方

現在のテーブルと過去のデータを比較する場合、一度過去のデータを一時テーブル(TEMP TABLE)などに保存してから、現在のテーブルと結合(JOIN)して差分を確認するのが一般的です。

このように、タイムトラベル機能を応用することで、データの不整合が起きた際の原因究明をスムーズに行うことができます。

5. 注意点と制限事項

データセット自体を削除した場合

データセットを削除すると、通常の手順ではタイムトラベルを利用できませんが、以下の条件を満たす場合に限り復旧できる可能性があります。
1. 削除したデータセットと「同一の名前・同一のリージョン」で空のデータセットを再作成する。
2. 再作成はデータセットの削除から24時間以内に行う。
3. 再作成の直後に、上記 bq cp コマンドを用いて各テーブルの復旧を試みる。

長期保存が必要な場合

タイムトラベルの保持期間(最大7日間)を超える履歴管理が必要な場合は、テーブルスナップショット(Table Snapshots)機能の利用を検討してください。

まとめ

BigQueryのタイムトラベル機能は、設定不要で利用可能な強力なデータ保護の仕組みです。

  1. FOR SYSTEM_TIME AS OF による過去データの参照
  2. テーブル削除時の bq cp による復元
  3. フェイルセーフ期間(要サポート依頼)の存在

これらの仕様を正しく理解し、万が一の事態に備えて事前に検証環境などで操作を確認しておくことを推奨します。

参考資料