Azure Portal 恢复已删除 SQL Server database 失败
结论
RestoreIneligibleDroppedDatabaseShortLifespan 的意思是:数据库从创建到删除的时间太短,Azure SQL Database 还没有生成并保留完整、可用于还原的备份链,因此无法执行时间点还原。
Portal 显示 Earliest restore point 和 Restore point,不代表底层备份一定可以还原。界面可能根据数据库生命周期、删除记录或备份保留元数据生成候选时间范围,但最终能否恢复,仍取决于 Azure SQL 后端对实际备份链的检查。如果缺少初始完整备份,或者备份链不完整,后端就会返回这个错误。
把还原时间提前 5 分钟通常解决不了问题。这里的问题不是还原时间晚于删除时间,而是没有符合条件的基础备份。
为什么会出现这种情况
Azure SQL Database 的时间点还原不会在数据库创建后立即可用。新建、复制或还原出的数据库,需要先完成初始完整备份。之后生成的差异备份和事务日志备份,才能组成可用于 PITR(Point-in-Time Restore)的备份链。
以下情况较容易触发这个错误:
- 数据库创建后不久就被删除。
- 数据库刚由复制、还原或部署流程创建,初始备份还没有完成。
- 数据库使用相同名称反复创建和删除,Portal 中的删除记录与预期数据库不属于同一次生命周期。
- Portal 已经显示删除记录和时间范围,但底层备份尚未完成、未成功注册,或者已经无法还原。
初始备份需要多长时间,没有适用于所有数据库的固定保证。数据库大小、服务层级、区域负载和内部备份调度都可能影响完成时间。因此,不能只根据数据库存在了多少分钟,判断它一定可以恢复。
这里需要区分两个概念:
- 备份保留期:备份生成后可以保存多久。
- 备份可用性:数据库删除前是否已经生成一套可用备份。
即使删除时间仍在短期保留期内,只要数据库删除前没有形成可用的初始备份,保留期就无法解决问题。
建议先核实数据库的实际生命周期
检查 Azure Activity Log、部署流水线或 IaC 记录,确认以下信息:
- 该数据库实例的创建时间。
- 数据库是否通过复制或还原操作生成。
- 数据库的删除时间。
- 是否存在同名数据库删除后又重新创建的情况。
- 删除前是否成功执行过 PITR、导出或复制。
名称相同,不代表它们是同一个数据库实例。删除后重新创建同名数据库,会产生新的资源生命周期和备份链。
还需要在 Deleted databases 中核对所选记录的删除时间,确认它与 Activity Log 中目标数据库实例的删除事件完全一致。
可以尝试的恢复方式
1. 选择更早且早于删除时间的还原点
如果数据库在删除前已经运行了较长时间,可以选择更早的还原点,例如提前一小时,而不是只提前五分钟。
这种方法只适用于较晚的日志备份存在问题,但更早的备份链仍然有效的情况。如果所有时间点都返回 RestoreIneligibleDroppedDatabaseShortLifespan,继续按分钟调整还原时间通常没有意义。
还原操作会创建一个新数据库,不会直接恢复原数据库。目标名称也必须符合当前 logical server 的命名规则,并且不能与现有名称冲突。
2. 检查 Long-term retention 备份
如果该数据库之前配置过 LTR(Long-term Retention),可以到服务器或数据库的长期保留备份页面查找可还原的备份。
LTR 必须在数据库删除前完成配置并成功生成备份。数据库删除后,无法补建过去的 LTR 备份。
3. 查找其他数据副本
如果 PITR 不可用,可以继续检查是否存在以下数据副本:
.bacpac导出文件。- Azure Storage 中的手工备份或数据导出。
- Geo-replica、failover group secondary 或其他只读副本。
- 开发、测试、报表或数据仓库中的同步副本。
- Azure Data Factory、ETL 或分析平台保存的数据。
- 应用程序缓存、审计记录或业务导出文件。
- 删除前创建的数据库副本。
如果只需要恢复一张表,从这些副本中提取数据,通常比恢复整个生产数据库更实际。
4. 提交 Azure Support 请求
如果 Activity Log 显示数据库实际存在了较长时间,但 Portal 仍然报告”存活时间太短”,建议提交 Azure Support 工单,并提供以下信息:
- Subscription ID。
- Logical server 名称。
- 已删除数据库名称。
- 数据库创建时间和删除时间。
- Region。
- 完整错误代码
RestoreIneligibleDroppedDatabaseShortLifespan。 - Restore operation 的时间、Correlation ID 或 Deployment operation ID。
- Portal 显示的
Earliest restore point和所选Restore point。
这些信息有助于确认具体原因:Portal 元数据不一致、选择了错误的同名数据库实例,或者底层确实没有可用备份。
如果 Azure 后端确认数据库删除前没有形成可用的备份链,Support 通常也无法从不存在的备份中恢复数据。
成功恢复后只读取一张表
假设数据库已经恢复为 old-db-name_recovered,可以先确认目标表是否存在:
SELECT
s.name AS schema_name,
t.name AS table_name
FROM sys.tables AS t
JOIN sys.schemas AS s
ON s.schema_id = t.schema_id
WHERE t.name = N'TargetTable';
读取数据时,应明确指定 schema:
SELECT *
FROM dbo.TargetTable;
如果数据量较大,不要直接运行没有限制条件的查询。可以先查看总行数和部分样本:
SELECT COUNT_BIG(*) AS row_count
FROM dbo.TargetTable;
SELECT TOP (100) *
FROM dbo.TargetTable;
需要将表导出到本地时,可以使用 bcp。下面的命令使用 Microsoft Entra authentication 导出数据:
bcp "SELECT * FROM [dbo].[TargetTable]" queryout TargetTable.bcp \
-S "your-server.database.windows.net" \
-d "old-db-name_recovered" \
-G \
-N
如果要把数据导入另一个 Azure SQL Database,可以先在目标数据库中创建结构相同的表,再执行:
bcp "dbo.TargetTable" in TargetTable.bcp \
-S "your-server.database.windows.net" \
-d "target-database" \
-G \
-N
导入前需要核对主键、identity、计算列、外键和触发器。对于结构复杂的表,使用 SSMS 的 Generate Scripts、导入/导出向导或 .bacpac 通常更稳妥。
注意事项
- 删除数据库列表中存在记录,不代表一定有可恢复的备份。
Earliest restore point只是界面提供的候选边界,最终能否恢复取决于服务端的备份状态。- 还原时间必须早于删除时间,但仅满足这一条件,仍不能保证恢复成功。
- 调整还原点无法补上缺失的初始完整备份。
- 不要删除当前 logical server 或相关资源组,否则可能进一步影响删除备份的发现和恢复。
- 在目标表完成导出并通过验证前,不要删除恢复出来的新数据库。
- 对重要数据库,应同时配置合理的 PITR 保留期、LTR、定期
.bacpac导出或独立数据复制,避免只依赖一种恢复机制。
备注:内容仅供参考。
