一 flashback的相关类型
1.FLASHBACK QUERY
闪回查询:用到数据库的UNDO表空间,其特性有UNDO表空间的特性
2.FLASHBACK TABLE
闪回表:也是用到了UNDO表空间,其特性有UNDO表空间的特性
3.FLASHBACK DROP
闪回删除的表
4.FLASHBACK ARCHIVE
闪回归档 --待续
5.FLASHBACK DATABASE
闪回数据库
6.FLASHBACK TRANSACTION QUERY
二 FLASHBACK QUERY
1.需要数据库开启的条件
SYS @ ocpdb2 > select dbid,name,log_mode,flashback_on from v$database;
DBID NAME LOG_MODE FLASHBACK_ON
---------- --------------------------- ------------------------------------ ------------------------------------------------------
1014051930 OCPDB2 NOARCHIVELOG NO
--看到此时数据库没有开启归档也没有开启闪回功能
--创建表T
SYS @ ocpdb2 > create table t as select * from all_objects;
Table created.
--查询当前SCN号
SQL> select NAME,CURRENT_SCN from v$database;
NAME CURRENT_SCN
--------- -----------
OCPDB2 815596
--查询当前时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2016-03-21 21:41:00
--查询当前表的数据
SQL> select count(*) from t;
COUNT(*)
----------
70962
------此时删除表中数据
SQL> delete from t;
70962 rows deleted
SQL> commit;
Commit complete
SQL> select count(*) from t;
COUNT(*)
----------
0
---------
--查询之前记录的SCN号,此时如果SCN号在创建T之前回报错的 ORA-01466:
SQL> select count(*) from t as of scn 815596;
COUNT(*)
----------
70962
SQL> select count(*) from t as of timestamp to_date('2016-03-21 21:41:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
70962
---此时可以查看到某一时间点或者SCN号的数据情况
------------------------------------
下边继续
----
SQL> select NAME,CURRENT_SCN from v$database;
NAME CURRENT_SCN
--------- -----------
OCPDB2 816974
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2016-03-21 21:49:13
SQL> insert into t select * from all_objects where rownum<=100;
100 rows inserted
SQL> commit;
Commit complete
SQL> select NAME,CURRENT_SCN from v$database;
NAME CURRENT_SCN
--------- -----------
OCPDB2 817034
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2016-03-21 21:50:04
SQL> delete from t;
100 rows deleted
SQL> commit;
Commit complete
SQL> select count(*) from t versions between scn 815596 and 817034;
COUNT(*)
----------
142024
----- 142024=70962 + 70962 + 100
SQL> select 70962 + 70962 + 100 from dual;
70962+70962+100
-------------------
142024
SQL> select NAME,CURRENT_SCN from v$database;
NAME CURRENT_SCN
--------- -----------
OCPDB2 822186
SQL> select count(*) from t versions between scn 815596 and 822186;
COUNT(*)
----------
142124
----- 142024=70962 + 70962 + 100 + 100
--可以看出使用范围闪回查询会把原数据与更新或者删除的记录都查询出来
/*
从上边的数据库当前状态可以看出数据库当前没有开启归档也没有开启闪回功能,数据库是如何实现闪回查询的功能呢
使用的是UNDO表空间的历史快照进行的查询,所以这个闪回查询会有所有的UNDO表空间的一些特性,数据可覆盖,如果此历史数据被覆盖或者清空那么将无法查询
UNDO_RETENTION参数
会不会有快照过旧这个错误呢?
*/
二 FLASHBACK TABLE 闪回表
--闪回表需要开启表的行迁移
SQL> alter table t enable row movement;--一个现存的行允许改变其rowid(物理存储地址)
Table altered
SQL> flashback table t to scn 815596;
Done
SQL> select count(*) from t;
COUNT(*)
----------
70962
/*
这个区别与闪回查询的是表的数据被该变了。
*/
三 闪回DROP的表
其原理是利用回收站,所以回收站要开启才能使用该功能,该闪回有回收站的特性。
在SYSTEM表空间的对象删除后不会在回收站中存在,所以在system表空间DROP的表是不能恢复的!
SQL> create table t as select * from all_objects ;
Table created
SQL> drop table t;
Table dropped
SQL> flashback table t to before drop;
Done
SQL> select count(*) from t;
COUNT(*)
----------
70936
四 FLASHBACK ARCHIVE
(1)Flashback data archive只能在ASSM的tablespace上创建
(2)Flashback data archive要求必须使用自动undo管理,即 undo_management 参数为auto