什么是闪回
Oracle 数据库闪回技术是一组独特而丰富的数据恢复解决方案,能够有选择性地高效撤销一个错误的影响,从人为错误中恢复。闪回是一种数据恢复技术,它使得数据库可以回到过去的某个状态,可以满足用户的逻辑错误的快速恢复。
注意:闪回仅对逻辑错误有效,如果是数据文件损坏,则闪回无效,须使用介质恢复。
特点:恢复速度快,无须备份文件。
开启方式
Oracle默认不启动闪回数据库,如果要启动闪回数据库特性必须将数据库设置为归档模式启动,并启用闪回恢复区。
查看是否开启闪回
sql
SQL>SELECT CREATED,FLASHBACK_ON FROM V$DATABASE;
CREATED FLASHBACK_ON
----------- ------------------
2011/9/8 11 NO
确定归档的操作系统存储位置
sql
SQL> show parameter db_recovery_file_Dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /data/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 2G
配置闪回保留时间
sql
SQL> show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
此参数为以分钟为单位的,默认为一天,即1440。其意义为从当前时间开始计算最大可以把数据库闪回到过去的时间。若要修改,有以下语句:
alter system set db_flashback_retention_tagget=2880 scope=both;
注意:设置的个值不一定能完全使数据库恢复到你想要的时候点,因为闪回是根据归档日志进行操作,而上面第2步配置的大小为2g,而闪回日志是由数据库自动记录的,如果由于空间不足,此时较早的闪回日志会被删除,导致闪回日志不完全而导致闪回失败,所以配置适合的大小。
开启闪回数据库
sql
startup mount;
--开启闪回数据库
alter database flashback on;
关闭闪回数据库
默认情况下,启动了闪回数据库,则数据库的永久表空间将受闪回数据库的保护,若想关闭闪回,执行如下:
sql
startup mount;
alter database flashback off;
闪回技术
Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场景合理选择最合适的闪回功能。
1)闪回查询 (Flashback Query)
功能描述
可以查询过去某个时间段的数据库状态。依赖undo数据,恢复数据时可以先查询,再做insert
工作原理
Oracle 会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据还没被覆盖)进行回滚,但这种回滚是临时的,仅针对当前session可见。
sql
select * from useren as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
--带where条件的:
select * from useren as of timestamp to_timestamp('2022-10-15 11:00:00','yyyy-mm-dd hh24:mi:ss') where id='1000';
--例如恢复数据
insert into useren select * from useren as of timestamp to_timestamp('2013-09-23 11:52:06','yyyy-mm-dd hh24:mi:ss');
2)闪回删除(Flashback Drop)
功能描述
闪回删除可以轻松将一个已经被Drop的表还原回来。相应的索引,数据库约束也会被还原(除了外键约束),利用recyelebin回收站原理
原理描述
Drop命令其实是Rename命令,早期的Oracle版本(10g之前),闪回删除意味着从数据字典中删除了该表的所有引用,虽然表中数据可能还存在,但已成了孤魂野鬼,没法进行恢复了,10g版本之后,Drop命令则仅仅是一个Rename操作,所以恢复就很容易了。
sql
--闪回useren用户表
flashback table useren to before drop;
--也可以在闪回删除的时候对表重命名
--格式flashback table TEST10 to before drop [rename to test11];
--例如
flashback table useren to before drop rename to useren_new
也可以通过回收站查看当前用户那些表被删除了,每个用户都有一个回收站,这个回收站是个逻辑结构,它不是一块独立的存储空间,它存在在当前表空间内,所以如果有别的操作需要空间,比如现在需要创建一张表,没有足够空间可用,回收站中的数据就会被清理,这也是导致闪回删除失败的原因。
sql
SQL> SHOW RECYCLEBIN;
--彻底删除表,闪回删除也无能为力
SQL> DROP TABLE EMP PURGE;
--清空回收站
SQL> PURGE RECYCLEBIN;
3)闪回数据归档(Flashback Data Archive )
功能描述:
闪回数据归档可使表具有回退到过去任何时间点的能力,前面提到的闪回查询,闪回表都会受限于撤销数据是否失效,如果撤销数据被覆盖重写了,闪回操作自然会失败,闪回删除则受限于表空间是否有足够可用空间,而闪回数据归档,则没有这些限制
sql
--1.创建一个用户闪回数据归档的表空间test_tb
create tablespace test_tb datafile 'test.dbf' size 20m;
--2.创建一个保留时间为2年的闪回归档
create flashback archive test_fa tablespace test_tb retention 2 year;
--3.为scott用户下的emp表启用闪回归档
grant flashback archive on test_fa to scott;
--链接
conn scott/tiger
--4.为emp表启用闪回归档,至此emp表就拥有了可以查询或回退到过去2年任意时间点的能力!
alter table emp flashback archive test_fa;
4)闪回数据库(Flashback Database )
DDL语句,依赖闪回区的闪回日志
功能描述:
闪回数据库可将整个数据库回退到过去某个时间点,闪回表是某张表的时空穿梭,闪回数据库则是整个数据库的时空穿梭。当然,闪回点之后的所有工作就丢失了,其实就相当于数据库的不完整恢复,所以只能以resetlogs模式打开数据库。闪回数据库会造成停机时间,当然相比于传统备份恢复机制,恢复过程会快很多。这是一种快速的数据库恢复方案,这种恢复是基于用户的逻辑错误,通常是将数据库恢复到之前的某一个时间点
工作原理:
闪回数据库不使用撤销数据,使用另外一种机制来保留回退所需要的恢复数据,当启用闪回数据库,发生变化的数据块会不断从数据库缓冲区缓存中复制到闪回缓冲区,然后,称为恢复写入器(Recovery Writer)的后台进程会将这些数据刷新到磁盘中的闪回日志文件中。闪回的过程,则是一个 提取闪回日志-->将块映像复制回数据文件 的过程。
实现方式
sql
--1.指定闪回恢复区,也就是存放闪回日志的位置,
alter system set db_recovery_file_dest ='/flash_recovery_area';
--2.指定恢复区大小
alter system set db_recovery_file_dest_size=4G;
--3.指定闪回日志保留时间为2小时,即通过闪回操作,可以将数据库回退到前两小时内的任意时间点
alter system set db_flashback_retention_target=120;
--4.有序关闭数据库--mount模式下启用闪回数据库--打开数据库 至此,闪回数据库配置完成!
shutdown immediate;
startup mount;
--开启闪回数据库
alter database flashback on;
alter database open;
--5.使用闪回数据库功能
shutdown immediate;
startup mount;
--6使用闪回数据库闪回数据库
flashback database to timestamp sysdate-60/1440;
--或者使用SCN 例如:flashback database to scn 13081009;
alter database open resetlogs;