一、闪回
1.可能的误操作
(1)错误的删除了记录
(2)错误的删除了表
(3)查询历史记录
(4)撤销已经提交了的事务。
2.对应着以上四种类型的误操作,有四种闪回类型
(1)闪回表:将表回退到过去的一个时间上
(2)闪回删除:还原Oracle回收站
(3)闪回版本查询:所有历史记录
(4)闪回事务查询:通过一个select 语句得到一个undo_sql,通过该undo_sql闪回
3.事实上oracle数据库还有另外两种闪回类型
(5)闪回数据库
(6)闪回归档日志
4.系统改变号:由时间戳通过某种算法得到的一个整数,该整数唯一的确认了某个时间,通常通过该整数进行闪回操作。使用的函数:timestamp_to_scn
select to_char(systimestamp,‘yyyy-mm-dd hh24:mi:ss*ff‘) 时间,timestamp_to_scn(systimestamp) SCN from dual;
5.闪回是有空间限制的,比如系统缓冲区大小为2GB,如果超出了这个大小,如果在15分钟之内还是可以进行闪回的,查看该参数命令(管理员才有权限查看)
show parameters undo
其中900的单位是S,所以为15分钟,该值能够修改(管理员):
alter system set undo_retention=1200 scope=both
二、闪回表
1.普通用户闪回表需要拥有的权限
拥有flashback any table的权限:管理员授予权限
grant flashback any table to scott;
2.表需要开启的功能:行移动
alter table flashback_table enable row movement;
3.闪回表步骤:
(1)准备测试:创建表flashback_table,准备数据,注意最后提交。
create table flashback_table ( tid number, tname varchar(10) ); insert into flashback_table values(&tid,‘&tname‘);--插入三条数据commit;
(2)查询当前的时间和SCN号
select to_char(systimestamp,‘yyyy-mm-dd hh24:mi:ss*ff‘) 时间,timestamp_to_scn(systimestamp) SCN from dual;
(3)删除第二条记录
delete from flashback_table where tid=2; commit;
(4)闪回表到(2)中的SCN处
flashback table flashback_table to scn 1569572;
(5)验证闪回
(6)屏幕录制
1 SQL> create table flashback_table ( 2 2 tid number,tname varchar(10)); 3 4 表已创建。 5 6 SQL> edit 7 已写入 file afiedt.buf 8 9 1 create table flashback_table ( 10 2* tid number,tname varchar(10)) 11 SQL> 12 SQL> 13 SQL> insert into flashback_table values(&tid,‘&tname‘); 14 输入 tid 的值: 1 15 输入 tname 的值: 小明 16 原值 1: insert into flashback_table values(&tid,‘&tname‘) 17 新值 1: insert into flashback_table values(1,‘小明‘) 18 19 已创建 1 行。 20 21 SQL> 、 22 SP2-0042: 未知命令 "、" - 其余行忽略。 23 SQL> / 24 输入 tid 的值: 2 25 输入 tname 的值: 小张 26 原值 1: insert into flashback_table values(&tid,‘&tname‘) 27 新值 1: insert into flashback_table values(2,‘小张‘) 28 29 已创建 1 行。 30 31 SQL> / 32 输入 tid 的值: 3 33 输入 tname 的值: 小强 34 原值 1: insert into flashback_table values(&tid,‘&tname‘) 35 新值 1: insert into flashback_table values(3,‘小强‘) 36 37 已创建 1 行。 38 39 SQL> edit 40 已写入 file afiedt.buf 41 42 1* insert into flashback_table values(&tid,‘&tname‘) 43 SQL> 44 SQL> 45 SQL> select * from flashback_table; 46 47 TID TNAME 48 ---------- -------------------- 49 1 小明 50 2 小张 51 3 小强 52 53 SQL> commit 54 2 ; 55 56 提交完成。 57 58 SQL> select to_char(systimestamp,‘yyyy-mm-dd hh24:mi:ss*ff‘) 时间,timestamp_to_scn(systimestamp) SCN; 59 select to_char(systimestamp,‘yyyy-mm-dd hh24:mi:ss*ff‘) 时间,timestamp_to_scn(systimestamp) SCN 60 * 61 第 1 行出现错误: 62 ORA-00923: 未找到要求的 FROM 关键字 63 64 65 SQL> select to_char(systimestamp,‘yyyy-mm-dd hh24:mi:ss*ff‘) 时间,timestamp_to_scn(systimestamp) SCN from dual; 66 67 时间 SCN 68 ---------------------------------------------------------- ---------- 69 2015-08-25 11:01:03*597000 1569572 70 71 SQL> delete from flashback_table where tid=2; 72 73 已删除 1 行。 74 SQL> commit 75 2 ; 76 77 提交完成。 78 79 80 SQL> select * from flashback_table; 81 82 TID TNAME 83 ---------- -------------------- 84 1 小明 85 3 小强 86 87 SQL> flashback table flashback_table to scn 1569572; 88 flashback table flashback_table to scn 1569572 89 * 90 第 1 行出现错误: 91 ORA-08189: 因为未启用行移动功能, 不能闪回表 92 93 94 SQL> alter table flashback_table enabel row movement; 95 alter table flashback_table enabel row movement 96 * 97 第 1 行出现错误: 98 ORA-01735: 无效的 ALTER TABLE 选项 99 100 101 SQL> alter table flashback_table enable row movement; 102 103 表已更改。 104 105 SQL> 106 SQL> 107 SQL> 108 SQL> 109 SQL> 110 SQL> flashback table flashback_table to scn 1569572; 111 112 闪回完成。 113 114 SQL> select * from flashback_table; 115 116 TID TNAME 117 ---------- -------------------- 118 1 小明 119 2 小张 120 3 小强 121 122 SQL>
屏幕录制
4.疑问:怎样获取历史记录(以上演示方法在现实生产环境中不可能被使用)
二、闪回删除
1.普通用户有回收站,但是管理员并没有回收站,所以不要使用管理员账户对表进行增删查该操作。管理员只用于管理。
2.普通用户删除表之后(不使用purge命令),表会进入回收站,闪回删除的目的就是将回收站中的表恢复到删除之前的状态。
3.进入到回收站中的表名可以相同,但是回收站会为每个表进行唯一的标识,即recyclebin name
4.普通用户通过select * from tab可以看到回收站中的表。
可以查看每个表中的内容,但是表名要加上双引号。
5.如果回收站中的两个表在删除前表名相同,则如果闪回成功,先闪回先进入回收站中的表。
6.模板代码
flashback table [schema.]table_name[,...n] to {[scn] | [timestamp] [[enable | disable] triggers]};
如果想要闪回触发器,则使用enable triggers,默认不闪回触发器。
7.闪回删除的步骤
(1)如果没有表名冲突,则使用下面的命令就可以了。
flashback table test to before drop;
(2)如果有表名冲突,先闪回先进入回收站中的表。
(3)如果当前用户下已经有了一张和回收站中同名的表,则如果不采取重命名的手段,就不能闪回。
(4)闪回重命名
flashback table test to before drop rename to test1;
三、闪回版本查询
1.