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
相关产品推荐
相关产品推荐

