能,但需满足UNDO_RETENTION未超时且undo空间未被覆盖;需启用行移动才能Flashback Table;Flashback Database要求归档模式、FLASHBACK ON开启且日志未清理;未提交时直接ROLLBACK最高效。
Flashback Query 能查到被删数据吗
能,但前提是没超过
时间且 undo 表空间未被覆盖。Oracle 用 undo 数据构建“过去某一时刻”的数据快照,
就是靠它实现的。实际中常因 undo 空间紧张或事务量大,导致 5 分钟前的数据已不可见——别默认“只要删得不久就一定能找回”。
实操建议:
执行前先确认当前 undo 保留时间:
快速定位删除时间点:用
反查 SCN 对应时间,比凭记忆更可靠
若表有主键,优先用
拉出数据再
回原表,避免逐行插入拖慢恢复
FLASHBACK TABLE 到删除前状态要满足什么条件
不是所有 DELETE 都能直接闪回表。该命令本质是把整张表“倒带”到某个时间点的结构+数据快照,要求:
表必须启用行移动:
(否则报错
)
不能有 DDL 变更干扰(比如删完又加了列、改了约束),否则闪回后元数据不一致
目标时间点之后不能有
或
,这两种操作不进 undo,Flashback Table 无能为力
典型误操作场景下,如果只是纯 DELETE + 提交,且表结构未变,
是最快路径。
为什么 Flashback Database 不总能用
这是全局级闪回,依赖数据库级别的 flashback log,不是所有环境都开着。常见卡点:
oracle知识库
oracle知识库下载
下载
数据库必须处于归档模式(
),且
已启用(查
)
flashback log 存储空间有限,默认可能只保留几小时,且日志会被自动清理;误删发生在 3 小时前?大概率已丢
执行需 DBA 权限,且数据库必须
状态下操作,意味着业务完全中断——对生产库来说,代价远高于单表恢复
简单说:除非你提前规划并持续监控 flashback log 空间,否则别指望它兜底。
DELETE 后立刻发现,但还没 COMMIT 怎么办
这是最省事的情况:只要会话没提交,undo 数据还在内存里,直接
即可。注意几个现实细节:
如果用了 PL/SQL 块或应用框架(如 Spring JDBC),可能隐式提交了事务,别假设“我刚按了回车就一定没提交”
某些客户端(如 SQL Developer)默认开启自动提交,删完就没了,得看设置里的
是否勾选
如果用了
并发删除,rollback 开销可能很大,但仍是首选——比任何闪回都快、安全、无副作用
真正棘手的是那种“删完顺手点了提交,关掉窗口,半小时后用户喊数据不见了”的情况——这时候才轮到 Flashback Query 或 Flashback Table 上场,而它们都有明确的前提和边界。
UNDO_RETENTIONSELECT ... AS OF TIMESTAMPSELECT value FROM v$parameter WHERE name = 'undo_retention';SELECT SCN_TO_TIMESTAMP(123456789) FROM DUAL;AS OF TIMESTAMPINSERT /*+ APPEND */ALTER TABLE t_name ENABLE ROW MOVEMENT;ORA-08189: cannot flashback the table because row movement is not enabledDROPTRUNCATEFLASHBACK TABLE t_name TO TIMESTAMP SYSTIMESTAMP - INTERVAL '2' MINUTE;ARCHIVELOGFLASHBACK ONV$DATABASE.FLASHBACK_ONMOUNTROLLBACK;AutoCommitDELETE /*+ PARALLEL */