概述
闪回技术是Oracle强大的数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了.
还是得借助于Oracle一些高级的备份恢复工具,如Ramn去完成(这才是Oracle强大的备份恢复机制的精髓所在)
撤销段(UNDO SEGMENT)
在讲闪回技术前,需要先了解Oracle的一个逻辑结构撤销段
。因为大部分闪回技术都需要依赖撤销段中的撤销数据。撤销数据是反转DML语句结果所需的信息,只是某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段,(事务回滚也会用到撤销段中的数据),事务启动时,Oracle就会为其分配一个撤销段,事务和撤销段存在多对一的关系,即一个事务只能对应一个撤销段,多个事务可以共享一个撤销段(不过在数据库正常运行时一般不会发生这种情况)
闪回技术
Oracle提供了四种可供使用的闪回技术(闪回查询、闪回删除、闪回归档、闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场合合理选择最合适的闪回功能。
小试牛刀
第一种:delete删除掉的记录
-- 创建数据表
create table ABCDEFG(
username varchar2(50) primary key,
userage number
);
-- 插入测试数据
insert into ABCDEFG (USERNAME, USERAGE)
values ('123', 25);
insert into ABCDEFG (USERNAME, USERAGE)
values ('456', 30);
insert into ABCDEFG (USERNAME, USERAGE)
values ('1312', 25);
insert into ABCDEFG (USERNAME, USERAGE)
values ('1231', 31);
commit;
-- 查询数据
select t.*, t.rowid from ABCDEFG t
--我们将其中某一条数据删除;
delete from ABCDEFG where username='123';
commit;
-- 如果记得删除时间的话,可用如下语句查询该表在该时间的原始数据
select * from ABCDEFG as of timestamp to_timestamp('2021-06-11 11:56','yyyy-mm-dd hh24:mi:ss')
-- 开启行移动功能
alter table ABCDEFG enable row movement;
-- 进行闪回(也就是让该表恢复到某一时间)
flashback table ABCDEFG to timestamp to_timestamp('2021-06-11 11:56','yyyy-mm-dd hh24:mi:ss')
create table ABCDEFG(
username varchar2(50) primary key,
userage number
);
-- 进行行表数据恢复以后,我们必须要关闭行移动功能
alter table ABCDEFG disable row movement;
第二种:drop掉的表如何恢复
-- 查询用户下所拥有的表(dropped代表是否删除)
select table_name,dropped from user_tables;
-- 我们把刚才创建的表进行删除
drop table ABCDEFG;
-- 查询已经删除的表(ogiginal_name就是表名,type代表删掉的类型)
select object_name,original_name,type,droptime from user_recyclebin;
-- 用ogiginal_name进行恢复
flashback table ABCDEFG to before drop;
-- 用object_name进行恢复,并且重命名为新表
-- 利用object_name进行恢复,并指定新的名称
flashback table "BIN$xHe8/cqu1tvgVQJQVq0UJQ==$0" to before drop rename to "ABEFG";
注:truncate 清空的表无法进行回复
闪回失败
闪回表失败的情况如下:
- 违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好在这中间,父表中与该数据对应的那条记录也被删除了,在这种情况下,由于违反了外键约束,导致闪回表失败
- 撤销数据失效,比如用于支撑闪回操作的撤销数据被覆盖了,这种情况闪回表操作自然会失败
- 闪回不能跨越DDL(数据库定义语言),即在闪回点和当前点之间,表结构有过变更,这种情况下闪回操作也会失败
上述闪回功能都是基于撤销数据的,而撤销数据是会被从写的(Expired会被重写,Active不会被重写),所以,在需要使用这几种闪回功能去恢复数据的时候(确切的说,是需要使用基本撤销数据的闪回功能时),最短时间发现错误,第一时间执行闪回操作,才能最大程度的保证闪回功能的成功。