首先要明确闪回是一类技术,有非常多种类型。
一、闪回数据库:
闪回数据库应用场景:
数据库做压力测试,测试完毕闪回无用数据。
应用上线,前灰度测试,如果出现大问题直接闪回。
闪回数据库:
开启归档:
mkdir /home/oracle/arch
SQL> alter system set log_archive_dest_1='location=/home/oracle/arch';
SQL> startup mount force
SQL> alter database archivelog;
SQL> archive log list;
SQL> alter database open;
设置闪回区:
SQL> show parameter recover;
SQL> show parameter db_flash;
SQL> alter system set db_recovery_file_dest_size=2G;
mkdir /home/oracle/flash
SQL> alter system set db_recovery_file_dest='/home/oracle/flash';
数据库开启闪回功能:
SQL> alter database flashback on;
闪回数据库:
闪回数据库需要在mount阶段:
1、基于scn号闪回:
需要删除之前有记录scn号:SQL> select current_scn from v$database;
SQL> flashback database to scn 322232;
2、基于时间点:
FLASHBACK DATABASE TO TIMESTAMP(TO_DATE('2017-06-8 22:30:00', 'YYYY-MM-DD HH24:MI:SS'));
3、普通还原点:
SQL> create restore point app03_20170617;
SQL> flashback database to restore point app03_20170617;
4、可靠还原点:
SQL> create restore point app03 guarantee flashback database;
SQL> FLASHBACK DATABASE TO RESTORE point app03;
关闭闪回:
SQL>alter database flashback off;
二、闪回表(基于回收站的)
回收站是基于用户的
回收站使用的空间是:用户默认使用的表空间
当用户表空间不足的时候,创建表(等)会删除回收站的内容(将段的使用从永久变成可调整)
删除表,其实是把表改名放入回收站
sys对象不进入回收站
闪回表:
查看回收站:
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$UXTqW8AoJeTgUKjAb2QnEg==$0 TABLE 2017-06-08:22:46:18
执行闪回表:
SQL> flashback table "BIN$UXTqW8AoJeTgUKjAb2QnEg==$0" to before drop;
#.....to before drop rename to new_test; 可以闪回时更改名字
查看回收站:
SQL> show recyclebin;
三、闪回表(闪回查询)
闪回查询:
select * from emp AS OF timestamp to_date('2017-06-08 22:56:20','yyyy-mm-dd hh24:mi:ss') where department_id=100;
闪回:
flashback table emp to timestamp to_date('2017-06-08 22:56:20','yyyy-mm-dd hh24:mi:ss');
闪回表稳妥做法:
利用闪回查询 查询删除前的状态,然后insert回原来表里
对于truncate的表,除了flashback database之外,其它的flashback功能可能帮不了你)
四、闪回版本查询:
flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录。
比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,
但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。
如果我们利用flash table或者是flash query,我们也只能是看到过去的某一个快照而已,利用flashback version query,我们将找到其中的任何变化:
select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAME
from t1 versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME;
当然,除了分析以上所有的变更之外,我们可以指定时间段,如
select ID,NAME
from test versions between timestamp
to_date('20014-04-07 24:34:04','yyyy-mm-dd hh24:mi:ss')
and to_date('20014-04-27 04:34:50','yyyy-mm-dd hh24:mi:ss');
还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:
select versions_starttime, versions_endtime
from test versions
between scn 1000 and 1001
五、闪回事务查询:
Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog。
示例:
a、打开数据库补充日志:
sql>alter database add supplemental log data;
b、打开主键补充日志:
sql>alter database add supplemental log data (primary key) columns;
c、直接使用sqlplus执行命令比较复杂,使用oem操作吧:
打开em----Availability----->Perform Recovery---->