You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks Delta Lake时间旅行报错:无法回滚至版本1

Delta表时间旅行访问旧版本报错的解决办法

为啥会报错?

你遇到的AnalysisException是因为Delta表的版本1文件已经被清理掉了。Delta表默认会自动删除超过7天的旧版本数据,要是手动执行过VACUUM命令,也会删掉早于你指定保留时长的版本。报错里的Available versions: [3, 23]就是说现在只能访问这两个版本的数据。

先确认是不是被清理了

可以查下表历史里有没有VACUUM操作记录:

from delta.tables import DeltaTable
dt = DeltaTable.forPath(spark, saveloc)
# 过滤出VACUUM相关的操作
dt.history().filter("operation = 'VACUUM'").show()

也能看看表的自动清理配置:

dt.detail().select("properties.delta.retentionDurationCheck.enabled", "properties.delta.vacuum.retentionHours").show()

怎么解决?

1. 改代码用现存的版本

既然版本1没了,直接换成现在能访问的最早版本(也就是版本3)就行,把代码里硬写的versionAsof=1改成3:

start_table_dropped = spark.read.format("delta").option("versionAsof", 3).load(saveloc).createOrReplaceTempView('allprior')

要是不想每次手动改,也可以动态获取当前可用的最早版本:

from pyspark.sql.functions import min
dt = DeltaTable.forPath(spark, saveloc)
earliest_version = int(dt.history().select(min(col("version"))).collect()[0][0])
start_table_dropped = spark.read.format("delta").option("versionAsof", earliest_version).load(saveloc).createOrReplaceTempView('allprior')

2. 恢复版本1(仅限有备份的情况)

如果你的表有外部存储快照(比如S3版本控制、ADLS快照)或者Databricks的表备份,还能试试恢复:

  • 从存储快照里把版本1的文件恢复到Delta表的存储路径
  • 用RESTORE命令恢复(如果备份支持):
RESTORE TABLE delta.`saveloc` TO VERSION AS OF 1

要是没备份,那版本1的数据就找不回来了。

3. 调整配置防止以后再出问题

要是需要长期保留旧版本,可以改下表的保留策略,比如设置保留30天:

ALTER TABLE delta.`saveloc` SET TBLPROPERTIES (
  'delta.retentionDurationCheck.enabled' = 'true',
  'delta.vacuum.retentionHours' = '720' -- 30天=720小时
)

另外,手动跑VACUUM的时候别设太短的保留时长。

内容的提问来源于stack exchange,提问作者Patterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:50:07