关于对Orcale数据库的闪回操作
来源:互联网 发布:sk5代理ip软件 编辑:程序博客网 时间:2024/05/21 11:01
关于对Orcale数据库的闪回操作
使用Orcale数据库默认的是开启事务的。你进行insert,update,delete操作只要没有commit,就可以通过rollback来回退回去。
但如果你已经commit了呢?该怎么样让数据恢复呢?
传统的方法是用数据库备份,但缺点是你必须得恢复整个表或者整个数据库。假如你只想恢复一天记录,用备份就太得不偿失了。
Orcale提供了闪回技术,可以对单条记录进行恢复和对删除的某张表进行恢复,以及对某个事务进行恢复。
闪回有两个限制,一个是空间上限制的默认是2G,一个是时间上限制的默认是900秒。
这个设置是的意思是,操作的数据在2G内才能被闪回,如果超过了2G就必须在900秒内执行闪回。否则数据就不能被闪回。
你可以通过命令来修改这些设置。
要进行闪回操作必须被授予闪回操作权限才行。赋予闪回权限需要进入管理员身份,执行以下命令:
LANGUAGE=SQL
1
2
3
SQL> --为scott用户授予闪回表的权限
SQL> grant flashback anytable 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_tableto scn 3584457;
但需要注意的是,如果是闪回删除操作的话,你需要启用行移动功能后才能进行闪回。
LANGUAGE=SQL
1
2
3
4
5
SQL> --打开行移动功能
SQL> altertable flashback_table enable row movement;
SQL>--进行闪回
SQL> flashback table flashback_tableto 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==$0TABLE 2011-07-09:10:45:40
那么我就可以通过这个命令:
LANGUAGE=SQL
1
2
SQL> flashbak table aaato before drop;
或者这个命令:
LANGUAGE=SQL
1
2
SQL> flashback table"BIN$eMWnpZctTN+DyqLRUZzgSQ==$0" to beforedrop;
来恢复AAA这个表。
假如这个表面已经在数据库存在了,那么你就得需要使用rename to命令来改变表名才能恢复。
例如:
LANGUAGE=SQL
1
2
SQL> flashback table aaato before droprename 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> createtable versions_table
( vid number,
vname varchar(20));
SQL> insertinto versions_table values(1,'Tom');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insertinto versions_table values(2,'Mary');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insertinto versions_table values(3,'Mike');
已创建 1 行。
SQL> commit;
提交完成。
SQL> update versions_tableset 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 minvalueand 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_tableto scn 3586784;
- 关于对Orcale数据库的闪回操作
- 对orcale数据库中表的创建以及对表中数据的基本操作
- orcale数据库的简单操作语句
- 关于使用Orcale数据库的一点心得
- Orcale数据库操作练习
- Orcale数据库操作
- Orcale数据库基础知识总结之orcale数据库的DDL和DML操作
- ORCALE 日期函数的操作
- orcale视图的DML操作
- orcale数据库的导入导出
- orcale数据库的导入导出
- orcale连接数据库的实例
- 关于orcale的层级查询
- 对数据库的操作
- 关于Adapter对数据库的查询、删除操作
- SQL 与 orcale 数据库对BOM多级展开的实现方法
- orcale 部分闪回
- 关于安装orcale数据库中遇到的错误以及解决思路
- 多款jquery实现隔行换色、多选框选中变色【强大】
- Linux 获得硬盘信息命令
- Android官方推荐全局对象传递数据
- InputStream、OutputStream、String的相互转换
- oracle数据库的权限问题
- 关于对Orcale数据库的闪回操作
- linux内核简介与内核目录的介绍
- SAP三步连接Oracle数据库
- (三)单链表和双链表在执行删除操作时的区别
- oracle数据库中管理用户的安全
- 第六周任务(3)
- 二手房买房注意事项
- 2000年3月 韩寒
- ADO.NET中重要对象