Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为大家快速的恢复数据,查询历史数据提供了很大的便捷方法。
本文主要对Oracle常用闪回使用做些详细介绍,其中对于不常用的事务和版本闪回,这里就不做介绍
一、Oracle闪回概述
闪回级别 |
闪回场景 |
闪回技术 |
对象依赖 |
影响数据 |
数据库 |
表截断、逻辑错误、其他多表意外事件 |
闪回DATABASE |
闪回日志、undo |
是 |
DROP |
删除表 |
闪回DROP |
回收站(recyclebin) |
是 |
表 |
更新、删除、插入记录 |
闪回TABLE |
还原数据,undo |
是 |
查询 |
当前数据和历史数据对比 |
闪回QUERY |
还原数据,undo |
否 |
版本查询 |
比较行版本 |
闪回Version Query |
还原数据,undo |
否 |
事务查询 |
比较 |
闪回Transaction Query |
还原数据,undo |
否 |
归档 |
DDL、DML |
闪回Archive |
归档日志 |
是 |
|
|
|
|
|
二、Oracle闪回使用详解
1、闪回开启
(1)开启闪回必要条件
a.开启归档日志
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /home/U01/app/oracle/oradata/testdb/arch
Oldest online log sequence 844
Next log sequence to archive 846
Current log sequence 846
##如未开启,在mount状态执行alter database archivelog;
b.设置合理的闪回区
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟(1天),实际取决于闪回区大小
(2)检查是否开启闪回
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
(3)开启闪回
a.开启归档
mount状态:alter database archivelog;
b.设置闪回区
SQL> alter system set db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area' scope=both;
System altered.
SQL> alter system set db_recovery_file_dest_size=60G scope=both;
System altered.
SQL> alter system set db_flashback_retention_target=4320 scope=both;
System altered.
c.开启flashback (10g在mount开启)
SQL> alter database flashback on;
Database altered.
(4)确定闪回开启
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
(5)关闭闪回
SQL> alter database flashback off;
Database altered.
2、闪回使用
(1)闪回查询
闪回查询主要是根据Undo表空间数据进行多版本查询,针对v$和x$动态性能视图无效,但对DBA_、ALL_、USER_是有效的
a.闪回查询
允许用户查询过去某个时间点的数据,用以重构由于意外删除或更改的数据,数据不会变化。
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
SQL> delete from scott.dept where deptno=40;
row deleted.
SQL> commit;
Commit complete.
SQL> select * from scott.dept as of timestamp sysdate-10/1440;
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
SQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGN |