一、Flashback Version Query(闪回版本查询)
闪回版本查询指的是Oracle可以针对特定的对象来查询某一特定段内该对象的变化的所有情况,可以对此跟踪该对象的变更情况。也可以根据特定的需要来将该对象修正到特定的时刻。闪回版本查询同闪回查询,闪回表一样,同样是使用了UNDO段的数据,即数据变更的多次镜像,当UNDO段的数据由于空间压力而被清除,则产生无法闪回的情况。
SQL> select emp.*,versions_xid xid,versions_startscn v_stcn,versions_endscn v_edcn,versions_operation v_ops from emp versions between scn minvalue and maxvalue where empno=7788 order by v_stcn;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO XID V_STCN V_EDCN V
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ---------------- ---------- ---------- -
7788 SCOTT ANALYST 7566 19-4月 -87 9000 20 0A001C00EE070000 5406497 5406520 U
7788 SCOTT ANALYST 7566 19-4月 -87 8888 20 0A001700F0070000 5406520 5406524 U
7788 SCOTT ANALYST 7566 19-4月 -87 7777 20 0600100086080000 5406524 5406552 U
7788 SCOTT ANALYST 7566 19-4月 -87 7777 20 010002000E080000 5406552 D
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20 5406497
SQL> select scn_to_timestamp('5406497') from dual;
SCN_TO_TIMESTAMP('5406497')
---------------------------------------------------------------------------
20-8月 -15 02.19.58.000000000 下午
select empno,ename,job,versions_xid xid,versions_startscn v_stcn,versions_endscn v_edcn,versions_operation v_ops
from tb1 versions between timestamp to_timestamp(systimestamp-1/24) and systimestamp where empno=7788;
二、Flashback Transaction Query(闪回事务查询)
闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的查询,如针对特定的记录。而闪回事务则是针对某一事务进行闪回,是基于事务级别的。闪回事务查询通过查询视图flashback_transaction_query来获得某个或多个特定事务信息,同时可以根据该视图中提供的undo_sql 列中的语句来反转事务,从而保证数据的完整性。
查询该视图需要具有select any transaction权限,默认情况下sys用户和DBA角色具有该权限
SQL> select emp.*,versions_xid,versions_operation from emp versions between scn minvalue and maxvalue where empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO VERSIONS_XID V
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ---------------- -
7788 SCOTT ANALYST 7566 19-4月 -87 7777 20 010002000E080000 D
7788 SCOTT ANALYST 7566 19-4月 -87 7777 20 0600100086080000 U
7788 SCOTT ANALYST 7566 19-4月 -87 8888 20 0A001700F0070000 U
7788 SCOTT ANALYST 7566 19-4月 -87 9000 20 0A001C00EE070000 U
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
查出需要闪回的VERSIONS_XID,然后根据VERSIONS_XID生成语句:
select operation,undo_sql from flashback_transaction_query where xid=hextoraw('02002000BC080000');
闪回中不能对DDL语句进行闪回,即闪回仅仅支持DML语句
其他:
SQL> select * from emp as of timestamp to_timestamp('2011-11-11 22:22:22','yyyy-mm-dd hh24:mi:ss');
SQL> select * from emp as of timestamp to_timestamp('2011-11-11 22:22:22','yyyy-mm-dd hh24:mi:ss')
minus select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
SQL> flashback table emp to scn 888888888
SQL> flashback table emp to timestamp to_timestamp('2011-11-11 22:22:22','yyyy-mm-dd hh24:mi:ss')
三、flashbackup Drop
SQL> select object_name,original_name,can_undrop,base_object from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME CAN BASE_OBJECT
------------------------------ -------------------------------- --- -----------
BIN$R+7H89/oTnGvqmWpAFZaSA==$0 PK_EMP NO 73196
BIN$N3axp9c7R1quSwqwIzgecw==$0 EMPL YES 73196
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMPL BIN$N3axp9c7R1quSwqwIzgecw==$0 TABLE 2010-08-20:14:49:41
SQL> flashback table empl to before drop;
SQL> select index_name,index_type from user_indexes where table_name='EMPL'
union all
select constraint_name,constraint_type from user_constraints where table_name='EMPL';
INDEX_NAME INDEX_TYPE
------------------------------ ---------------------------
BIN$v8gKmZi5Quqlm6N3VAZSBQ==$0 P
此时,索引名称仍然为回收站里的名称,需要手工恢复:
SQL> alter index "BIN$v8gKmZi5Quqlm6N3VAZSBQ==$0" rename to PK_EMP;
SQL> select index_name,index_type from user_indexes where table_name='EMPL'
union all
select constraint_name,constraint_type from user_constraints where table_name='EMPL';
INDEX_NAME INDEX_TYPE
------------------------------ ---------------------------
PK_EMP NORMAL
注意:当表空间不足时,回收站里的表会被删除。flashback drop 不能闪回truncate命令截断的表,而是只能恢复drop 之后的表。不能闪回drop user scott cascade删除方案的操作,此只能用flashback database,在system表空间中存储的表无法启用flashback drop,且这些表会被立即删除
四、flashback database
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等。
flashback data1base闪回到过去的某一时刻,闪回点之后的工作全部丢失,使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点)
常用的场景:truncate table、多表发生意外错误等
flashback database的组成:
闪回缓冲区:当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配
启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。
flashback database的配置:
1、flashback database要求数据库必须处于归档模式,且闪回之后必须使用resetlogs打开数据库
2、需设置db_recovery_file_dest、db_recovery_file_dest_size
3、需设置db_flashback_retention_target
4、需在mount下启用:
SQL> startup mount exclusive;
SQL> alter database flashback on;
查看闪回区配置
SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim,retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz,estimated_flashback_size/1024/1024 est_flhbck_size from v$flashback_database_log;
SQL> shutdown immeidate;
SQL> statup mount;
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 888888;
SQL> flashback database ro restore point b1_load;
SQL> alter database open resetlogs;
可以针对表空间是否闪回进行设置:
SQL> alter tablespace users flashback off;