oracle的闪回技术
1. ORACLE的闪回技术
1.1. Oracle 闪回技术简介
Oracle 闪回技术可将恢复时间从数小时缩短至数分钟。
任何预防措施都无法避免人为失误的发生。Oracle 数据库闪回技术是一组独特而丰富的数据恢复解决方案,能够有选择性地高效撤销一个错误的影响,从人为错误中恢复。在采用闪回技术之前,损坏数据库只需数分钟,而要恢复它则需要数小时。
有了闪回技术,纠正错误只需要数分钟的时间。此外,从错误中恢复所需的时间与数据库大小无关,这是 Oracle 数据库独有的功能。闪回技术支持在所有层面上进行恢复,包括行、事务、表和整个数据库。闪回技术通过一系列不断丰富的特性及时查看和恢复数据,包括:
闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。
需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)
1.1.1. 基本概念
1.1.1.1. 撤销段(UNDO SEGMENT)
在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段。
因为大部分闪回技术都需要依赖撤销段中的撤销数据。撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其分配一个撤销段,事务和撤销段存在多对一的关系,即一个事务只能对应一个撤销段,多个事务可以共享一个撤销段(不过在数据库正常运行时一般不会发生这种情况)。
1.1.1.2. 闪回技术
Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场景合理选择最合适的闪回功能。
1.1.1.2.1. 闪回查询(Flashback Query)
- a.基本闪回查询
功能描述:可以查询过去某个时间段的数据库状态。
工作原理:Oracle 会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据还没被覆盖)进行回滚,但这种回滚是临时的,仅针对当前session可见。
SQL> select * from dept as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
带where条件的:
select * from ap_payableitem as of timestamp to_timestamp('2022-10-15 11:00:00','yyyy-mm-dd hh24:mi:ss') where top_billid='1001A210000001UJ771S';
- b.闪回表
功能描述:可将某个表回退到过去某个时间点
工作原理:同样,Oracle会先去查询撤销段,提取过去某个时间点之后的所有变更,构造反转这些变更的SQL语句进行回退,闪回操作是一个单独的事务,所以若由于撤销数据过期之类的原因导致无法闪回,整个操作会回滚,不会存在不一致的状态。
步骤:
1.启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识该操作可能会改变行ID,即同一条数据闪回成功后主键都一样,但行ID其实已经发生变化了)
SQL> alter table emp enable row movement;
2.闪回表操作
SQL> flashback table dept to timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
闪回表可能会失败,有可能有以下几种情况:
1.违反了数据库约束,比如用户不小心删除了子表中的数据,现在想利用闪回表技术进行回退,恰好在这中间,父表中与该数据对应的那条记录也被删除了,在这种情况下,由于违反了外键约束,导致闪回表操作失败了;
2.撤销数据失效,比如用于支撑闪回操作的撤销数据被覆盖了,这种情况闪回表操作自然会失败;
3.闪回不能跨越DDL,即在闪回点和当前点之间,表结构有过变更,这种情况闪回操作也会失败。
注意:上述闪回功能都是基于撤销数据的,而撤销数据是会被重写的(Expired会被重写,Active不会被重写),所以,在需要使用这几种闪回功能去恢复数据的时候(确切地说,是需要使用基于撤销数据的闪回功能时),最短时间发现错误,第一时间执行闪回操作,才能最大程度地保证闪回功能的成功。
1.1.1.2.2. 闪回删除(Flashback Drop)
功能描述:闪回删除可以轻松将一个已经被Drop的表还原回来。相应的索引,数据库约束也会被还原(除了外键约束)
原理描述:Drop命令其实是Rename命令,早期的Oracle版本(10g之前),闪回删除意味着从数据字典中删除了该表的所有引用,虽然表中数据可能还存在,但已成了孤魂野鬼,没法进行恢复了,10g版本之后,Drop命令则仅仅是一个Rename操作,所以恢复就很容易了。
闪回删除操作执行命令
SQL> flashback table emp to before drop;
如果要还原的表名在当前系统中已经被占用,也可以在闪回删除的时候对表重命名
SQL> flashback table emp to before drop rename to emp_new
也可以通过回收站查看当前用户那些表被删除了,每个用户都有一个回收站,这个回收站是个逻辑结构,它不是一块独立的存储空间,它存在在当前表空间内,所以如果有别的操作需要空间,比如现在需要创建一张表,没有足够空间可用,回收站中的数据就会被清理,这也是导致闪回删除失败的原因。
SQL> SHOW RECYCLEBIN;
彻底删除表,闪回删除也无能为力
SQL> DROP TABLE EMP PURGE;
清空回收站
SQL> PURGE RECYCLEBIN;
注意:闪回删除只针对Drop命令,注意区分truncate操作和drop操作,truncate称为表截断,会清空表中数据(调节Oracle高水位线实现),表结构不受影响,速度很快,弊端是此过程不会产生任何撤销数据或是重做日志,如果误删,恢复异常麻烦,要慎重使用。而Drop则会删除数据+表结构,闪回删除仅针对Drop操作。
1.1.1.2.3. 闪回数据归档(Flashback Data Archive )
功能描述:
闪回数据归档可使表具有回退到过去任何时间点的能力,前面提到的闪回查询,闪回表都会受限于撤销数据是否失效,如果撤销数据被覆盖重写了,闪回操作自然会失败,闪回删除则受限于表空间是否有足够可用空间,而闪回数据归档,则没有这些限制。
创建闪回归档
1.创建一个用户闪回数据归档的表空间,当然,也可以使用已经存在的表空间。
SQL> create tablespace test_tb datafile 'test.dbf' size 20m;
2.创建一个保留时间为2年的闪回归档
SQL> create flashback archive test_fa tablespace test_tb retention 2 year;
3.为scott用户下的emp表启用闪回归档
(1).赋予用户归档的权限
SQL> grant flashback archive on test_fa to scott;
(2).连接用户
SQL> conn scott/tiger;
(3).为emp表启用闪回归档
SQL> alter table emp flashback archive test_fa;
至此,emp表就拥有了可以查询或回退到过去2年任意时间点的能力!
1.1.1.2.4. 闪回数据库(Flashback Database)
功能描述:
闪回数据库可将整个数据库回退到过去某个时间点,闪回表是某张表的时空穿梭,闪回数据库则是整个数据库的时空穿梭。当然,闪回点之后的所有工作就丢失了,其实就相当于数据库的不完整恢复,所以只能以resetlogs模式打开数据库。闪回数据库会造成停机时间,当然相比于传统备份恢复机制,恢复过程会快很多。
工作原理:
闪回数据库不使用撤销数据,使用另外一种机制来保留回退所需要的恢复数据,当启用闪回数据库,发生变化的数据块会不断从数据库缓冲区缓存中复制到闪回缓冲区,然后,称为恢复写入器(Recovery Writer)的后台进程会将这些数据刷新到磁盘中的闪回日志文件中。闪回的过程,则是一个 提取闪回日志-->将块映像复制回数据文件 的过程。
配置闪回数据库(闪回数据库要求数据库为归档模式)
1.指定闪回恢复区,也就是存放闪回日志的位置,但闪回恢复区不仅仅是为了存放闪回日志,Oracle的很多备份恢复技术都用到这个区域,比如控制文件的自动备份等都会存放到此区域。
SQL> alter system set db_recovery_file_dest ='/flash_recovery_area';
2.指定恢复区大小
SQL> alter system set db_recovery_file_dest_size=4G;
3.指定闪回日志保留时间为2小时,即通过闪回操作,可以将数据库回退到前两小时内的任意时间点
SQL> alter system set db_flashback_retention_target=120;
4.有序关闭数据库--mount模式下启用闪回数据库--打开数据库
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database flashback on;
SQL> alter database open;
至此,闪回数据库配置完成!
使用闪回数据库功能
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to timestamp sysdate-60/1440;
SQL> alter database open resetlogs;
本文列举了四类闪回技术,其中,闪回查询,包括基本闪回查询,闪回表等技术都依赖于撤销数据(还有一类闪回技术为闪回事务,可以对指定事务进行闪回操作,原理类似,借助于撤销数据来构建用于反转事务的SQL语句),依赖于撤销数据,则自然受限于撤销数据的保留时间,可能会由于撤销数据被覆写而导致闪回失败。
闪回删除,则是由于10g版本后对表的删除仅表现为一个rename操作,引入回收站的概念,但此回收站仅是当前表空间的一块逻辑划分,所以会受限于当前表空间的可用空间的限制;
闪回归档可提供查询或回退到过去任意时间点的功能,
闪回数据库则是一中更极端的数据库恢复功能,相当于不完整恢复,依赖于闪回日志。
1.1.2. 分类
- 闪回数据库
- 闪回删除
- 闪回查询
- 闪回事物
- 闪回版本查询
- 闪回事物查询
- 闪回归档(Total Recall)
- 闪回数据库: 使用 Oracle 优化的闪回日志将整个数据库恢复至特定时间点,而不是通过备份和正向恢复。
- 闪回表: 轻松地将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性很有用。
- 闪回删除:恢复意外删除的表。这将从回收站(所有被删除对象的逻辑容器)中恢复被删除的表及其所有索引、约束和触发器。
- 闪回事务:通过一个 PL/SQL 操作或使用 Enterprise Manager 向导撤销单个事务的影响,还可以选择性地撤消所有相关事务。
- 闪回事务查询:查看特定事务所做的所有更改,当错误事务更改了多个行或表中的数据时,此特性很有用。
- 闪回查询:查询过去某个时间点的任何数据。这一强大的特性可用于查看和逻辑重建意外删除或更改的受损数据。
- 闪回版本查询:按特定时间间隔检索不同版本的行,而非单一时间点。
Total Recall:高效地管理和查询长期历史数据。Total Recall 自动跟踪对数据库中所存储数据的每个更改,同时维护一个安全、高效、便于访问的历史数据存档。
使用闪回特性,可以查询历史数据、执行更改分析以及执行自助修复,以便在数据库联机时从逻辑损坏中恢复。利用 Oracle 闪回技术,您完全可以撤销过去的操作
1.1.3. 特点
- 恢复时间快、不需要使用备份文件
- 可以使数据库回到之前的某个状态
1.1.4. 不足
只是一种逻辑恢复,对于数据文件损坏的情况下是无法恢复的
数据文件损坏那么必须进行介质恢复。
*系统表空间数据不得闪回
*实体在数据库保存时间不可保证,保留时间取决于系统运行状况,可能是几秒钟,也可能是几个月。
*基表闪回时,建立在表上的约束不可保证
1.2. 闪回数据库
1.2.1. 使用场景和限制
(1)、一种快速的数据库恢复方案,这种恢复是基于用户的逻辑错误
比如:
- 对表中的数据做了错误的操作
- 插入了大量错误的数据
- 删除了一个用户等
此时通常是将数据库恢复到之前的某一个时间点。
相比于原始的恢复方式需要先备份数据文件,再使用归档日志恢复到以前的时间点。
(2)、闪回日志由oracle自动创建,并保存于闪回恢复区中,由闪回恢复区管理,因为是自动管理的,所以如果闪回恢复区空间不足,闪回日志也会自动删除。
所以闪回恢复区应该适当的设置的大一点。
(3)使用闪回数据库的限制
在以下几种情况下不能使用闪回数据库的特性
- 1、如果数据文件被删除或者缩短
- 2、如果在闪回时间范围之内复原或者重建了一个控制文件
- 3、在resetlogs操作之前
- 4、表空间被删除
1.2.2. 使用闪回数据库技术之前的准备
打开闪回数据库功能
(1)确保数据库处于归档模式
archive log list
配置归档模式:
startup mount
alter database archivelog;
(2)查看快闪恢复区的位置和设置的大小(闪回日志存储的位置和空间的大小)
show parameter db_recovery_file_dest;
(3)启用闪回数据库功能
alter database flashback on;
启动之后我们可以通过试图v$database查看启动的状态
select dbid,name,flashback_on from v$database;
(4)通过试图查看最多能够闪回的时间
以及修改能闪回的最大天数
设置参数DB_FLASHBACK_RETENTION_TARGET 该参数默认值为1440分钟,
表示可以将数据库闪回到过去的时间,也就是默认可以闪回一天前的数据。
show parameter db_flashback_retention;
我们可以动态的修改这个参数的值,使的数据库可以闪回到更长的时间,比如1个月
24*60*30=43200
alter system set db_flashback_retention_target=43200 scope=both;
(5)查看系统时间
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
(6)查看我们能够闪回到的最早的scn号 和最早的时间,并且评估闪回恢复区的大小
select * from v$flashback_database_log;
查看能闪回到的最早时间
select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
1.2.3. 闪回数据库的方法:
1.2.3.1. 在RMAN下(3种方法):
(1)、使用to_date将数据库闪回到指定的时间点
RMAN>flashback database to time=to_date('2017-06-29 12:30:00','yyyy-mm-dd hh24:mi:ss');
(2)、将数据库闪回到指定的SCN,该方法一般不使用,因为SCN号一般不会去查询
RMAN>flashback database to scn=638832;
(3)、闪回到指定的日志序列号之前的状态,但是不包括该序列号的状态
RMAN>flashback database to sequence=345 thread=1;
1.2.3.2. 在sql命令下(两种方式):
(1)、闪回到指定的时间戳
SQL>flashback database to timestamp to_date('2017-06-29 12:30:00','yyyy-mm-dd hh24:mi:ss');
(2)、闪回数据库到过去的某个SCN
SQL>flashback database to scn 66465;
1.2.4. 数据库闪回完毕之后的操作
数据库闪回完毕之后还要使用resetlogs方式打开数据库
alter database open resetlogs;
方式打开数据库
这样做是为了使重做日志序列重新计数
注意:完成闪回之后,我们最好使用read only的模式打开数据库,先验证数据库是否成功恢复,
alter database open read only;
如果没有成功恢复可以继续使用闪回数据库恢复,知道成功恢复为止。
如果闪回失败,造成了一定的混乱,也就是闪回没有达到目的,那么可以使用
recover database 撤销闪回操作,
如果闪回太多可以使用
recover database until将数据库恢复到以前的某一个时间点
1.3. 闪回删除
1.3.1. 使用场景和限制
闪回删除原理:
(回收站机制,所以使用drop table tablename purge;命令删除的表无法使用闪回恢复,只能使用备份恢复)
防止错误的删除表、索引等数据库对象
优势:
在没有使用闪回删除之前只能使用传统的数据恢复的方式从备份中恢复,此时需要备份文件以及归档日志文件
而闪回删除不需要备份文件以及归档日志文件,使用的原理是回收站机制
不足
只能是drop删除的数据,应为这样删除的数据会放入到回收站中,该信息会保留一段时间
直到回收站空间不足或者使用purge清除了回收站的信息。
闪回数据:RVWR+闪回日志+归档日志
闪回现有表:undo tablespace
闪回删除表:recyclebin
1.3.2. 打开闪回删除
因为闪回删除的基本原理就是回收站机制,所以打开闪回删除就是打开回收站
1、查看回收站是否打开(默认打开)
show parameter recyclebin;
on 打开 off表示关闭
2、启用闪回删除
alter system set recyclebin=on scope=both;
3、查看回收站中的信息
desc user_recyclebin;
desc dba_recyclebin;
select * from user_recyclebin;
1.3.3. 闪回删除的表
闪回删除的表
flashback table tablename to before drop;
1.3.4. 注意事项
1.删除的表如果有索引,那么索引会失效,如何闪回删除了的表,那么索引也会自动闪回,
但是索引的名字还是回收站中的名字,需要我们手动修改。
修改的方式:
先删除索引
drop index 'bin$1dffddsfds==40';
再重建索引
create index scott_test_in on test(ename);
2.对于回收站中有多个相同名称的表时,我们需要恢复指定表的情况。
可以通过查看回收站中表的信息,确定是否为我们需要恢复的表,然后再执行恢复。
查看:
desc 表名
elect * from "表名";
查看回收站中的表时一定要加双引号,否则会出错
恢复
flashback table tablename to before drop rename to new_name;
如果需要恢复多个相同名称的表,那么依次重新命名即可。
永久删除表或者表空间:
drop table tablename purge;
永久删除表空间:
drop tablespace 名称 including contents;
对于已经使用drop table tablename删除过的表,想永久删除
那么可以查看回收站使用
purge table test;
删除
purge tablespace 名称;
1.4. 闪回表
1.4.1. 使用场景和限制
(这个非常实用,而且在指定的时间范围之内可以无数次往前或者往后闪回,直到能恢复到你需要的数据位置,期间不会产生覆盖的情况)
利用undo表空间里记录的数据映像
限制:
1.将表里的数据退到某个时间点,利用的是undo表空间中记录的数据旧映像,如果闪回需要的数据由于保留的时间超过了初始化参数undo_retention所指定的值,从而导致该undo数据块被其他事物覆盖,那么就不能恢复到指定的时间点了。
2.注意在指定的闪回时间之内,不能有DDL操作,否则数据将无法恢复。
1.4.2. 注意事项
1、保证参数undo_retention的恢复时间要在你需要恢复的时间范围之内。
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
默认是秒,这里表示900/60=15分钟
可以修改为24小时 86400
2、保证了恢复的时间还需要保证我们的undo的数据块不能被其他的事物覆盖、所以还需要设置retention guarantee;选项,来保证我们可以成功的恢复到指定的时间
SQL> show parameter undo_retention;
alter system set undo_retention=86400 scope=both;
alter tablespace undotbs1 retention guarantee;
3、因为闪回表的操作会修改表里面的数据,所以可能引起数据行的移动,所以需要打开数据表的行迁移,(只需要在执行闪回之前启动即可)
alter table emp_test1 enable row movement;
(这个非常实用,而且在指定的时间范围之内可以无数次往前或者往后闪回,直到能恢复到你需要的数据位置,期间不会产生覆盖的情况)
1.4.3. 闪回表实例
1、生存一个个数据表emp_test1
2、修改数据表中的内容,可以使update/delete/insert等操作(注意,不能是ddl操作)
update emp_test1 set sal=10 where empno<7600;
3、打开行迁移
alter table emp_test1 enable row movement;
4、开始闪回数据
flashback table emp_test1 to timestamp to_date('2017-07-14 09:43:30','yyyy-mm-dd hh24:mi:ss');
1.5. 闪回查询
Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),
每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,
使用时也需要根据实际场景合理选择最合适的闪回功能。
1.5.1. 闪回查询(Flashback Query)
a.基本闪回查询
功能描述:可以查询过去某个时间段的数据库状态。
工作原理:Oracle 会提取所需要的撤销数据(前提是撤销是可用的,即撤销数据还没被覆盖)进行回滚,但这种回滚是临时的,仅针对当前session可见。
SQL> select * from dept as of timestamp to_timestamp('2016-09-10 11:00:00','yyyy-mm-dd hh24:mi:ss');
1.5.2. 闪回查询并插入表中
1、insert into 表名 select * from 表名 as of timestamp-分钟数/使用SCN;
1.5.3. 闪回到新建的表中
2、create table 表名 as select 表名 as as of timestamp-分钟数/使用SCN;
1.5.4. 闪回查询
select * from tableName as of timestamp to_timestamp('2009-01-25 12:00:00', 'yyyy-mm-dd hh24:mi:ss')
1.5.5. 查看当前系统时间:
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;
select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual
12小时制
select to_char(sysdate,'yy-mm-dd hh:mi:ss') from dual;
1.5.6. 查看当前数据库的SCN:
1、首先要有DBMS_FLASHBACK包的权限
Grant excute on DBMS_FLASHBACK to scott;
2、要有查询v$database视图的权限
Grant select on v_$database to scott;
3、可以使用下面的两种方法查询
SQL> select current_scn from v$database;
SQL> select dbms_flashback.get_system_change_number from dual;
1.6. 闪回事物
flashback_transaction_query包含对数据库执行的所有更改,包括DDL操作。
由于undo表空间有限,因此flashback_transaction_query中只包含一部分事物。
1.6.1. 闪回事物查询的先决条件
必须先启用重做日志流的其他日志记录。闪回事物查询既需要增强的重做信息,也需要撤销信息。
--开启重做日志流的其他日志记录
alter database add supplemental log data;
alter database add supplemental log data(primary key) columns;
--赋予相关权限给操作闪回事物的用户
grant execute on dbms_flashback to jingyu;
grant select any transaction to jingyu;
- 使用TRANSACTION_BACKOUT过程
在继续讨论此功能前,首先应了解一个概念:事务的依赖性。比如,两个事务TX1和TX2,若符合以下3个条件的任意一个就可以认为TX2依赖TX1:
(1)WAW依赖(Write After Write),即在TX1修改了表的某行之后,TX2又修改了同一行。
(2)主键依赖,即在一张拥有主键的表中TX1首先删除了一行,之后TX2又插入了具有相同主键值的另一行。
(3)外建依赖,即由于TX1的修改(insert或update)而产生了新的可被外键参考的字段值,之后TX2修改(insert或update)外键字段时利用了TX1所产生的字段值。
了解事务依赖性有助于解决在撤销事务时遇到的矛盾,以主键依赖为例,试想若直接将事务TX1撤销并且不理会事务TX2,岂不是会出现主键值重复的行!
TRANSACTION_BACKOUT存储过程的OPTIONS参数就是为了解决事务依赖性问题而存在的,在该参数上管理员可以使用4种撤销事务的方案,假设被撤销的事务是TX1,若其具有依赖事务,则称为TX2:
(1)NOCASCADE,TX1不可以被任何其他事务依赖(即TX2不存在),否则撤销操作报错。
(2)CASCADE,将TX1连同TX2一起撤销。
(3)NOCASCADE_FORCE,忽略TX2,直接执行TX1的撤销SQL将TX1撤销,如果没有约束上的冲突,操作将成功,否则约束报错导致撤销操作失败。
(4)NONCONFILICT_ONLY,在不影响TX2的前提下,撤销TX1的修改。与NOCASCADE_FORCE的不同点在于会首先过滤一下TX1的撤销SQL,确保它们不会作用在TX2修改的行上。
使用DBMS_FLASHBACK.BACKOUT_TRANSACTION的步骤如下:
(1)将需要撤销的事务的事务号或事务名载入对应的VARRAY集合变量。
(2)以NOCASCADE方式调用BACKOUT_TRANSACTION。如果报错,再从另外3种方式中选择一个调用BACKOUT_TRANSACTION。
(3)查看闪回事务操作的报告。
(4)最后决定提交或回滚。
实例
transaction T1
update flash_test2 set salary=salary*3;
transaction T2
update flash_test2 set salary=salary*1.1 where empno='1';
上面的例子 由于T1的错误操作,导致T2的操作也得到了错误的结果。因此我们需要将T1和T2一起撤销。
查询事务号
select distinct xid,commit_scn
from flashback_transaction_query
where table_owner='ADMIN' and
table_name='FLASH_TEST2' and
commit_timestamp > systimestamp - interval '15' minute
order by commit_scn;
由于T1 T2 存在WAW 依赖关系 因此options 选择 cascade
declare
xids sys.xid_array;
begin
xids := sys.xid_array('05001200412C0000');
dbms_flashback.transaction_backout(1,xids,options=>dbms_flashback.cascade);
end;
/
commit;
回退完毕。
1.6.2. 闪回事物查询
select start_scn, commit_scn, logon_user, operation, table_name, undo_sql
from flashback_transaction_query
where xid = hextoraw('05000E00C70B0000');
1.7. 闪回版本查询
查询SCN在3218516 and 3218530之间的行id=1的完整历史:
select versions_startscn, versions_endscn, versions_xid, versions_operation, id, contents
from t1
versions between scn 3218516 and 3218530
where id = 1;
1.8. 闪回归档(Total Recall)
如果数据库中的一部分表需要长的多的保留期。
Flashback Data Archive仅记录UPDATE和DELETE语句,不记录INSERT语句。
--创建表空间(可以使用现有表空间,但Oracle建议最好使用专用表空间)
create tablespace fda1;
create tablespace fda2;
create tablespace fda3;
--创建闪回归档
create flashback archive fa_config tablespace fda1 retention 10 year;
create flashback archive fa_data tablespace fda1 retention 1 year;
--数据字典视图dba_flashback_archive, dba_flashback_archive_ts查看闪回归档、闪回归档和表空间的关系
set linesize 1000
col FLASHBACK_ARCHIVE_NAME for a20
col CREATE_TIME for a34
col LAST_PURGE_TIME for a34
col OWNER_NAME for a20
select * from dba_flashback_archive;
select * from dba_flashback_archive_ts;
--权限 flashback archive administer(有这个系统权限才可以创建和修改FDA),flashback archive(有这个对象权限才能启用对表的跟踪)
--给闪回归档增加表空间
alter flashback archive fa_data add tablespace fda3 quota 50M;
--清除归档fa_data归档中2015年11月17日前的所有行:
alter flashback archive fa_data purge before timestamp to_timestamp('2015-11-16 00:00:00','YYYY-MM-DD HH24:MI:SS');
--表分配到闪回归档
alter table T1 flashback archive fa_config;
alter table T2 flashback archive fa_data;
--查询DBA_FLASHBACK_ARCHIVE_TABLES分析使用FDA的表
select * from dba_flashback_archive_tables;
--查询5年前T1表的数据量(对用户而言,AS OF查询使用的是FDA还是UNDO表空间是完全透明的)
select count(1) from t1 as of timestamp systimestamp - interval '5' year;