KQL/Kusto数据表无预警被删:原因排查与数据恢复咨询
问题解答
1. 确定数据被删除原因的步骤
- 审计操作日志:查询数据库的
AuditLogs表,筛选针对目标表的删除类操作(包括drop extent、.drop table、.delete等),获取操作发起者、执行时间、客户端信息。示例查询:AuditLogs | where DatabaseName == "你的数据库名" | where TableName in ("表1名", "表2名") | where OperationName has_any ("Drop", "Delete", "Extent") | project Timestamp, OperationName, InitiatedBy, ClientIp, CommandText | sort by Timestamp desc - 核查
drop extent命令详情:用.show operations命令查看这些自动运行的drop extent操作的完整上下文,确认目标extent是否属于这两张表,执行时间是否与数据消失时间匹配,以及操作发起方(是系统策略触发还是用户/应用发起)。示例命令:.show operations | where OperationId has "drop_extent" | where StartedOn between (datetime(数据消失前时间)..datetime(数据消失后时间)) | project OperationId, StartedOn, Status, InitiatedBy, CommandText - 检查表的 retention/delete 策略:确认目标表的保留策略或删除策略是否被修改,是否触发了自动数据清理。示例查询:
.show table 表名 policy retention .show table 表名 policy delete - 排查Power Automate流:查看流的运行历史,确认是否存在误操作(比如流被修改为执行删除而非查询,或触发了意外的分支逻辑),检查流的权限是否过大,是否有被篡改的可能。
2. 恢复已删除数据的方法
- 利用软删除恢复:如果数据库启用了软删除(默认开启,保留期可配置),使用
.restore table命令恢复到数据删除前的时间点。示例命令:.restore table 表名 from soft-deleted artifacts between (datetime(删除前时间)..datetime(删除后时间)) - 时间旅行查询恢复:如果表启用了时间旅行,直接查询删除前的数据并写回原表。示例操作:
// 先查询删除前的数据 表名 | where ingestion_time() < datetime(删除发生时间) // 将结果写回原表 .set-or-append 表名 <| 表名 | where ingestion_time() < datetime(删除发生时间) - 从备份恢复:如果有配置快照备份或连续导出,将备份文件导入到临时表,再将数据同步回原表。
- 检查外部备份:查看Power Automate流的历史输出、下游系统是否留存了这些表的查询数据,作为临时恢复来源。
内容的提问来源于stack exchange,提问作者PorgtheEaten
相关产品推荐
相关产品推荐

