闪回功能:
1:闪回数据库某一时刻,闪回数据库(flashback database)
2:使用闪回表将表内容还原到过去的特定时间点,闪回表(flashback table)
3:从删除表中进行恢复,闪回删除(flashback drop)
4:使用闪回查询查看截止到任一时间点的数据库内容,闪回查询(flashback query)
5:使用闪回版本查询查看某一行在一段时间内的各个版本,(flashback version query)
6:使用闪回事务查询查看事务处理历史记录或行,闪回事务查询(flashback transcation query)
1:闪回数据库
闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。oracle数据库会定期将数据块的“前像”记录在闪回数据库日志中。
为了快速将数据文件更改回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块前像。然后,应用重做日志文件中的更改来填充间隔。
在快速恢复区中会自动创建和管理闪回数据库日志。
闪回数据库:是当出现逻辑错误时,能够将整个数据库回退到出错前的那个时间点上。
比如:用户截断了表(trucate),系统管理员误删除了用户,
用户错误的执行了某个批处理任务,或者该批处理任务的脚本编写错误,使得多个表的数据发生混乱,
闪回数据库的日志文件不是由传统的Log Writer (LGWR)进程写入,而是由一个称为RecoVery WRiter (RVWR)的新进程写入,
闪回日志文件由RCWR进程在恢复区中自动创建和维护。
实现闪回数据库的基础是闪回日志,只要我们配置了闪回数据库,就会自动创建闪回日志。
这时,只要数据库里的数据发生变化,oracle就会将数据被修改前的旧值保存在闪回日志里,
当我们需要闪回数据库时,oracle就会读取闪回日志里的记录,并应用到数据库上,从而将数据库回退到历史的某个时间点上。
启动闪回数据库功能
1.1) 查看数据库是否开启闪回
select flashback_on from v$database;
1.2)启用恢复区,存放闪回日志:闪回恢复区提供了一个集中化的存储区域,很大程度上减小了管理开销。
这是其最主要的优点。与 RMAN 结合使用可以进行快速恢复。
可以存储:闪回日志 、控制文件、归档的日志文件 、RMAN 备份集 、数据文件拷贝
show parameter recovery
alter system set db_recovery_file_dest_size=8G ;
alter system set db_recovery_file_dest='/opt/soft/recover';
1.3) 设置闪回日志保存时间
show parameter db_flashback_retention_target
alter system set db_flashback_retention_target=10080 ;
1.4) 开启数据库闪回
alter database flashback on;
select * from v$recovery_area_usage --查看闪回日志大小
1.5)使用闪回数据库
1.5.1)创建表
create table flashback_t as select * from dba_objects where rownum < 100;
select count(1) from flashback_t;
修改表
create table flashback_t_xiu as select * from dba_objects where rownum < 100;
update flashback_t_xiu set object_id=1;
commit;
create table flashback_t_tru as select * from dba_objects where rownum < 100;
select count(1) from flashback_t_tru;
1.5.2 )查看当前SCN和时间
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
3216379
1.5.3) 删除表、修改表、TRUNCATE 表
drop table flashback_t;
truncate table flashback_t_tru;
update flashback_t_xiu set object_id=200;
commit;
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
select sysdate from dual;
3216638
1.5.4) 闪回到过去时间点:闪回需要在Mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。
shutdown immediate ;
startup mount;
flashback database to timestamp to_timestamp('2016-04-12 21:57:02','yyyy-mm-dd hh24:mi:ss');
flashback database to SCN 3216379;
1.5.5) 以read only 方式打开,验证数据,如果不够理想,可以重新使用闪回
alter database open read only;
select OPEN_MODE from v$database;
1.5.6) 验证数据
select count(1) from flashback_t;
select count(1) from flashback_t_tru;
select object_id from flashback_t_xiu;
数据验证正确;
1.5.7) 以resetlogs 方式打开数据库
alter database open resetlogs;
select * from v$log
select resetlogs_id from v$archived_log group by resetlogs_id;
闪回数据库:减少还原时间
闪回数据库比使用还原文件和重做日志文件的传统时间点恢复的速度要更快。随着数据库规模的增加,
通过还原所有数据文件来执行传统的时间点恢复所需的时间长度变得不太现实。使用闪回数据库时,
因为不要需要还原数据文件,所以恢复数据库的时间与需要回退的更改数目成比例。
在不能使用闪回数据库功能的情况下,必须使用不完全恢复操作将数据库返回到特定时间。
闪回数据库操作完成后,可在只读模式下打开数据库,验证是否使用了正确的目标时间或系统更改号(SCN)。
如果没有,可以再次闪回数据库,或者通过执行恢复操作来前滚数据库。因此,要撤销闪回数据库操作,必须向前恢复数据库。
闪回数据库操作完成后,必须使用以下一种方法打开数据库:
· 在只读模式下验证是否使用了正确的目标时间或SCN
· 使用RESETLOGS 参数才允许进行更新
优点:
闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术。使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间。
当闪回技术使用时,它与介质恢复相比,在易用性、可用性和还原时间方面有明显的优势。
闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其他所有功能都使用还原数据。
闪回数据库限制:(不能使用闪回数据库)
· 已还原或重新创建了控制文件
· 已删除了表空间
· 已收缩了数据文件
· Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择。
· 非归档模式
Flashback Database 相关的3个视图
V$database
这个视图可以查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
V$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少,
该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 系统定义的策略
Estimated_flashback_size: 根据策略对需要的空间大小的估计值
SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
from v$flashback_database_log;
V$flashback_database_stat
这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。
这个视图以小时为单位记录单位时间内数据库的活动量:
Flashback_Data 代表Flashback log产生数量,
DB_Date 代表数据改变数量,
Redo_Date代表日志数量,
通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求
恢复区的使用情况
v$recovery_area_usage
selecct * from v$recovery_area_usage;
复原点是手动创建的一个时间点,数据库可以闪回到创建的该复原点。
普通复原点:只是在闪回或恢复操作中为指定以前的SCN或时间点提供方便。但不保证数据库在所有情形下都保留成功执行闪回数据库操作所需的闪回数据库日志。
创建普通复原点:CREATE RESTORE POINT weisi_point;
有保证的复原点:保证可以把数据库倒退到由复原点指定的SCN或时间点.
创建有保证的复原点:CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE;
删除复原点:DROP RESTORE POINT point_name;
DROP RESTORE POINT weisi_point;
查看复原点:v$restore_point视图
创建复原点注意事项:
1.创建复原点必须打开归档模式
2.创建复原点可以不打开闪回
3.创建复原点若闪回没打开数据库需为装载状态
SQL> CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE;
CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE
第 1 行出现错误:
ORA-38784: 无法创建还原点 'weisi_STOREPOINT'。
ORA-38787: 在闪回数据库处于关闭状态时, 创建第一个可靠还原点需要装载模式。
4.创建了复原点后,数据库的闪回由原来的no状态变成了RESTORE POINT ONLY
SQL> CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE;
还原点已创建。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY
利用复原点闪回数据库:
FLASHBACK DATABASE TO RESTORE POINT weisi_storepoint;
2: 闪回DROP
用于恢复用户误删除的对象(包括表,索引等),
这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。
Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。
故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。
Flashback Drop 是基于Tablespace RecycleBin 来实现恢复的。
2.1)回收查看回收站是否开启:初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。
show parameter recyclebin
2.2) 开启、关闭回收站
ALTER SYSTEM SET recyclebin = ON;
ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = OFF;
ALTER SESSION SET recyclebin = OFF;
2.3)回收站内容
show recyclebin;
SELECT * FROM RECYCLEBIN;
SELECT * FROM USER_RECYCLEBIN;
SELECT * FROM DBA_RECYCLEBIN;
2.4)清空回收站
dba_recyclebin;
purge recyclebin;
purge table weisi
purge index weisi_index
2.5) 恢复回收站的表
create table weisi_t as select * from dba_objects where rownum<100;
select count(1) from user_recyclebin;
drop table weisi_t;
FLASHBACK TABLE weisi_t TO BEFORE DROP RENAME TO weisi_t_recovery ;
show recyclebin;
Flashback Drop 需要注意的地方:
1). 只能用于非系统表空间和本地管理的表空间
2). 对象能否恢复成功,取决与对象空间是否被覆盖重用。
3). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,
因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,
3 闪回表:恢复表到过去的某一时刻
注意:SYS用户不支持闪回,Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。
如果想要对表进行flashback,必须允许表的row movement.
alter table table_name enable row movement;
alter table t_1 disable row movement;
select TABLE_NAME,row_movement from user_tables;
create table t_1 as select * from dba_objects;
select count(1) from t_1;
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
3219028
delete t_1 where object_id < 88;
alter table t_1 enable row movement;
flashback table t_1 to scn 3219028
flashback table weisi.t_1 to timestamp to_timestamp
select count(1) from weisi.t_1;
select count(1) from weisi.t_1 AS OF SCN 2645656;
-- 授予weisi用户使用dbms_flashback包权限
grant execute on dbms_flashback to weisi;
select * from user_sys_privs;
select * from dba_tab_privs where grantee='WEISI'
truncate table:
select count(1) from t_1;
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
2591903
truncate table t_1;
select count(1) from t_1 as of scn 2591903;
flashback table t_1 to scn 2591903;
drop table
select count(1) from t_1;
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
2592399
select count(1) from t_1 as of scn 2592399;
flashback table t_1 to scn 2591903;
总结 基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,
包括:drop、modify 列, move 表, truncate table/partition,drop table 等
这些操作会令undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query
会触发ORA-01466 错误。基于undo 的表恢复,flashback table 实际上做的也是dml 操作
4:闪回查询:Flashback Query
实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,
或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。
可以使用SCN 或者timestamp
SCN 与 timestamp 关系: Oracle 在内部都是使用scn,即使你指定的是as of timestamp,oracle 也会将其转换成scn,
系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME
一个SCN值,可能对应一段时间。
select timestamp_to_scn(to_date('2016-05-06 22:24:02','YYYY-MM-DD HH24:MI:SS')) from dual;
select timestamp_to_scn(to_date('2016-05-06 22:24:03','YYYY-MM-DD HH24:MI:SS')) from dual;
Flashback Query:Flashback Query,Flashback Version Query,Flashback Transaction Query
4.1 Flashback Query
Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据。
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
22313644
22313692
create table wzx_t(name varchar2(20));
insert into wzx_t values('wu');
insert into wzx_t values('zhen');
insert into wzx_t values('xing');
insert into wzx_t values('ni');
insert into wzx_t values('hao');
alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
select sysdate from dual;
2018-08-26 10:53:27
delete wzx_t;
查看过去的数据:
select * from wzx_t as of timestamp sysdate-2/1440;
select * from wzx_t as of timestamp to_timestamp('2018-08-26 10:53:27','YYYY-MM-DD hh24:mi:ss');
select * from wzx_t as of scn 2651095
插入过去数据:
Insert into wzx_t select * from wzx_t as of timestamp to_timestamp('2018-08-26 10:53:27','YYYY-MM-DD hh24:mi:ss');
commit;
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)
from dual;
2593187
delete wzx_t;
select * from wzx_t as of scn 2593187;
insert into wzx_t select * from wzx_t as of scn 2593187;
注意:flashback query 对v$tables,x$tables 等动态性能视图无效,dba_*,all_*,user_*等 数据字典是有效的。
该特性也完全支持访问远端数据库,比如select * from t_1@dblink as of scn 5800。
4.2 Flashback version Query
相对于Flashback Query 只能看到某一点的对象状态,Flashback Version Query可以看到过去某个时间段内,
记录是如何发生变化的。 根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。
伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,
但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。
最熟悉的伪列就是 ROWID, 它相当于一个指针,指向记录在磁盘上的位置。
ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被修改时的SCN。
Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。
语法如下:
SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end} --start,end可以是时间也可以是scn
Flashback Version Query伪列说明
versions_start{scn|time} 版本开始的scn或时间戳
versions_end{scn|time} 版本结束scn或时间戳,如果有值表明此行后面被更改过是旧版本,如果为null,则说明行版本是当前版本或行被删除(即versions_operation值为D)。
versions_xid 创建行版本的事务ID
versions_operation 在行上执行的操作(I=插入,D=删除,U=更新)
create table wzx_t(name varchar2(100)) ;
insert into wzx_t values('weisi');
insert into wzx_t values('abc');
insert into wzx_t values('fdss');
select ora_rowscn, name from wzx_t;
Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,
'I','Insert',
'U','Update',
'D','Delete', 'Original') "Operation",
name
from wzx_t versions between scn 22313673 and 22313806;
22313644
22313692
create table wzx_t(name varchar2(20));
insert into wzx_t values('wu');
insert into wzx_t values('zhen');
insert into wzx_t values('xing');
insert into wzx_t values('ni');
insert into wzx_t values('hao');
alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
select sysdate from dual;
Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,
'I','Insert',
'U','Update',
'D','Delete', 'Original') "Operation",
name
from wzx_t versions between scn minvalue and maxvalue;
Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,
'I','Insert',
'U','Update',
'D','Delete', 'Original') "Operation",
name
from wzx_t versions between
timestamp to_timestamp('2016-05-07 07:00:37','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2016-05-07 07:07:29','YYYY-MM-DD HH24:MI:SS');
4.3 Flashback Transaction Query(开启ORALCE 附加日志)
Flashback Transaction Query也是使用UNDO信息来实现。
利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,
这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。
grant select any transaction to zhenxing;
GRANT SELECT ON flashback_transaction_query TO zhenxing;--直接赋予该表的select权限还是无法查询,提示权限不够
GRANT SELECT ANY TRANSACTION TO zhenxing;--必须授予ANY TRANSACTION才行
Flashback Transaction Query实际上是查询的数据字典flashback_transaction_query。可以根据flashback_transaction_query 的undo_sql列值返回数据以前版本。
flashback_transaction_query 列说明:
SQL> desc flashback_transaction_query
Name Null? Type
----------------------------------------- -------- ----------------------------
XID RAW(8) --事务ID
START_SCN NUMBER --事务起始SCN,即第一个dml的SCN
START_TIMESTAMP DATE --事务其实时间戳,即第一个dm的时间戳
COMMIT_SCN NUMBER --提交事务时的SCN
COMMIT_TIMESTAMP DATE -- 提交事务时的时间戳
LOGON_USER VARCHAR2(30) --本次事务的用户
UNDO_CHANGE# NUMBER --撤销SCN
OPERATION VARCHAR2(32) --执行的dml操作:DELETE,INSERT,UPDATE,BEGIN,UNKNOWN
TABLE_NAME VARCHAR2(256) --dml更改的表
TABLE_OWNER VARCHAR2(32) --表的所有者
ROW_ID VARCHAR2(19) --修改行的ROWID
UNDO_SQL VARCHAR2(4000) --撤销dml的sql语句
Select xid,operation,commit_scn,undo_sql
from flashback_transaction_query
where xid in (Select versions_xid
from wzx_t versions between scn 22313673 and 22313806);
--创建表flashback_test
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
--插入三条记录
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
--执行删除操作
DELETE FROM flashback_test WHERE a='d1';
commit;
Select xid,operation,commit_scn,undo_sql
from flashback_transaction_query
where xid in (Select versions_xid
from flashback_test versions between scn minvalue and maxvalue);
5:Oracle Flashback Data Archive
Oracle 11g推出一个新特性:Oracle Flashback Data Archive.
该技术与之前的Flashback的实现机制不同,
通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,
这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。
并且可以根据需要指定哪些数据库对象需要保存历史变化数据,
而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。
Flashback Data Archive并不是记录数据库的所有变化,而只是记录了指定表的数据变化。
所以,Flashback Data Archive是针对对象的保护,是Flashback Database的有力补充。
5.1)闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,
可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。
每一个闪回数据归档区都可以有一个唯一的名称。同时,
每一个闪回数据归档区都对应了一定的数据保留策略。
闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,
这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。
select * from dba_FLASHBACK_ARCHIVE;
select * from dba_FLASHBACK_ARCHIVE_TS;
select * from dba_FLASHBACK_ARCHIVE_TABLES;
5.2) Flashback archive的后台进程
Oracle11g为Flashback data archive特性专门引入了一个新的后台进程FBDA,
用于将追踪表(traced table,也就是将指定使用flashback data archive的table)
的历史变化数据转存到闪回归档区。
5.3) Flashback archive 的限制条件
(1)Flashback data archive只能在ASSM的tablespace上创建
(2)Flashback data archive要求必须使用自动undo管理,即 undo_management 参数为auto
5.4) 创建FDA
create tablespace weisi_fda_tbs1 datafile '/opt/soft/fda/fda1.dbf' size 100M;
create tablespace weisi_fda_tbs2 datafile '/opt/soft/fda/fda2.dbf' size 100M;
创建一个默认的Flashback Archive,数据保留期为1个月
create flashback archive default fla1 tablespace weisi_fda_tbs1 retention 1 month;
create flashback archive fla2 tablespace weisi_fda_tbs2 retention 10 day;
ALTER FLASHBACK ARCHIVE FLA2 SET DEFAULT;
ALTER FLASHBACK ARCHIVE FLA1 ADD TABLESPACE TBS_DATA2;
ALTER FLASHBACK ARCHIVE FLA1 REMOVE TABLESPACE TBS_DATA2;
ALTER FLASHBACK ARCHIVE FLA1 MODIFY RETENTION 1 MONTH;
ALTER FLASHBACK ARCHIVE FLA1 PURGE ALL;
ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
DROP FLASHBACK ARCHIVE FLA2;
5.5) 使用闪回数据归档
闪回数据归档区创建完成以后,就可以指定特定的表,使其对应到特定的数据归档区。把表指定到对应的数据归档区有两种方法,
一是在创建的时候直接指定归档区,一种是对现有的表指定一个归档区。
注意,如果不指定归档区的名称,则指定到默认归档区,否则,就属于指定的数据归档区。
grant flashback archive on fla1 to weisi;
grant flashback archive on fla2 to weisi;
grant flashback archive administer to weisi_huif;
1)create table wzx_date(a int) flashback archive;
2)alter table wzx_t flashback archive ;
3)alter table wzx_t no flashback archive;
4) alter table wzx_t no flashback archive fla2;
insert into wzx_date values(1);
insert into wzx_date values(2);
insert into wzx_date values(3);
insert into wzx_date values(4);
insert into wzx_date values(5);
delete wzx_date where a=1;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;
insert into wzx_date values(11);
insert into wzx_date values(22);
insert into wzx_date values(33);
insert into wzx_date values(44);
insert into wzx_date values(55);
set autotrace on
select * from wzx_date as of timestamp to_timestamp('2016-05-07 00:57:14', 'yyyy-mm-dd hh24:mi:ss');
select * from weisi.wzx_date as of timestamp to_timestamp('2016-05-07 00:57:14', 'yyyy-mm-dd hh24:mi:ss');
alter table wzx_t add id int;
5.6) FBDA会产生两个内部表
对某一个表使用FBDA后,我们可以根据视图dba_flashback_archive_tables找出其中一个内部表SYS_FBA_HIST_XXX。
当然我们知道他是用来存储所有的在这个表上发生过的数据变化。
但我又发现了其实还有另一个内部表也被使用,这个表叫做SYS_FBA_TCRV_XXX。
SYS_FBA_HIST_XXX是存放发生过的transaction的数据更改的前镜像。
SYS_FBA_TCRV_XXX则是存放transaction的信息。
FBDA只记录update和delete,不会记录insert到SYS_FBA_HIST_XXX.
select table_name,FLASHBACK_ARCHIVE_NAME,ARCHIVE_TABLE_NAME from dba_flashback_archive_tables;
动Flashback Data Archive的表支持以下的DDL 操作
(1)ALTER TABLE statement that does any of the following:
1)Adds, drops, renames, or modifies a column
2)Adds, drops, or renames a constraint
3)Drops or truncates a partition
or subpartition operation
(4)TRUNCATE TABLE statement
(5)RENAME statement that renames a table
-- 启动Flashback Data Archive的表上的一些DDL 操作可能触发ORA-55610的错误,
这些DDL 如下:
(1)ALTER TABLE statement that moves or exchanges a partition
or subpartition operation
(2)DROP TABLE statement