适用场景:误删除数据行,且时间在 UNDO 保留期内(通常 15-30 分钟、24小时)。
Oracle
- 查看系统设置的 UNDO 保留时间参数值:可使用以下 SQL 语句查看
UNDO_RETENTION
参数设置的值,该参数指定了 UNDO 数据保留的最短时间(以秒为单位)。
SHOW PARAMETER undo_retention;
-- 或者
SELECT name, value
FROM v$parameter
WHERE name = 'undo_retention';
-- 或者
SELECT to_char(begin_time, 'dd - mon - rr hh24:mi') begin_time,
to_char(end_time, 'dd - mon - rr hh24:mi') end_time,
tuned_undo_retention
FROM v$undo_stat
ORDER BY end_time;
步骤概要:
第一步:历史记录中,根据删除时间找到删除操作;
第二步:执行闪回查询得到删除数据;
第三步:查询结果复制到表中。
恢复语句(闪回查询):
-- 恢复删除
SELECT *
FROM "SZKS"."TBLWIPEQPMATERIALLOG"
AS OF TIMESTAMP TO_TIMESTAMP('2025-06-04 09:50:58', 'YYYY-MM-DD HH24:MI:SS')
WHERE ROWID = 'AABKS6AARAAK3mXAAD';
恢复的几种方式:(本文章只讲述第一种)
闪回查询:
详细步骤:工具栏 -- 历史记录 -- 根据误删时间找到误删操作 -- 执行恢复语句 ;
举个例子:假设A表有图一数据,误删数据后如图二。
在此处找到历史日志
[2025-06-04 09:50:59.77]
:操作发生的时间戳。[172.*.*.87Oracle]
:172.16.7.87
:数据库服务器的 IP 地址。Oracle
:数据库实例名(或服务名)。
[48241]
:会话 ID(Session ID,简称 SID),标识发起该操作的数据库会话。[ORA]
:操作类型(此处为 Oracle 相关操作)。DELETE FROM ...
:具体执行的 SQL 语句。Time: 0.023s
:SQL 语句执行耗时。
执行查询语句,如果未查到相关数据,删除操作时间可在59附件前推。
把图三查询到的数据复制到需恢复表,效果如图四。
意外情况:说明UNDO 保留期内数据已被覆盖,此方法不适用。
注意事项
-
时间点准确性:
- 恢复时间点必须早于删除操作时间(如删除发生在
10:45:16
,则使用10:45:15
或更早)。 - 若无法确定具体时间,可尝试多个临近时间点。
- 恢复时间点必须早于删除操作时间(如删除发生在
-
闪回数据有效期:
- 数据必须在 Oracle 的
UNDO_RETENTION
参数保留期内(通常为 15-30 分钟,具体取决于数据库配置)。 - 若超出保留期,需通过备份恢复。
- 数据必须在 Oracle 的
-
唯一性约束冲突:
- 若表有唯一约束(如主键),需确保恢复的数据不会导致冲突。
- 可先删除当前可能存在的冲突行,再恢复数据。
-
权限要求:
- 需要
FLASHBACK ANY TABLE
或SELECT ANY TRANSACTION
权限
- 需要
**************************************** 若有帮助,一键三连 **************************************