存取歷來資料

您可以使用 BigQuery 查詢及還原在 時間回溯期間內變更或刪除的 BigQuery 資料。

查詢特定時間點的資料

您可以使用 FOR SYSTEM_TIME AS OF 子句,查詢時間旅行視窗內的任何時間點的資料表歷來資料。這個子句會使用常數時間戳記運算式,並參照該時間戳記的目前資料表版本。資料表必須儲存在 BigQuery 中,不得為外部資料表。使用 SYSTEM_TIME AS OF 時,資料表大小沒有限制。

舉例來說,下列查詢會傳回資料表一小時前的歷史版本:

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

從特定時間點還原資料表

您可以將歷來資料複製到資料表,藉此還原資料表。只要在時間旅行視窗內還原資料表,即使資料表已刪除或已過期,複製歷來資料仍可正常運作。

如要從資料表複製歷來資料,請使用下列其中一種語法,在資料表名稱中加入修飾符:

  • tableid@TIME,其中 TIME 是自 Unix 紀元起算的毫秒數。
  • tableid@-TIME_OFFSET,其中 TIME_OFFSET 是相對於目前時間的相對偏移量 (以毫秒為單位)。
  • tableid@0:指定可用的最久期歷來資料。

舉例來說,下列 bq 指令列工具指令會將一小時前名為 table1 的資料表複製到名為 table1_restored 的資料表中。時間 -3600000 是以毫秒為單位,並使用相對偏移值指定。

bq cp mydataset.table1@-3600000 mydataset.table1_restored

執行下列指令,取得指定時間的等效 Unix 紀元時間:

  date -d '2023-08-04 16:00:34.456789Z' +%s000
  

下列 bq 指令列工具指令會將名為 table1 的資料表複製到名為 table1_restored 的資料表。取代您從上一個指令收到的 UNIX 紀元時間 1691164834000

bq cp mydataset.table1@1691164834000 mydataset.table1_restored

詳情請參閱「還原已刪除的資料表」。

後續步驟