闪回(Flash Back)
闪回介绍及种类
下方有两张表结构相同的表,第一张为修改前的表,第二张为修改后的表,接下来会通过对这两张表的操作来为大家阐述闪回的机制。
1.表名:user
id | name |
---|---|
1 | tom1 |
2 | tom2 |
3 | tom3 |
2.表名:user
id | name |
---|---|
1 | tom1 |
2 | tom222 |
3 | tom3 |
在我们对表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表进行测试。
闪回数据归档:创建新的闪回空间,利用新的闪回空间保存更多更久远的数据,前提必须是指定了新的闪回空间创建的对象。