使用update后忘记加条件导致全表更新可以使用,闪回技术恢复数据。
闪回技术:Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库)
一、闪回查询
1.查询某个操作是几时执行的时间点
--例查询2020-11-11执行的update语句
select t.SQL_TEXT, t.FIRST_LOAD_TIME
from v$sqlarea t
where t.SQL_TEXT like 'update%' and t.FIRST_LOAD_TIME like '2020-11-11%'
order by t.FIRST_LOAD_TIME desc
2.闪回查询:可以查询到某个时间点的数据库状态:
select * from tablename as of timestamp to_timestamp('2020-11-11 22:00:00','yyyy-mm-dd hh24:mi:ss');
3.数据恢复:
--1.开启表的 row movement
alter table tablename enable row movement
--2.闪回到指定时间的数据状态
flashback table tablename to timestamp to_timestamp('2020-11-11 16:06:00','yyyy-mm-dd hh24:mi:ss');
--3.关闭表的 row movement
alter table tablename disable row movement
撤销段:Oracle中一个逻辑结构,因为大部分闪回技术都需要依赖撤销段中的撤销数据。撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其分配一个撤销段
闪回表可能会失败,有可能有以下几种情况:
- 违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好在这中间,父表中与该数据对应的那条记录也被删除了,在这种情况下,由于违反了外键约束,导致闪回表操作失败了;
- 撤销数据失效,比如用于支撑闪回操作的撤销数据被覆盖了,这种情况闪回表操作自然会失败;
- 闪回不能跨越DDL,即在闪回点和当前点之间,表结构有过变更,这种情况闪回操作也会失败
所以,在需要使用闪回功能去恢复数据的时候,最短时间发现错误,第一时间执行闪回操作,才能最大程度地保证闪回功能的成功。