使用时间旅行和故障安全功能保留数据
本文档介绍数据集的时间旅行和故障安全数据保留窗口。在时间旅行和故障安全期间,您在数据集内任何表中更改或删除的数据会继续存储,以备日后需要恢复时使用。
时间旅行和数据保留
您可以从时间旅行窗口(默认涵盖过去 7 天)中的任何时间点访问已更改或已删除的数据。借助“时间旅行”,您可以查询已更新或删除的数据、恢复已删除的表或数据集或者恢复已过期的表。
您可以将时间旅行窗口的持续时间设置为最少 2 天到最多 7 天。如果需要能够恢复已更新或已删除的数据,则较长的时间旅行窗口会非常有用。较短的时间旅行窗口可以帮助您在使用物理存储结算模式时节省存储费用。使用逻辑存储结算模式时,这些费用节省不适用。 如需详细了解存储结算模式对费用的影响,请参阅结算。
配置时间旅行窗口
您可以在数据集或项目级设置时间旅行窗口。这些设置随后会应用于与相应数据集或项目关联的所有表。
设置项目级时间旅行窗口
如需指定项目级默认时间旅行窗口,您可以使用数据定义语言 (DDL) 语句。如需了解如何设置项目级时间旅行窗口,请参阅管理配置设置。
设置数据集级时间旅行窗口
如需指定或修改数据集的时间旅行窗口,您可以使用Google Cloud 控制台、bq 命令行工具或 BigQuery API。
修改时间旅行窗口时,如果时间戳指定的时间不在时间旅行窗口内或早于创建表的时间,则查询会失败并返回如下错误:
TableID
was created at time which is before its allowed time travel intervaltimestamp
. Creation time:timestamp
时间旅行功能的运作方式
BigQuery 使用列式存储格式。这意味着,数据是按列而不是按行进行整理和存储的。当您有一个包含多列的表时,每个列在所有行中的值会一起存储在存储块中。
修改 BigQuery 表中的某个单元时,您会更改特定行和特定列中的特定值。由于 BigQuery 将列存储在一起,因此即使只修改列中的单个单元,通常也需要读取包含受影响行的相应列数据的整个存储块,应用更改,然后写入该存储块的新版本。
时间旅行功能通过跟踪组成表的存储块的版本来运作。更新数据时,BigQuery 不会直接就地修改现有存储块。相反,它会创建受影响存储块的新版本,其中包含更新后的数据。系统随后会保留之前的版本,以便用于时间旅行。
BigQuery 使用自适应文件大小和存储块。存储块的大小并非固定不变,而是会因表的大小及其数据分布等因素而异。即使更改存储块中的一个单元,也会更改相应列的数据,从而可能影响许多行。因此,进行版本控制并发送到时间旅行功能的数据单位通常是包含相应列的已修改数据的整个存储块,而不仅仅是单个单元。
因此,更改一个单元可能会导致发送到时间旅行功能的数据量超出更改本身的大小。
时间旅行窗口对表和数据集恢复有何影响
已删除的表或数据集使用删除时生效的时间旅行窗口时长。
例如,如果您的时间旅行窗口的持续时间为 2 天,然后将持续时间增加到 7 天,则在该更改之前删除的表仍然只有 2 天可恢复。同样,如果您将时间旅行窗口持续时间设置为 5 天,然后将持续时间减少到 3 天,则在更改之前删除的所有表仍有 5 天可恢复。
由于时间旅行窗口在数据集级层设置,因此在恢复删除之前,您无法更改已删除数据集的时间旅行窗口。
如果您缩短时间旅行窗口的持续时间,删除一个表,然后您发现该数据需要更长的恢复时间,则可以创建在删除表之前某个时间点的表的快照。您必须在删除表仍可恢复时执行此操作。如需了解详情,请参阅使用时间旅行创建表快照。
时间旅行和行级访问权限
如果表具有或以前具有行级访问权限政策,则只有表管理员可以访问表的历史数据。
需要以下 Identity and Access Management (IAM) 权限:
权限 | 资源 |
---|---|
bigquery.rowAccessPolicies.overrideTimeTravelRestrictions
|
要访问其历史数据的表 |
以下 BigQuery 角色提供所需的权限:
角色 | 资源 |
---|---|
roles/bigquery.admin
|
要访问其历史数据的表 |
无法将 bigquery.rowAccessPolicies.overrideTimeTravelRestrictions
权限添加到自定义角色。
运行以下命令,通过传递 UTC 时间戳来获取等效的 Unix 纪元时间:
date -d '2023-08-04 16:00:34.456789Z' +%s000
在 bq 命令行工具中替换从上述命令收到的 UNIX 纪元时间
1691164834000
。运行以下命令,在同一数据集myDatasetID
内的另一个表restoredTable
中恢复已删除表deletedTableID
的副本:bq cp myProjectID:myDatasetID.deletedTableID@1691164834000 myProjectID:myDatasetID.restoredTable
故障安全
BigQuery 提供故障安全期。在故障安全期间,已删除的数据会在时间旅行窗口后自动额外保留七天,以供紧急恢复时使用。数据在表级层恢复。系统会从表被删除的时间戳表示的时间点恢复表数据。故障安全期不可配置。
执行以下操作时,可以通过时间旅行窗口恢复被替换或移除的数据。时间旅行窗口结束后,相应数据会进入故障安全期,以延长恢复时间:
-
表删除或替换:当表被删除或其数据被完全替换(例如,在加载作业中使用
WRITE_TRUNCATE
写入处置或使用CREATE OR REPLACE TABLE
语句)时,系统会保留该表之前的内容。 - 分区删除:如果从分区表中删除特定分区,则属于该特定分区的数据会保留。表中的其他分区不受影响。
您无法查询或直接恢复故障安全存储空间中的数据。若要从故障安全存储空间恢复数据,请与 Cloud Customer Care 团队联系。
结算
如果您将存储空间结算模式设置为使用物理字节,系统会单独收取用于时间旅行和故障安全存储的字节费用。时间旅行和故障安全存储按活跃物理存储费率收费。您可以配置时间旅行窗口,以在存储费用和数据保留需求之间进行权衡。
如果您将存储结算模式设置为使用逻辑字节,则时间旅行和故障安全存储的总存储费用会包含在您支付的基本费率中。
下表对物理和逻辑存储费用进行了比较:
结算模式 | 收费项 |
---|---|
物理(压缩)存储 |
|
逻辑(未压缩)存储(默认设置) |
|
如果您使用物理存储,则可以查看时间旅行和故障安全使用的字节数,只需查看 TABLE_STORAGE
和 TABLE_STORAGE_BY_ORGANIZATION
视图中的 TIME_TRAVEL_PHYSICAL_BYTES
和 FAIL_SAFE_PHYSICAL_BYTES
列。 如需了解如何使用其中一种视图估算费用的示例,请参阅预测存储结算。
存储费用适用于时间旅行和故障安全数据,但只有在 BigQuery 中的其他位置不适用数据存储费用的情况下,您才需要支付费用。适用以下详细信息:
- 创建表时,不会产生时间旅行或故障安全存储费用。
- 如果更改或删除数据,系统会针对在时间旅行窗口和故障安全期内通过时间旅行保存的已更改或已删除数据收取存储费用。这与表快照和克隆的存储价格类似。
数据保留示例
下表显示了已删除或已更改数据如何在存储保留窗口之间移动。以下示例展示了一种情况:总共活跃存储为 200 GiB,其中 50 GiB 已删除,时间旅行窗口为 7 天:
第 0 天 | 第 1 天 | 第 2 天 | 第 3 天 | 第 4 天 | 第 5 天 | 第 6 天 | 第 7 天 | 第 8 天 | 第 9 天 | 第 10 天 | 第 11 天 | 第 12 天 | 第 13 天 | 第 14 天 | 第 15 天 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
活跃存储 | 200 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 | 150 |
时间旅行存储 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | |||||||||
故障安全存储 | 50 | 50 | 50 | 50 | 50 | 50 | 50 |
从长期物理存储中删除数据的方式也是相同的。
限制
时间旅行数据检索受到以下限制:
- 时间旅行仅提供对时间旅行时间段内的历史数据的访问。如果您希望非紧急用途的表数据的保留时间超过时间旅行窗口的时长,请使用表快照。
- 如果表具有或以前具有行级访问权限政策,则时间旅行只能由表管理员使用。如需了解详情,请参阅时间旅行和行级访问权限。
- 时间旅行不会恢复表元数据。
- 以下表类型不支持时间旅行:
- 外部表
- 临时缓存的查询结果表
- 临时会话表
- 临时多语句表
- 在外部数据集下列出的表。
后续步骤
- 了解如何查询和恢复时间旅行数据。
- 详细了解表快照。