访问历史数据
借助 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 locationLOCATION
从某个时间点恢复表
您可以将历史数据复制到表中,以从历史数据中恢复表。即使表已删除或过期,只要您在时间旅行时间段内恢复表,复制历史数据也仍然有效。
如需复制表中的历史数据,请使用以下任一语法将修饰器添加到表名称:
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
如需了解详情,请参阅恢复已删除的表。
后续步骤
- 详细了解表快照。
- 详细了解使用时间旅行和故障安全功能保留数据。
- 详细了解如何管理表。