首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bigquery SYSTEM_TIME作为数据恢复的特性保证

Bigquery SYSTEM_TIME作为数据恢复的特性保证
EN

Stack Overflow用户
提问于 2019-11-26 09:53:09
回答 2查看 6K关注 0票数 3

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

使用Legacy,我们可以使用快照修饰器

代码语言:javascript
复制
#legacySQL
SELECT * FROM [PROJECT_ID:DATASET.TABLE@-3600000]

使用Standard,我们可以使用子句

代码语言:javascript
复制
#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 10在注释中正确指出的那样,在表上执行CREATE OR REPLACE作业后恢复旧数据是不可能的。经过一些尝试后,我甚至会添加使用以下语句类型之一执行作业:

  • CREATE_TABLE (CREATE OR REPLACE)
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE

完全消除了为该特定表检索数据的能力。

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

  • INSERT
  • UPDATE
  • DELETE
  • MERGE

是否可以保证t处的快照数据正是t表中包含的数据的?还是说这是“尽最大努力”的特性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-08 02:30:58

FOR SYSTEM_TIME AS OF语法对于在多个时间点查询表很有用,但当需要恢复或回滚表时,我建议使用BigQuery copy命令和@<time>装饰器。(有关完整的参考,请参阅CLI示例这里。)要做到这一点,首先确定目标恢复时间(以纪元毫秒为单位)。接下来,从本地计算机或运行copy命令;将划时代的时间附加到表名中,如下所示。

代码语言:javascript
复制
bq cp test_data_set.weather_data@1588643412000 test_data_set.recovered_weather_data

请注意,您不能直接恢复表的位置-您将需要将快照复制到不同的表名,然后复制回原始表。

代码语言:javascript
复制
bq cp test_data_set.recovered_weather_data test_data_set.weather_data

使用BigQuery CLI比使用FOR SYSTEM_TIME AS OF运行查询的优点是,即使在模式更改或删除的情况下,它也可以恢复或回滚表。当表存在时,copy命令将在任何时间戳上工作,可以追溯到七天前。(删除表的恢复窗口过去为两天,但最近进行了扩展。)

对于恢复SLA,了解BigQuery的体系结构是很有帮助的。列数据块作为对象存储在()中,BigQuery使用副本写入策略执行更新。实际上,这意味着不需要备份过程-- BigQuery只是将旧的列数据块和元数据(因此,表版本)放在一起,直到垃圾收集为止。BigQuery在更新或删除后七天触发垃圾收集过程。

如上所述,回滚和恢复被宣传为BigQuery的核心功能。(例如,请参见BigQuery登陆页面上的标题自动备份和轻松还原。)因此,它似乎受制于其他BigQuery特性的标准服务级别协议。

票数 4
EN

Stack Overflow用户

发布于 2019-11-27 10:37:40

Bigquery保存参考定义表的旧历史版本的快照。因此,如文档所示,您在恢复已修改的数据时应该没有问题。

正如@Pentium10 10所指出的,当您已经创建了同名的新表时,无法恢复已删除的表,因为在执行"CREATE或替换“1之后无法恢复表。

快照修饰器的限制是,快照可以在过去7天内恢复,并且必须大于或等于表创建2的时间,因此,如果表是最近由"CREATE or CREATE“或"CREATE”创建的,则不能在创建表之前选择时间戳。

1

2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59048115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档