2013年(350)
分类: Oracle
2013-04-25 11:11:07
某些时候,我们要处理的表并不是被意外删除,而是被反复修改过多次,希望能回复到之前的某个时间点,通过前面的,你一定会说没问题啊,借助flashback query就可以,没错,flashback query确实可以,但flashback query只是查询出记录,如果想做恢复还需要写出相应的insert或update,也许还需要相当多的where条件做判断,一个不甚,可能恢复的数据就是错误的。老板又没在跟儿前站着,我们没必要在这个时刻用这种方式展示我们娴熟的指法,因此,我们需要更高效更严谨更简便的方式:flashback table tbname to scn/timestamp,助你达成梦想,详情请咨询,o错了,应该是详情请接着往下看。
Scn和timestamp的用法通过前面flashback query的学习大家应该都比较熟了,flashback table中指定scn或timestamp的用法与上相同,举个例子吧:
有数据如下:
JSSWEB> select *from jss_tb1;
ID VL
---------- --------------------
6 F
7 G
8 H
9 I
11 K
12 L
13 M
14 N
15 O
10 J
记录下当前系统scn(如果不知道确切的scn,恢复时只能通过时间,但正如前文中讲到的,时间并不精确,如果通过指定timestamp恢复的话,需要你清楚了解所做的操作大概是在什么时间)
JSSWEB> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
593480
我们对该表做些操作:
JSSWEB> update jss_tb1 set id=id+100 where id>10;
已更新5行。
JSSWEB> insert into jss_tb1 values (21,'Z');
已创建 1 行。
JSSWEB> delete jss_tb1 where id=8;
已删除 1 行。
JSSWEB> commit;
提交完成。
JSSWEB> select *from jss_tb1;
ID VL
---------- --------------------
21 Z
6 F
7 G
9 I
111 K
112 L
113 M
114 N
115 O
10 J
已选择10行。
这些都属于常规操作,如果最终发现这些操作都属于误操作,需要恢复回表最初的形式,借助flashback query当然可以实现:
JSSWEB> select *from jss_tb1 as of scn 593480;
ID VL
---------- --------------------
6 F
7 G
8 H
9 I
11 K
12 L
13 M
14 N
15 O
10 J
已选择10行。
查询能够写出来,就一定能将表更新回去,不过既使是针对我们测试时所做过的简单操作(添加、删除、修改),更新的语句就已经需要写的很复杂了,因为我们需要分别判断添加、删除、修改过的记录。
幸好,我们还有flashback table,因此我们只需要指定一个scn或timestamp即可。
JSSWEB> flashback table jss_tb1 to scn 593480;
完成。
JSSWEB> select *from jss_tb1;
ID VL
---------- --------------------
6 F
7 G
8 H
9 I
11 K
12 L
13 M
14 N
15 O
10 J
已选择10行。
所有记录均已回复到指定scn时的状态。
===================================