时间:2021-07-01 10:21:17 帮助过:34人阅读
《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<10; 创建leo2表只需要9行记录即可
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';