履歴データへのアクセス

BigQuery ではタイムトラベルを使用して、BigQuery で変更または削除されたデータにアクセスできます。

特定の時点のデータをクエリで取得する

タイムトラベル期間内で、特定の時点におけるテーブルの過去のデータをクエリするには、FOR SYSTEM_TIME AS OF 句を使用します。この句は、タイムスタンプの定数式を受け取り、そのタイムスタンプの時点で最新であったテーブルのバージョンを参照します。テーブルは BigQuery に保存されている必要があります。外部テーブルは使用できません。SYSTEM_TIME AS OF を使用する場合、テーブルサイズに上限はありません。

たとえば、次のクエリを実行すると、1 時間前のテーブルの履歴バージョンが返されます。

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

タイムスタンプが、タイムトラベル期間の前かテーブルの作成時刻より前の場合、クエリは失敗し、次のようなエラーが返されます。

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 LOCATION

ここで、LOCATION はデータセットのロケーションです。

ただし、このドキュメントの説明に従って、ある時点から新しいテーブルにコピーすることでテーブルを復元できます。

特定の時点のテーブルを復元する

過去のデータをテーブルにコピーすることで、過去のデータからテーブルを復元できます。テーブルが削除されている場合や期限切れの場合でも、タイムトラベル期間内でテーブルを復元する限り、データをコピーできます。

テーブルから過去のデータをコピーするには、次の構文を使用して、テーブル名にデコレータを追加します。

  • tableid@TIMETIME は Unix エポック時刻からの経過時間(ミリ秒単位)です。
  • tableid@-TIME_OFFSETTIME_OFFSET は、現在の時刻からの相対オフセット(ミリ秒単位)です。
  • tableid@0: 使用可能な過去のデータの中で最も古いものを指定します。

たとえば、次の bq コマンドライン ツールのコマンドは、1 時間前の table1 という名前のテーブルを table1_restored という名前のテーブルにコピーします。時間 -3600000 は、相対オフセットを使用してミリ秒単位で指定します。

bq cp mydataset.table1@-3600000 mydataset.table1_restored

次の bq コマンドライン ツールコマンドは、table1 という名前のテーブルを table1_restored という名前のテーブルにコピーします。時間 1624046611000 は、Unix エポック時刻からの経過時間をミリ秒単位で指定します。

bq cp mydataset.table1@1624046611000 mydataset.table1_restored

詳細については、削除されたテーブルの復元をご覧ください。

次のステップ