Time Travel 原理

Time Travel 是云器 Lakehouse 的历史数据访问功能,允许用户查询任意时间点的数据状态,或恢复被删除/误改的数据。

什么是 Time Travel

Time Travel 基于 MVCC(多版本并发控制)机制实现。Lakehouse 中的每张表都维护多个历史版本,每次数据变更(INSERT/UPDATE/DELETE/TRUNCATE)都会生成新版本,旧版本仍然可访问。

Timeline -----------------------------------------------------------> Version 1: [A, B, C] <-- Initial create | Version 2: [A, B, C, D] <-- Insert D | Version 3: [A, X, C, D] <-- Update B to X | Version 4: [A, X, C] <-- Delete D | Query any point-in-time snapshot

MVCC 工作原理

版本生成

每次事务提交时,Lakehouse 生成新的表版本:

操作版本变化
INSERT
INSERT
新增行,版本号递增
UPDATE
UPDATE
旧版本标记删除,新版本插入
DELETE
DELETE
行标记为删除
TRUNCATE
TRUNCATE
整表标记为新版本(空)

版本查询

通过

TIMESTAMP AS OF
TIMESTAMP AS OF
子句查询指定时间点的数据:

-- 查询指定时间点的数据(TIMESTAMP AS OF 只接受字面量常量) SELECT * FROM orders TIMESTAMP AS OF '2024-01-15 10:00:00'; -- 查询指定时间点的数据 SELECT * FROM orders TIMESTAMP AS OF '2024-01-15 09:00:00';

系统会找到该时间点之前最新的版本,返回该版本的数据快照。

Time Travel 的三大能力

1. 历史数据查询

查询过去任意时间点的数据状态,用于:

  • 数据对比分析(比较不同时间点的变化)
  • 审计与合规(追溯历史数据状态)
  • 问题排查(查看数据被修改前的状态)

2. 数据恢复(UNDROP)

恢复被删除的表:

-- 查看删除历史 SHOW TABLES HISTORY; -- 恢复被删除的表 UNDROP TABLE orders;

适用范围:普通表、动态表、物化视图、Table Stream

3. 数据回滚(RESTORE)

将表回滚到指定时间点:

-- 查看版本历史 DESC HISTORY orders; -- 回滚到指定时间点 RESTORE TABLE orders TO TIMESTAMP AS OF '2024-01-15 10:00:00';

与 UNDROP 的区别

  • UNDROP
    UNDROP
    :恢复被 DROP 的表(表不存在了)
  • RESTORE
    RESTORE
    :回滚现有表的数据(表还存在,但数据被误改/误删)

保留周期

Time Travel 保留周期(

data_retention_days
data_retention_days
)决定了可访问的历史数据时长:

配置说明
默认值1 天(24 小时)
取值范围0-90 天
设置为 0不保留历史版本,无法使用 Time Travel
超出周期历史版本被物理删除,无法恢复

-- 修改保留周期为 7 天 ALTER TABLE orders SET PROPERTIES ('data_retention_days'='7');

存储成本

Time Travel 会占用额外的存储空间来保存历史版本:

  • 存储成本与数据变更频率和保留周期成正比
  • 频繁更新的表在长保留周期下会消耗更多存储
  • 建议根据业务需求合理设置保留周期

使用限制

限制说明
View 不支持普通视图不存储数据,不支持 Time Travel
外部 Schema 不支持外部数据源的历史版本不由 Lakehouse 管理
实时写入未提交数据RealtimeStream 实时写入未提交的数据不支持 Time Travel
超出保留周期历史版本被物理删除后无法查询或恢复

典型场景

场景 1:误删数据恢复

-- 误执行了 DELETE DELETE FROM orders WHERE date < '2024-01-01'; -- 查看删除前的数据 SELECT COUNT(*) FROM orders TIMESTAMP AS OF '2024-01-15 09:59:00'; -- 恢复数据 RESTORE TABLE orders TO TIMESTAMP AS OF '2024-01-15 09:59:00';

场景 2:误删表恢复

-- 误执行了 DROP TABLE DROP TABLE important_data; -- 查看删除记录 SHOW TABLES HISTORY LIKE 'important_data%'; -- 恢复表 UNDROP TABLE important_data;

场景 3:数据变更追溯

-- 查看表的版本历史 DESC HISTORY orders;

+---------+-------------------------+------------+-------------+----------+-----------+ | version | time | total_rows | total_bytes | user | operation | +---------+-------------------------+------------+-------------+----------+-----------+ | 5 | 2024-01-15 11:00:00.000 | 1000 | 50000 | analyst | INSERT | | 4 | 2024-01-15 10:30:00.000 | 950 | 47500 | etl_job | UPDATE | | 3 | 2024-01-15 10:00:00.000 | 900 | 45000 | etl_job | INSERT | +---------+-------------------------+------------+-------------+----------+-----------+

-- 对比版本 3 和版本 5 的数据差异 SELECT * FROM orders TIMESTAMP AS OF '2024-01-15 10:00:00' EXCEPT SELECT * FROM orders TIMESTAMP AS OF '2024-01-15 11:00:00';

相关文档

联系我们
预约咨询
微信咨询
电话咨询