ORACLE 闪回
Posted wangrui1587165
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE 闪回相关的知识,希望对你有一定的参考价值。
1. 概述
闪回技术是oralce强大备份机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且小损失的恢复(多数闪回功能都能在数据库的联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或者是介质丢失的错误,闪回技术就回天回天乏术了,还得借助于Oracle的一些高级的备份恢复工具如rman去完成。
2. 撤销段(undo segment)
撤销段,oralce中的一个逻辑结构。大部分闪回数据都要依赖撤销段中的撤销数据。撤销语句是反转DML语句所需要的信息,只要某个语句修改了数据,那么更新前的语句就会被写入一个撤销段。(事务回滚也需要用到撤销段中的数据),事务启动时,数据库会为其分配一个撤销段,事务和撤销段存在一对多的关系,即一个事务只能对应一个撤销段,多个事务可以共享一个撤销段(数据库正常运行时一般不会发生这种情况)。
3. 闪回技术
Oracle提供了四种可供使用的闪回技术:闪回查询、闪回删除、闪回归档、闪回数据库。每种都有不同的底层体系结构支撑。旦其中这四种不同的闪回技术功能是有重叠的,使用时也要根据实际场景选择最合适的闪回功能。
测试数据准备
insert into student (stu_id, stu_name, sex, credit) values (\'0001\', \'大王\', \'2\', \'83\');
insert into student (stu_id, stu_name, sex, credit) values (\'0002\', \'刘一\', \'1\', \'85\');
commit;
3.1 闪回查询
▶ 闪回基本查询
功能描述:可以查询过去某个时间段的数据库状态。
工作原理:oralce会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据可以被覆盖)进行回滚,但这种回滚是临时的,仅针对当前的session可见。
select * from student as of timestamp to_timestamp(\'2016-08-31 13:37:00\',\'yyyy-mm-dd hh24:mi:ss\');
▶ 闪回表
功能描述:将某个表回退到过去的某个时间点。
工作原理:同样,Oracle会先去查询撤销段,提取过去某个时间点的所有变更。构造反转这些变更的SQL语句进行回退。闪回操作是一个单独的事务,所以由于撤销事务过期之类的原因导致无法闪回,整个操作会回滚,不会存在操作不一致的情况。
① 启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识此操作可能会改变行ID,即同一条数据闪回后主键ID都一样,但行ID已经发生变化了)
alter table student enable row movement;
② 闪回表操作
flashback table student to timestamp to_timestamp(\'2018-08-31 11:00:00\',\'yyyy-mm-dd hh24:mi:ss\');
如果没有①操作,会报错
闪回表可能会失败,有可能是以下几种情况:
▶ 违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好这中间,父表中与改记录对应的那条记录也被删除了,由于违反了外键约束,导致闪回表失败;
▶ 撤销数据失效,用于支撑闪回操作的撤销数据被覆盖了,导致闪回表操作失败;
▶ 闪回不能跨越DDL,即在闪回点和当前点之间,表结构有过变更,闪回操作也会失败。
3.2 闪回删除
功能描述:闪回删除可以轻松的将一个已经被drop掉的表还原回来。相应的索引,数据库约束也会被还原(除了外键约束)
工作原理:drop命令其实是rename命令,早期的Oracle版本,闪回删除意味着从数据字典中删除了该表的所有引用,虽然表中的数据可能还存在,但是已经成了孤魂野鬼,没有办法进行恢复了,10G版本以后,drop命令仅仅是一个rename操作,所以恢复就很容易了,
闪回删除操作命令很简单
flashback table student to before;
如果要还原的表名在当前系统中已被占用,也可以在闪回删除的时候对表进行重命名
flashback table student to before drop rename to student_new;
也可以通过回收站查看当前用户的哪些表被删除了,每个用户都有一个回收站,这个回收站是个逻辑结构,它不是一块独立的存储空间,他存在于当前表中间内,如果有别的操作需要空间,比如现在需要创建一张表,没有足够空间可用,那回收站中的数据就会被清理,这也是导致闪回失败的原因
show recyclebin;--pl/sql执行此命令不成功
彻底删除表,闪回删除也无能无力
drop table student purge;
清空回收站
purge recyclebin;
闪回删除只针对drop命令,truncate操作为表截断,会清空表中数据(调节oralce高水位线实现),表结构不受影响,速度很快,弊端是此过程不会产生任何撤销数据或是重做日志,如果误删,恢复异常麻烦。而drop操作则会删除数据+表结构,闪回删除仅针对drop操作。
3.3 闪回数据归档(flashback dada archive)
功能描述:闪回数据归档可使表具有回退到过去任何时间点的能力,前面提到的闪回查询,闪回表都会受限于撤销数据是否失效,如果撤销数据被覆盖重写了,闪回操作自然会失败,闪回删除则受限于是否有足够可用空间,而闪回数据归档,则没有这些限制。
创建闪回归档
① 创建一个用户闪回数据归档的表空间(也可以使用已存在的表空间)
create tablespace test_space datafile \'test_space.dbf\' size 20m;
② 创建一个保存期为2年的闪回归档
create flashback archive test_fa tablespace test_space retention 2 year;
③ 赋予用户归档的权限
grant flashback archive on test_fa to kdjl;
④ 为student表启用闪回归档
alter table student flashback archive test_fa;
至此,student表接拥有了可以查询或者可以回退到过去两年任意时间点的能力。
3.4 闪回数据库
功能描述:闪回数据库可以将整个数据库回退到过去的某个时间点,闪回表是某张表的时空穿梭,闪回数据库则是整个数据库的时空穿梭。当然,闪回点之后的所有工作就丢失了,其实就相当于数据库的不完整恢复。所以只能以resetlogs模式打开数据库。闪回数据库会造成停机时间,但是相比于传统的备份恢复机制,恢复过程会快很多。
工作原理:闪回数据库不使用撤销数据,使用另外一种机制来保留回退所需要的恢复数据,当启用闪回数据库,发生变化的数据块会不断的从数据库缓冲区缓冲中复制到闪回缓存区,然后,称为恢复写入器(recovery writer)的后台进程会将这些数据刷新到磁盘中的闪回日志文件中。闪回的过程,则是一个提取闪回日志->将块印象复制回数据文件的过程。
配置闪回数据库(闪回数据库要求数据库为归档模式)
① 指定闪回恢复区,也就是存放闪回日志的位置,但闪回恢复区不仅仅是为了存放闪回日志,oralce的很多备份恢复技术都用到这个区域,比如控制文件的自动备份等都会存放到此区域。
alter system set db_recovery_file_dest =\'/flash_recovery_area\';
② 指定恢复区大小
alter system set db_recovery_file_dest_size=4G;
③ 指定闪回日志保留时间为2小时,即通过闪回操作,可以将数据库回退到2个小时内的任意时间点,
alter system set db_flashback_retention_target=120;
④ 有序关闭数据库,mount模式下启用闪回数据库,打开数据库
shutdown immediate;
startup mount;
alter database flashback on;
alter database open;
⑤ 使用闪回数据库
shutdown immediate;
startup mount;
flashback database to timestamp sysdate-60/1440;
alter database open resetlogs;
4. 总结
本文列举了四类闪回技术,其中闪回查询,包括基本闪回查询,闪回表等技术都依赖于撤销数据(还有一类技术为闪回事务,可以对事务进行闪回操作,原理类似,借助于撤销数据来构建用于反转事务的SQL语句),依赖于撤销数据,则依赖于撤销数据的保留时间,可能由于撤销事务被覆盖而导致闪回失败。闪回删除,则是由于10G版本后对表的删除仅表现为一个rename的操作,引入回收站的概念,但此回收站仅是当前表空间的逻辑划分,所以受限于当前可用表空间的限制。闪回归档可提供查询或者回退到过去任意时间点的功能。闪回数据库则是一种更极端的数据恢复功能,相当于不完整恢复,依赖于闪回日志。
闪回技术详解:https://www.cnblogs.com/chengxiao/p/5860823.html
以上是关于ORACLE 闪回的主要内容,如果未能解决你的问题,请参考以下文章