在 Google BigQuery 中,可以检索过去(至少在过去 7 天)的表(快照)行:
对于 Legacy SQL,我们可以使用快照装饰器:
#legacySQL
SELECT * FROM [PROJECT_ID:DATASET.TABLE@-3600000]
Run Code Online (Sandbox Code Playgroud)
对于标准 SQL,我们可以使用FOR SYSTEM_TIME AS OFinFROM子句:
#standardSQL
SELECT *
FROM `PROJECT_ID.DATASET.TABLE`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);
Run Code Online (Sandbox Code Playgroud)
这两个示例都返回一小时前的快照PROJECT_ID.DATASET.TABLE。
但我想知道是否有任何保证检索过去的表数据。一位同事告诉我,他在某处读到(但他再也找不到了)这是一个“尽力而为”的功能,因此可能会丢失一些数据。
此功能是否可以在生产环境中用于数据恢复(例如,如果有人无意中截断了重要的表),只要在错误发生后的 7 天内完成恢复即可?是否能保证我们可以访问特定时间存储的全部数据?
更新
正如 @Pentium10 在评论中正确指出的那样,CREATE OR REPLACE在表上执行作业后恢复旧数据是不可能的。经过一番尝试,我什至会添加使用以下语句类型之一执行作业:
CREATE_TABLE( CREATE OR REPLACE)CREATE_TABLE_AS_SELECTDROP_TABLE完全消除了及时检索该特定表数据的能力。
但是,假设我们只使用以下语句类型来修改表数据:
INSERTUPDATEDELETEMERGE是否能保证t时刻的快照数据正是t时刻表中包含的数据?或者这是一个“尽力而为”的功能?
该FOR SYSTEM_TIME AS OF语法对于在多个时间点查询表非常有用,但我建议@<time>在需要恢复或回滚表时将 BigQuery CLI 复制命令与装饰器结合使用。(有关完整参考,请参阅此处的CLI 示例。)为此,首先确定目标恢复时间(以纪元毫秒为单位)。接下来,从本地计算机或 Google Cloud Shell 运行复制命令;将纪元时间附加到表名称中,如下所示。
bq cp test_data_set.weather_data@1588643412000 test_data_set.recovered_weather_data
Run Code Online (Sandbox Code Playgroud)
请注意,您无法直接就地恢复表 - 您需要将快照复制到不同的表名称,然后复制回原始表。
bq cp test_data_set.recovered_weather_data test_data_set.weather_data
Run Code Online (Sandbox Code Playgroud)
与运行查询相比,使用 BigQuery CLI 的优势在于FOR SYSTEM_TIME AS OF,即使在架构更改或删除的情况下,它也可以恢复或回滚表。复制命令适用于表存在时的任何时间戳,可追溯到 7 天。(已删除表的恢复窗口过去是两天,但最近延长了。)
关于恢复 SLA,了解 BigQuery 的架构很有帮助。列数据块作为对象存储在 Colossus 文件系统(Google 云存储)中,BigQuery 使用写入时复制策略执行更新。实际上,这意味着不需要备份过程 - BigQuery 只是保留旧的列数据块和元数据(因此,表版本),直到它们被垃圾收集为止。BigQuery 会在更新或删除后 7 天触发垃圾收集过程。
如上所述,回滚和恢复被宣传为 BigQuery 的核心功能。(例如,请参阅BigQuery 登录页面上的标题“自动备份和轻松恢复”。)因此,它似乎受到其他 BigQuery 功能的标准服务级别协议的约束。
| 归档时间: |
|
| 查看次数: |
11636 次 |
| 最近记录: |