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';
相关文档