Oracle 闪回(Flash Back)

闪回(Flash Back)

闪回介绍及种类

下方有两张表结构相同的表,第一张为修改前的表,第二张为修改后的表,接下来会通过对这两张表的操作来为大家阐述闪回的机制。

1.表名:user

idname
1tom1
2tom2
3tom3

2.表名:user

idname
1tom1
2tom222
3tom3

在我们对表2 update执行成功后,但我们还未执行commit(提交)的动作,此时我们可以通过rollback(回滚)的操作,回到表1的状态;而这段时间,我们表1被修改的数据,会存放在撤销表空间或撤销段中(undo),我们通过撤销段里记载的信息可以协助我们完成回滚,如果我们提交之后,那么原来表1的内容也不会立即在撤销段中立即删除,而是会保留15分钟(900秒)的时间,以上是关于commit和rollback的简单原理,使用闪回工具其实也就是利用其原理工作。

--撤销块参数
show parameter undo;
NAME            TYPE    VALUE    
--------------- ------- -------- 
undo_management string  AUTO     
undo_retention  integer 900      
undo_tablespace string  UNDOTBS1 
第一个参数代表自动管理撤销段,这个默认。
第二个参数代表恢复时间,也就是上述所说的900秒和这里对应,我们保存提交后900秒内的提交前的数据,而闪回就是利用了这个特性,当我们删除某行数据或者某张表,都可以通过撤销段来进行恢复。
第三个参数代表保存闪回(900秒)数据的表空间,整个数据库中只有一个Undo表空间。

闪回种类包括(闪回表、闪回删除、闪回数据归档、闪回版本查询等种类)今天我们主要讲前三种。

闪回实验

--查看撤销保存时间
show parameter undo;
--创建需要测试表
drop table aa;
create table aa(
id  number,
name varchar2(10)
);
--插入测试数据并提交
insert into aa (id,name) values(1,'tom1');
insert into aa (id,name) values(2,'tom2');
insert into aa (id,name) values(3,'tom3');
commit;
--删除一条id=3的数据,并记录当前删除时间。
delete from aa where id = 3;
commit;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; --2020-09-14 20:07:01
--将表中剩余的数据,依次删除并提交。
delete from aa where id = 2;
delete from aa where id = 1;
commit;
--检查表中是否还存在数据。
select * from aa;
--目前数据已经完全删除并切不能rollback,现在我们来进行恢复。
--这里是闪回表恢复:恢复表中被删除的数据或者某一行数据。
--我们要通过准确的时间恢复,所以这里我们用上了时间戳的函数(to_timestamp)
flashback table aa to timestamp to_timestamp('2020-09-14 20:07:01','yyyy-mm-dd hh24:mi:ss'); 
--执行完上面闪回表的命令会报错ora-08189,因为我们需要对该表开启移动功能,也就是将撤销表空间内的数据移动到原来的表中。
alter table aa enable row movement;--启动
alter table aa disable row movement;--启动
--重新恢复
flashback table aa to timestamp to_timestamp('2020-09-14 20:07:01','yyyy-mm-dd hh24:mi:ss');  --将id1,2 恢复
flashback table aa to timestamp to_timestamp('2020-09-14 20:06:55','yyyy-mm-dd hh24:mi:ss');  --往前推几秒,将id3 恢复
--有可能会出现的问题,如果出现报错
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-25153: 临时表空间为空
出现以上问题,重新创建一次临时表空间即可。
alter tablespace temp add tempfile '/u01/app/oracle/TEMP01.DBF' size  100M autoextend off;
--重新检查
select * from aa;

闪回表:将表中被删除的数据或行都可以进行恢复,在特定的时间内。

--删除之前创建的aa表
drop table aa;
--oracle数据库当中,ddl语句都是自带commit功能的,无需手动提交。
--这时候虽然aa表被删除了,但是还是能找得回来,原理就跟window的回收站一样,我们查询回收站内的表。
desc user_recyclebin; --表结构信息
select * from user_recyclebin; --object_name代表回收站内被删除对象的名字,ORIGINAL_NAME代表被删除的对象,operation删除动作,类型等
--恢复被删除的表
flashback table aa to before drop;
--查询表
select * from aa; --表和数据都已经恢复。
--还可以将恢复的表改名字
drop table aa;
flashback table aa to before drop rename to bb;
--查询
select * from bb;

闪回删除:能将ddl语句删除的对象还oracle回收站内进行恢复。
回收站:可以将回收站内的表进行删除 purge table aa,purge table aa。 以上两种闪回种类都依赖于撤销段(undo)


--以下为sys的操作范围
--创建闪回数据归档,当我们想让删除后的数据保存时间超过900秒的限制时,例如想保存1年的时间,那我们可以自行创建一个闪回数据归档的空间来保存数据。
--创建一个表空间,用于存放闪回归档数据。
create tablespace aa datafile '/u01/app/aa.dbf' size 10m;
--将创建的表空间指定为闪回归档表空间。
create flashback archive xxarch tablespace xx quota 5m retention 1 year; --虽然表空间为10m,但只能允许使用5m,闪回归档数据保存时间为1年。
--查看数据库内现有的闪回数据归档表空间以及清空和创建时间
select * from dba_flashback_archive; --刚刚创建的闪回空间 XXARCH
--将xxarch设置为默认闪回数据归档空间
alter flashback archive xxarch set default;
--查看闪回数据归档空间的保存天数以及使用配额大小
select * from dba_flashback_archive_ts;
--授权,开放此闪回数据归档空间给scott用户使用。
grant flashback archive on xxarch to scott;
--关于以下别的命令:
drop flashback archive xxarch --删除闪回数据归档。
alter flashback archive xxarch add tablespace users quota 10m --增加闪回数据归档的使用配额,可以通过dba_flashback_archive_ts查看闪回数据归档占用了哪些表空间的使用。
alter flashback archive xxarch modify retention 20 day; --修改保存时间范围

--登录scott用户使用xxarch闪回归档
create table cc(
id number,
name varchar2(10)
) flashback archive xxarch;
--用sys用户查看有多少表使用了闪回数据归档
select * from dba_flashback_archive_tables;
--剩余的测试操作,就跟前面一样了,可以自行删除或清空cc表进行测试。

闪回数据归档:创建新的闪回空间,利用新的闪回空间保存更多更久远的数据,前提必须是指定了新的闪回空间创建的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值