在Google BigQuery中,可以检索过去表(快照)的行(至少在过去7天):
使用Legacy,我们可以使用快照修饰器:
#legacySQL
SELECT * FROM [PROJECT_ID:DATASET.TABLE@-3600000]使用Standard,我们可以使用子句:
#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_SELECTDROP_TABLE完全消除了为该特定表检索数据的能力。
但是,假设我们只使用以下语句类型来修改表数据:
INSERTUPDATEDELETEMERGE是否可以保证t处的快照数据正是t表中包含的数据的?还是说这是“尽最大努力”的特性?
发布于 2020-05-08 02:30:58
FOR SYSTEM_TIME AS OF语法对于在多个时间点查询表很有用,但当需要恢复或回滚表时,我建议使用BigQuery copy命令和@<time>装饰器。(有关完整的参考,请参阅CLI示例这里。)要做到这一点,首先确定目标恢复时间(以纪元毫秒为单位)。接下来,从本地计算机或运行copy命令;将划时代的时间附加到表名中,如下所示。
bq cp test_data_set.weather_data@1588643412000 test_data_set.recovered_weather_data请注意,您不能直接恢复表的位置-您将需要将快照复制到不同的表名,然后复制回原始表。
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特性的标准服务级别协议。
https://stackoverflow.com/questions/59048115
复制相似问题