欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle undo我们需要掌握什么

程序员文章站 2022-04-12 07:54:59
...

《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';