Azure Data Lake Gen2容器被Spark DataFrame覆写后如何恢复原始文件?
ADLS Gen2容器根目录被Spark overwrite操作覆写后的恢复方案
恢复前提判断
- 首先确认存储账户是否配置了软删除功能,这是最核心的恢复条件:
- Blob软删除:开启后被覆盖、删除的blob会在配置的保留周期内(可设置7~365天)保留为软删除状态,可直接恢复
- 容器软删除:开启后即使整个容器被删除也可恢复,你当前场景未删除容器,只要开启Blob软删除即可支持恢复
- 补充说明:Spark以overwrite模式写入非分区路径时,默认会先清空目标路径下所有文件,你容器内原有的所有文件都会被标记为删除,并非仅覆盖根目录下的同名文件。
已开启软删除的恢复操作
门户操作(适合小批量恢复)
- 进入目标存储账户,在左侧「数据存储」分类下点击「容器」,打开被覆写的对应容器
- 打开页面顶部的「显示已删除的Blob」开关,所有被删除/覆盖的旧文件都会显示,状态标记为「已删除(软删除)」
- 勾选需要恢复的文件/文件夹,右键选择「取消删除」即可完成恢复,原有目录结构会完整保留。
命令行批量恢复
Azure CLI 批量恢复命令示例:
# 列出容器内所有软删除的blob并批量恢复 az storage blob list --account-name <你的存储账户名> --container-name <容器名> --include-deleted --auth-mode login | jq '.[] | select(.deleted == true) | .name' | xargs -I {} az storage blob undelete --account-name <你的存储账户名> --container-name <容器名> --name {} --auth-mode login
PowerShell 批量恢复命令示例:
$ctx = New-AzStorageContext -StorageAccountName <你的存储账户名> -UseConnectedAccount Get-AzStorageBlob -Context $ctx -Container <容器名> -IncludeDeleted | Where-Object {$_.Deleted -eq $true} | Restore-AzStorageBlob
未开启软删除的处理方案
如果存储账户未提前开启Blob软删除,无法通过原生自助功能恢复,可尝试以下两个路径:
- 若存储账户开启了Blob版本控制、变更源功能,可直接拉取对应历史版本的Blob数据恢复
- 若未开启上述功能,需尽快提交Azure技术支持工单申请数据恢复,仅当后台底层块存储未擦除旧数据时可恢复,操作完成后间隔时间越短,恢复成功率越高。
后续规避建议
- 所有生产存储账户必须开启Blob软删除+容器软删除,保留周期建议设置不低于30天
- Spark写入路径禁止直接指向容器根目录,所有写入操作必须指定明确的子目录路径
- 生产环境存储账户配置最小权限访问:普通业务账号仅授予指定子目录的写入权限,不分配根目录的删除/覆写权限
- 生产代码使用overwrite写入模式前,必须增加路径合法性校验逻辑,避免误写父级目录
内容的提问来源于stack exchange,提问作者Techno_Eagle
相关产品推荐
相关产品推荐

