存取歷來資料

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

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

後續步驟