1、flashback query(使用UNDO)查询某个scn时该表的内容
SQL> select * from t1;
ID
----------
1
2
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
10517036
SQL> update t1 set id=11 where id=1;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from t1 as of scn 10517036; //查询之前scn时的值
ID
----------
1
2
ID
----------
1
2
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
10517036
SQL> update t1 set id=11 where id=1;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from t1 as of scn 10517036; //查询之前scn时的值
ID
----------
1
2
scn和时间戳的互相转换:
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
24-2月 -13 01.16.40.854000 上午 +08:00
SQL> select scn_to_timestamp(10517036) from dual;
SCN_TO_TIMESTAMP(10517036)
---------------------------------------------------------------------------
24-2月 -13 01.12.07.000000000 上午
SQL> select to_timestamp('24-2月 -13 01.12.07.000000000 上午') from dual; //把字符串类型转换为时间戳类型
TO_TIMESTAMP('24-2月-1301.12.07.000000000上午')
---------------------------------------------------------------------------
24-2月 -13 01.12.07.000000000 上午
SQL> select timestamp_to_scn(to_timestamp('24-2月 -13 01.12.07.000000000 上午')) from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP('24-2月-1301.12.07.000000000上午'))
-----------------------------------------------------------------
10517035
查询smon维护的最早scn
SQL> select min(scn) from sys.smon_scn_time ;
MIN(SCN)
----------
10681569
SQL> select scn_to_timestamp(10681579) from dual;
SCN_TO_TIMESTAMP(10681579)
---------------------------------------------------------------------------
27-2月 -13 03.33.58.000000000 下午
小于最早scn则无法进行运算
SQL> select scn_to_timestamp(10681559) from dual;
select scn_to_timestamp(10681559) from dual
*
第 1 行出现错误:
ORA-08181: 指定的编号不是有效的系统更改号
ORA-06512: 在 "SYS.SCN_TO_TIMESTAMP", line 1
SYSTIMESTAMP
---------------------------------------------------------------------------
24-2月 -13 01.16.40.854000 上午 +08:00
SQL> select scn_to_timestamp(10517036) from dual;
SCN_TO_TIMESTAMP(10517036)
---------------------------------------------------------------------------
24-2月 -13 01.12.07.000000000 上午
SQL> select to_timestamp('24-2月 -13 01.12.07.000000000 上午') from dual; //把字符串类型转换为时间戳类型
TO_TIMESTAMP('24-2月-1301.12.07.000000000上午')
---------------------------------------------------------------------------
24-2月 -13 01.12.07.000000000 上午
SQL> select timestamp_to_scn(to_timestamp('24-2月 -13 01.12.07.000000000 上午')) from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP('24-2月-1301.12.07.000000000上午'))
-----------------------------------------------------------------
10517035
查询smon维护的最早scn
SQL> select min(scn) from sys.smon_scn_time ;
MIN(SCN)
----------
10681569
SQL> select scn_to_timestamp(10681579) from dual;
SCN_TO_TIMESTAMP(10681579)
---------------------------------------------------------------------------
27-2月 -13 03.33.58.000000000 下午
小于最早scn则无法进行运算
SQL> select scn_to_timestamp(10681559) from dual;
select scn_to_timestamp(10681559) from dual
*
第 1 行出现错误:
ORA-08181: 指定的编号不是有效的系统更改号
ORA-06512: 在 "SYS.SCN_TO_TIMESTAMP", line 1
2、flashback
table(sys用户下的表不能用这个方式,利用UNDO。而闪回表内部实际是先delete再insert)闪回表到之前某个scn的状态
SQL> select * from t12;
OBJECT_ID NAME
---------- --------------------
234555 aaa
3 aaa
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
10518096
SQL> update t12 set name='bbb';
已更新2行。
SQL> commit;
提交完成。
SQL> flashback table t12 to scn 10518096;
flashback table t12 to scn 10518096
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表(因为闪回2个时间点,行位置可能被占用,存储位置可能发生变化)
SQL> select t12.*,rowid from t12;
OBJECT_ID NAME ROWID
---------- -------------------- ------------------
234555 bbb AAAXMiAAEAAAMFTAAA
3 bbb AAAXMiAAEAAAMFTAAB
是否允许行移动,查询dba_tables表中row_movement=DISABLED|ENABLE
SQL> alter table t12 enable row movement;
表已更改。
SQL> flashback table t12 to scn 10518096;
闪回完成。
SQL> select t12.*,rowid from t12;
OBJECT_ID NAME ROWID
---------- -------------------- ------------------
234555 aaa AAAXMiAAEAAAMFTAAC
3 aaa AAAXMiAAEAAAMFTAAD
OBJECT_ID NAME
---------- --------------------
234555 aaa
3 aaa
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
10518096
SQL> update t12 set name='bbb';
已更新2行。
SQL> commit;
提交完成。
SQL> flashback table t12 to scn 10518096;
flashback table t12 to scn 10518096
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表(因为闪回2个时间点,行位置可能被占用,存储位置可能发生变化)
SQL> select t12.*,rowid from t12;
OBJECT_ID NAME ROWID
---------- -------------------- ------------------
234555 bbb AAAXMiAAEAAAMFTAAA
3 bbb AAAXMiAAEAAAMFTAAB
是否允许行移动,查询dba_tables表中row_movement=DISABLED|ENABLE
SQL> alter table t12 enable row movement;
表已更改。
SQL> flashback table t12 to scn 10518096;
闪回完成。
SQL> select t12.*,rowid from t12;
OBJECT_ID NAME ROWID
---------- -------------------- ------------------
234555 aaa AAAXMiAAEAAAMFTAAC
3 aaa AAAXMiAAEAAAMFTAAD
3、flashback version
query(返回版本查询)
查询对此表做过哪些动作,versions_endscn有值,说明这个版本已经结束,数据表中已经没有该值
startscn是事务提交时的scn。startscn相同说明是一个事务中的操作。而且别绪事务已经提交才会有信息,未提交不会记录。
select
versions_startscn,versions_endscn,versions_xid,versions_operation,versions_starttime,versions_endtime,id,name
from scott.t1 versions between scn minvalue and maxvalue order by versions_startscn;
from scott.t1 versions between scn minvalue and maxvalue order by versions_startscn;
![](https://images0.cnblogs.com/blog/673050/201410/072203361554795.png)
![](https://images0.cnblogs.com/blog/673050/201410/072203374054510.png)
4、flashback transaction
query(闪回事务查询,使用undo)
SQL> conn scott/tiger
已连接。
SQL> create table t1 (id number,name varchar2(20));
表已创建。
SQL> insert into t1 values(1,'aaa');
已创建 1 行。
SQL> insert into t1 values(2,'aaa');
已创建 1 行。
SQL> commit;
提交完成。
已连接。
SQL> create table t1 (id number,name varchar2(20));
表已创建。
SQL> insert into t1 values(1,'aaa');
已创建 1 行。
SQL> insert into t1 values(2,'aaa');
已创建 1 行。
SQL> commit;
提交完成。
此时执行了错误事务,做了update:
SQL> update t1 set
name='bbb';
已更新2行。
SQL> commit;
提交完成。
已更新2行。
SQL> commit;
提交完成。
查询该事务的事务id,versions_xid:
![](https://images0.cnblogs.com/blog/673050/201410/072203381247896.png)
查询该事务的信息:
select * from flashback_transaction_query where
xid='0A00170079230000';
后面有个undo_sql,可以执行以恢复
5、flashback drop(system表空间的无法闪回)
10g以后drop只是改名重新放入回收站,清除数据字典
SQL> create table
t_recycle (id number) tablespace
users;
表已创建。
SQL> drop table t_recycle;
表已删除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T11 BIN$7lppGUw4Sb+BkxnXqIaQOw==$0 TABLE 2013-02-06:00:38:56
T11 BIN$3Ii282AMTjaGfNBlizJytg==$0 TABLE 2013-02-06:00:36:56
T_RECYCLE BIN$7C3WUnHsSEaw/49R0PlbUQ==$0 TABLE 2013-03-31:17:49:10
表已创建。
SQL> drop table t_recycle;
表已删除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T11 BIN$7lppGUw4Sb+BkxnXqIaQOw==$0 TABLE 2013-02-06:00:38:56
T11 BIN$3Ii282AMTjaGfNBlizJytg==$0 TABLE 2013-02-06:00:36:56
T_RECYCLE BIN$7C3WUnHsSEaw/49R0PlbUQ==$0 TABLE 2013-03-31:17:49:10
以上信息来自视图dba_recyclebin;
可以直接查询:select * from scott."BIN$7C3WUnHsSEaw/49R0PlbUQ==$0";
回收站不支持DDL DML操作,闪回需要闪回的操作:
SQL> flashback table "BIN$7C3WUnHsSEaw/49R0PlbUQ==$0" to before drop;
闪回完成。
闪回完成。
删除的表上如果有索引,删除闪回后索引也会被闪回,但是索引名字已经改变
是否允许闪回drop:
![](https://images0.cnblogs.com/blog/673050/201410/072203387331781.png)
6、flashback database(利用不完全恢复)
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
FLASHBACK_ON
------------------
NO
开启闪回数据库的2个条件:
a:开启归档
b:使用闪回区,用来存放闪回日志:
SQL> show parameter
db_recover
NAME TYPE VALUE
------------------------------------ ----------- --------------------------------
db_recovery_file_dest string D:appLenovofast_recovery_area
db_recovery_file_dest_size big integer 10000M
NAME TYPE VALUE
------------------------------------ ----------- --------------------------------
db_recovery_file_dest string D:appLenovofast_recovery_area
db_recovery_file_dest_size big integer 10000M
开启闪回数据库:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 627732480 bytes
Fixed Size 1386456 bytes
Variable Size 381683752 bytes
Database Buffers 239075328 bytes
Redo Buffers 5586944 bytes
数据库装载完毕。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 D:apparch
最早的联机日志序列 666
下一个存档日志序列 668
当前日志序列 668
SQL> show parameter db_recover
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:appLenovofast_recovery_area
db_recovery_file_dest_size big integer 10000M
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 627732480 bytes
Fixed Size 1386456 bytes
Variable Size 381683752 bytes
Database Buffers 239075328 bytes
Redo Buffers 5586944 bytes
数据库装载完毕。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 D:apparch
最早的联机日志序列 666
下一个存档日志序列 668
当前日志序列 668
SQL> show parameter db_recover
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:appLenovofast_recovery_area
db_recovery_file_dest_size big integer 10000M
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
这时系统出现闪回日志:
![](https://images0.cnblogs.com/blog/673050/201410/072203395151654.png)
闪回日志由RVWR进程写入:
![](https://images0.cnblogs.com/blog/673050/201410/072203399219711.png)
闪回日志可存放的最大时间,1440分钟,24小时。这个时间不是强制的,当闪回区满时,优先删除闪回日志:
SQL> show parameter
db_flashback
NAME TYPE VALUE
------------------------------------ ----------- ------
db_flashback_retention_target integer 1440
闪回库最早可闪回的scn点:NAME TYPE VALUE
------------------------------------ ----------- ------
db_flashback_retention_target integer 1440
SQL> select * from
v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBA RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- -------------- ---------------- -------------- ------------------------
13243422 31-3月 -13 1440 104857600 0
OLDEST_FLASHBACK_SCN OLDEST_FLASHBA RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- -------------- ---------------- -------------- ------------------------
13243422 31-3月 -13 1440 104857600 0
查看闪回状态:
flashback_data db_data
redo_data单位是字节,表示从begin_time至今产生的闪回日志、数据、redo的大小,可以粗略的估算闪回需要的时间和闪回的量
SQL> select * from
v$flashback_database_stat;
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------------- -------------- -------------- ---------- ---------- ------------------------
31-3月 -13 31-3月 -13 8101888 7086080 4808192 0
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------------- -------------- -------------- ---------- ---------- ------------------------
31-3月 -13 31-3月 -13 8101888 7086080 4808192 0
开始闪回数据库:
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
13246550
SQL> drop user scott cascade;
用户已删除。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 627732480 bytes
Fixed Size 1386456 bytes
Variable Size 381683752 bytes
Database Buffers 239075328 bytes
Redo Buffers 5586944 bytes
数据库装载完毕。
SQL> flashback database to scn 13246550;
闪回完成。
SQL> alter database open read only;
数据库已更改。
SQL> conn scott/tiger
已连接。
CURRENT_SCN
-----------
13246550
SQL> drop user scott cascade;
用户已删除。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 627732480 bytes
Fixed Size 1386456 bytes
Variable Size 381683752 bytes
Database Buffers 239075328 bytes
Redo Buffers 5586944 bytes
数据库装载完毕。
SQL> flashback database to scn 13246550;
闪回完成。
SQL> alter database open read only;
数据库已更改。
SQL> conn scott/tiger
已连接。
alter database open 要
resetlog
11g有个新的闪回表空间,不依赖undo