Oracle undo我们需要掌握什么

原创
2016-06-07 17:41:39 751浏览

《Oracleundo我们需要掌握什么》引言:undo是Oracle数据库的重要组件,刚入门的朋友建议要把undo的原理和机制理解明白,尤其是和redo组件的区别和联系。了解undo

《Oracle undo我们需要掌握什么》


引言:undo 是Oracle数据库的重要组件,刚入门的朋友建议要把undo的原理和机制理解明白,尤其是和redo组件的区别和联系。了解undo就相当于对oracle恢复有了一半的理解。下面我们开始学习Oracle undo需要掌握什么!

更多的精彩文章请垂询 blog,欢迎大家来探讨交流

“分享技术~成就梦想”

一 大话UNDO

Hi 大家好,我是Oracle 的无敌小安[中文名(small undo[英文名),首先我先来介绍一下自己吧,我诞生于一个大家庭Oracle,现在的一把手拉里.埃里森就是我的缔造者,我的诞生可谓Oracle立下了汗马功劳,使Oracle开拓缰野攻城略地!我的诞生是为了解决三个大问题,事物回滚,实例恢复,查询一致性。这样的功能使Oracle成为了关系型数据库中的佼佼者。

例如:读不会被写所阻塞,当我们读取的数据块正好被他人修改时,我们就可以找到undo段里保存的前映像来维护一致性。而其他数据库,sql server mysql等都没有undo段,也就是说它们查询时可能被阻塞。

Undo和Redo区别

好多人尤其是刚刚入门的朋友,总会把这两个概念搞混淆。

Redo:是基于安全考虑的,会记录数据库的所有变化,当数据被误修改时,使用redo可重新生成,事物重做。是前滚,就是从无到有的新创建。一个新生命的诞生。

Undo:是基于回滚的,当数据被误修改时,可以从修改的新状态回退到老状态,实现事物回滚,相当于撤销操作。是回滚,就像倒录音带一样,把走过的路反向在走一遍回到原点。

Undo目的:1.事物回滚:rollback

2.实例的恢复:掉电,死机,强制关库,把没有提交的事物全部回滚

3.查询一致性:读不会被写所阻塞

Undo段:采用LRU最近最少使用算法来循环覆盖使用,它的块有active和inactive和new状态,如果块的状态为inactive那么后续的数据就可以覆盖它了。如果空间不够Oracle自动分配新空间。

分配:Oracle是按顺序循环使用的,不允许跨区覆盖。

回收:Oracle也是按顺序回收的,不允许跨区回收。

Rollback和Commit标识位都一样,都代表事物的结束

Rollback:表示会回滚从上一次提交到现在的所有事物


二 数据库版本

SYS@LEO1> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE 11.2.0.1.0 Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production


三 示例演示回滚是否产生REDO日志。

原理解释:首先向大家明确一点,redo的产生机理是因为底层数据块的变化而产生的,这个数据块不管是数据文件的还是undo文件的,数据块的变化都会记录在redo日志里面。

OK我们再来看看undo回滚的原理,香港虚拟主机,假设 一个数据块命名为A,这个A里面存放了数据1,现在我们要把这个1->修改->2->修改->3->修改->2->修改->1 步骤

1.先把1复制一份映像存放到undo块上用于回滚,这就是前映像,undo块改变产生redo记录

2.再把数据块上的1修改为2,A改变产生redo记录,现在A中存放的是2

LEO1@LEO1> drop table leo2 purge; 清理环境

Table dropped.

LEO1@LEO1> create table leo2 as select * from leo1 where rownum

LEO1@LEO1> select a.name,b.value from v$statname a,v$mystat b where a.STATISTIC# =b.STATISTIC# and a.NAME='redo size';

NAME VALUE

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

redo size 2362280

这是初始化的值

LEO1@LEO1> update leo2 set object_id=2 where object_id=1; 1->修改->2

1 row updated.

LEO1@LEO1> select a.name,b.value from v$statname a,v$mystat b where a.STATISTIC# =b.STATISTIC# and a.NAME='redo size';

NAME VALUE

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

redo size 2362992

LEO1@LEO1> select 2362992-2362280 from dual; 这是产生的redo量

2362992-2362280

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

712

3.这时我们又想把2修改为3,还是先把2复制一份映像存放到undo块上用于回滚,这就是第二个前映像,undo块改变产生redo记录

4.再把A中的2修改为3,A改变产生redo记录,现在A中存放的是3

LEO1@LEO1> update leo2 set object_id=3 where object_id=2; 2->修改->3

1 row updated.

LEO1@LEO1> select a.name,b.value from v$statname a,v$mystat b where a.STATISTIC# =b.STATISTIC# and a.NAME='redo size';

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。