Bigquery“ FOR SYSTEM_TIME AS OF”功能保证数据恢复

时间:2019-11-26 09:53:09

标签: google-bigquery

在Google BigQuery中,可以检索过去(至少最近7天)中表(快照)的行:

使用旧版SQL,我们可以使用snapshot decorators

#legacySQL
SELECT * FROM [PROJECT_ID:DATASET.TABLE@-3600000]

使用标准SQL,我们可以使用FOR SYSTEM_TIME AS OF in FROM clause

#standardSQL
SELECT *
FROM `PROJECT_ID.DATASET.TABLE`
  FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);

两个示例都返回一个小时前PROJECT_ID.DATASET.TABLE的快照。

但是我想知道过去是否可以保证检索表数据。 一位同事告诉我,他读过某个地方(但现在找不到),这是“尽力而为”的功能,因此可能会丢失一些数据。

只要在错误发生后的7天内完成恢复,此功能是否可用于生产环境中的数据恢复(例如,如果有人无意中将重要表删节了)?是否可以保证我们可以访问在特定时间存储的全部数据

更新

正如@ Pentium10在注释中正确指出的那样,在表上执行CREATE OR REPLACE作业后无法恢复旧数据。经过一番尝试之后,我什至将使用以下statement types之一添加正在执行的作业:

  • CREATE_TABLECREATE OR REPLACE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE

完全删除了针对该特定表及时检索数据的功能。

但是,假设我们仅使用以下语句类型来修改表数据:

  • INSERT
  • UPDATE
  • DELETE
  • MERGE

是否可以保证 t 处的快照数据与 t 表中包含的数据完全相同?还是这是“尽力而为”功能?

1 个答案:

答案 0 :(得分:0)

Bigquery保存引用已定义表的较早历史版本的快照。因此,如所述,恢复已修改的数据应该没有问题。

正如@ Pentium10所指出的那样,当您已经创建了一个具有相同名称的新表时,您将无法恢复已删除的表,因为在执行“ 创建或替换< / strong>” [1]。

快照装饰器的局限性在于,快照可以在最近7天之内还原,并且必须大于或等于表创建的时间[2],因此,如果表是最近通过“ 创建”创建的或替换”或“ 创建”,则无法在创建表之前选择时间戳。

[1] https://cloud.google.com/bigquery/docs/managing-tables#undeletetable

[2] https://cloud.google.com/bigquery/table-decorators#snapshot-syntax