关于对Orcale数据库的闪回操作

关于对Orcale数据库的闪回操作

使用Orcale数据库默认的是开启事务的。你进行insert,update,delete操作只要没有commit,就可以通过rollback来回退回去。
但如果你已经commit了呢?该怎么样让数据恢复呢?

传统的方法是用数据库备份,但缺点是你必须得恢复整个表或者整个数据库。假如你只想恢复一天记录,用备份就太得不偿失了。
Orcale
提供了闪回技术,可以对单条记录进行恢复和对删除的某张表进行恢复,以及对某个事务进行恢复。

闪回有两个限制,一个是空间上限制的默认是2G,一个是时间上限制的默认是900秒。
这个设置是的意思是,操作的数据在2G内才能被闪回,如果超过了2G就必须在900秒内执行闪回。否则数据就不能被闪回。

你可以通过命令来修改这些设置。

要进行闪回操作必须被授予闪回操作权限才行。赋予闪回权限需要进入管理员身份,执行以下命令:

LANGUAGE=SQL

1

2

3

 

SQL> --scott用户授予闪回表的权限

SQL> grant flashback any table to scott;

闪回记录的时候,你需要知道当前的系统改变号,也就是系统时间。

LANGUAGE=SQL

1

2

3

4

5

6

7

8

9

 

SQL> --查看系统改变号:当前系统时间

SQL> select sysdate 系统时间, timestamp_to_scn(sysdate) 系统改变号 from dual;

SQL> --这里假设我查询出来的记录是:

系统时间       系统改变号       

 

-------------- ----------  

 

09-7 -11        3584457

那么如果接下来我进行insert,update,delete操作,并且commit了。那么我就可以通过这条命令来撤销这个时间号之后操作的数据。

LANGUAGE=SQL

1

2

 

SQL> flashback table flashback_table to scn 3584457;

但需要注意的是,如果是闪回删除操作的话,你需要启用行移动功能后才能进行闪回。

LANGUAGE=SQL

1

2

3

4

5

 

SQL> --打开行移动功能

SQL> alter table flashback_table enable row movement;

SQL>--进行闪回

SQL> flashback table flashback_table to scn 3584457;

以上是闪回一条记录的方法,下面介绍闪回表的方法。其实闪回表的方法就相当与windows里面从回收站还原数据一样。
执行了drop操作的表会放到Orcale的回收站里面,可以通过下面命令来查看回收站里面有哪些表,但是如果drop一个表时使用了purge参数,该表就不存在于回收站里了,并且不能执行闪回删除。

假如我创建了一个AAA表,并且drop这个表。我就可以通过show recyclebin命令从回收站里面查看到这个表。

LANGUAGE=SQL

1

2

3

4

5

6

7

8

9

 

SQL>--查看回收站

SQL> show recyclebin;

 

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME     

 

---------------- ------------------------------ ------------ -------------------  

 

AAA              BIN$eMWnpZctTN+DyqLRUZzgSQ==$0 TABLE        2011-07-09:10:45:40

那么我就可以通过这个命令:

LANGUAGE=SQL

1

2

 

SQL> flashbak table aaa to before drop;

或者这个命令:

LANGUAGE=SQL

1

2

 

SQL> flashback table "BIN$eMWnpZctTN+DyqLRUZzgSQ==$0" to before drop;

来恢复AAA这个表。

假如这个表面已经在数据库存在了,那么你就得需要使用rename to命令来改变表名才能恢复。
例如:

LANGUAGE=SQL

1

2

 

SQL> flashback table aaa to before drop rename to bbb;

这里要注意的是管理员用户是没有回收站的,也就是说管理员用户不能进行闪回表的操作。

假如我想闪回一条记录,但我又事先没有查询系统时间号该怎么办呢?这里就需要用到闪回版本查询了。
假如我创建一个表并进行几个操作:

LANGUAGE=SQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

 

SQL> create table versions_table

    ( vid number,

      vname varchar(20));

 

SQL> insert into versions_table values(1,'Tom');

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> insert into versions_table values(2,'Mary');

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> insert into versions_table values(3,'Mike');

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> update versions_table set vname='Mary123' where vid=2;

 

已更新 1 行。

 

SQL> commit;

我就可以通过,闪回版本查询来查看我的这些操作了:

LANGUAGE=SQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

SQL> --执行闪回版本查询,来获取该表所有的历史记录:

SQL> select vid,vname,versions_operation,versions_starttime,versions_endtime

    from versions_table

    versions between timestamp minvalue and maxvalue

    order by vid,versions_starttime;

 

SQL> --得到的记录是:

 

      VID VNAME    V VERSIONS_STARTTIME             VERSIONS_ENDTIME                                                  

---------- -------- - ------------------------------ ------------------------------                                    

         1 Tom      I 09-7-11 11.14.59 上午                                                                         

         2 Mary     I 09-7-11 11.15.11 上午       09-7-11 11.15.59 上午                                          

         2 Mary123  U 09-7-11 11.15.59 上午                                                                         

         3 Mike     I 09-7-11 11.15.26 上午

这里便可以得到每一步操作的系统时间了。VERSIONS_STARTTIME是记录开始时间,VERSIONS_ENDTIME是记录结束时间。那么我想闪回那条update操作,那么我就只要闪回到09-7月 -11 11.15.59 上午 这个时间就行了。

首先把系统时间转变为scn号然后再执行闪回:

LANGUAGE=SQL

1

2

3

4

5

6

7

8

9

10

11

 

--系统时间转变为scn:

SQL> select timestamp_to_scn(to_date('2011-07-09 11:15:59','yyyy-mm-dd hh24:mi:ss')) from dual;

 

SQL> --查询后的snc结果

TIMESTAMP_TO_SCN(TO_DATE('2011-07-0911:15:59','YYYY-MM-DDHH24:MI:SS'))                                                 

----------------------------------------------------------------------                                                 

                                                               3586784          

 

SQL> --执行闪回

SQL> flashback table flashback_table to scn  3586784;

 

你可能感兴趣的:(关于对Orcale数据库的闪回操作)