在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_TABLE
(CREATE OR REPLACE
)CREATE_TABLE_AS_SELECT
DROP_TABLE
完全删除了针对该特定表及时检索数据的功能。
但是,假设我们仅使用以下语句类型来修改表数据:
INSERT
UPDATE
DELETE
MERGE
是否可以保证 t 处的快照数据与 t 表中包含的数据完全相同?还是这是“尽力而为”功能?
答案 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