【ORACLE】redo和undo_改变向量

redo和undo

1.1 oracle 9i 任务执行过程

--DML 更新数据操作:

1.创建一个改变向量(保存改变之前的数据)描述undo数据块的改变;

2.创建改变向量(保存改变之后的数据),描述数据块的改变;

3.合并两个改变向量为日志记录,写入日志缓冲区

4.创建undo记录插入undo表空间;

5. 改变数据块的数据;

所以任务报告为:

--任务报告

1.
创建undo块(数据文件2)的改变向量(方法为记录undo记录的内容)

2.
创建table数据块的改变向量

3a
合并两个改变向量,创建改变记录

3b
将改变记录复制到日志缓冲区

4
应用undo块改变向量(undo记录的redo change vector,创建undo记录)

5
应用table块改变向量

1.2 oracle 9i日志缓冲区瓶颈

所有会话进程向同一个日志缓冲区复制改变向量。

引入redo allocation latch:
用户进程尝试请求redo latch来在日志缓冲区保留部分空间;

存在问题:大量进程争用redo allocation latch,
消耗CPU资源,’自旋’ CPU的进程循环争用redo latch;

概况为一个进程的每一次变更,一条记录,一次log buffer
内存分配

1.3 oracle 10g 引入 private redo buffer
和IMU

--priate redo log buffer

Oracle 10g引入的。

每个进程有私有的日志缓冲区,一个事务中每次变更都写入这个进程的私有的日志缓冲区中;让事务提交后,这个进程获取一此公共的log buffer即可。

私用用redo allocation latch
保护,公共的用redo copy latch保护;

--IMU:In-Memory-Undo

Oracle 10g引入。

每个进程的私有日志缓冲区的一部分。进程将undo
重做日志写入IMU;

IMU 采用IMU latch来保护。最后IMU的记录和priavate redo log buffer日志记录合并。写入公共的redo
log buffer;

1.4 oracle10g任务处理顺序

--DML 更新数据操作:

1. 创建一个改变向量描述undo数据块的改变;

2. 创建改变向量,描述数据块的改变;

3  undo改变向量存入IMU日志缓冲区

Table改变向量存储private log buffer

6. 将IMU
记录和Pirvate log buffer记录合并成一条改变记录,结束事务

7.讲重做改变记录复制到日志缓冲区,并改变这个块。

--IMU

IMU池有lacth保护,池个数=transation/10

当124KB空间使用满了,回退到oracle9i的机制

--oracle数据块的存储信息

Tab 0 row 4 @0x1d3f

//表示第一个块,记录5,实际的存储地址为@0x1d3f

Col 0:[2] c1 0a

//第一列,为两个字符的空间,内容为c10a;

Lb: 0x2

//锁信息

1.5 redo change vactor(重做改变向量)

1.5.1描述table数据块改变改变向量

Kdo op code: urp row

//更新行片

Hdba: ox****  bdba:ox****

//hdba段头块的地址(段地址)

bdba: 块地址

Itli:2

//目前事务使用第二个事务槽

Tabn0 slot 4

//表示更新第一张表,第五行数据

Ncol: 4 nnew:1 size:4

//要更新的记录有4列,更细其中1列,长度增加4;

Col 2 [10 ] 59 59 ….

//更细的为第二列,增加之后长度为10个字符

1.5.2 描述数据块undo动作的undo记录及undo数据块最终变化的重做改变向量

不同于数据库改变向量之处

Ncol: 4 nnew:1 size:-4

//undo的时候,长度减少4

Col 2 [6] 78 78..

//原始数据第二行为 6个字符

--undo块的重做改变向量,描述undo记录的重做改变向量,所以和undo记录的最终值相同。

Dba(数据块地址):ox00..

//undo表空间为数据文件2

记录和undo的记录一样;

1.6 事务的ACDI

1原子性:a进程处理一个事务的中间(改变表1行4的数据),

B
进程访问(表1行4):通过undo记录来访问旧数据。

2 一致性:进程看到的数据为:老状态,新状态,没有中间状态

3 隔离性(独立性):

默认为:提交读;

如a进程,B进程同时修改同一个数据块。

4 持续性:待续;

--改变记录头:change recode header

Op:11.5 表示table redo改变向量

Op:5.2  表示事务的开始,

OP:5.1  表示undo改变向量

OP:5.4  事务结束

--读一致性

(1)数据块需要包含指向undo记录的指针。事务a更新数据,事务b根据指针读取undo记录的原始数据。

(2)事务a1更新一行数据,事务a2更新另外一行数据,则产生两条undo记录,所以数据块(比如包含一个表)要包含2个undo记录的指针,才能保证事务b查询整个表的结果为正常。

(3)oracle在每个数据块内部只允许存放有限的指针(每个队员一个改变块的事务),ITL entries位置

(4)如果事务a对于数据块(一张表)做了两次更新:事务b根据ITL表的entry2找到undo记录2,对事务b隐藏了事务a更新2操作。Undo记录2里面有指针指向ITL表entry1的指针;事务b通过undo记录2
找到 ITL entry1 , 通过ITL entry1
找到undo记录1;

这个事务b读的表的数据,就屏蔽了事务a对于两行的更改;

(5)事务b的内存中生成表的拷贝,然后将事务a的两个undo记录复制应用到拷贝上。

(5)读一致性,针对一个表及这个表的所有undo记录的指针链表

--回滚

(1)回滚是一个事务的历史,需要一个事务所有undo记录的正确排序的指针链表(比如对一行的一列,进行两次操作,产生两台Undo记录);

(2)回滚和读一致性的区别:读一致性的是读内存的数据缓存,读完之后,迅速舍弃。

回滚是获得当前数据块,并且应用undo记录来还原

当前块,表示要写入到磁盘上的版本;

因为是当前块,所有改变要产生redo;

(3)如果undo记录已经被回滚使用,则undo有个标记 user undo applied标记;

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

http://blog.csdn.net/clark_xu               徐长亮专栏原创

__________________________________________________________________________________

时间: 2024-10-13 04:40:23

【ORACLE】redo和undo_改变向量的相关文章

Oracle redo 复杂度--oracle核心技术读书笔记三

一. 概述 我们知道,在oracle中,每修改一条数据都会生成一条重做数据(也就是redo,里面记录了修改后的内容).目的就是为了将修改的数据备份,方便今后重做.现在有一个问题.oracle中只要修改数据,都会生成redo,这些redo会存放在一个叫做重做日志缓冲区里面.如果同时多个回话在修改数据,都要往重做日志缓冲区写入内容,就存在为同一片内存区域竞争的问题.存在竞争,就存在开销,这篇文章大概介绍一下,oracle如何尽量降低这种开销. 二.  问题概述 oracle中不断地修改数据,源源不断

The number of Oracle redo threads (2) is not the same as the number of checkpoint threads (1)

单实例数据库多日志线程,搭建ogg,启动抽取进程时提示一下错误: ERROR   OGG-00446  Oracle GoldenGate Capture for Oracle, extjms.prm:  The number of Oracle redo threads (2) is not the same as the number of checkpoint threads (1). EXTRACT groups on RAC systems should be created with

oracle redo 重做日志文件

以下易容翻译自oracle dba官方文档,不足之处还望指出. 管理重做日志文件 学习目标:1.解释重做日志文件的目的2.描述重做日志文件的结构3.学会控制日志切换与检查点4.多元化管理重做日志文件5.使用OMF管理重做日志文件 1.概念介绍:重做日志文件通过记录数据的所有改变情况对系统或介质故障提供恢复机制.1)重做日志文件以组的形式存在2)一个oracle数据库至少需要两组,每组至少有一文件3)在一组里的每一重做日志文件叫做成员The redo log files are used only

Oracle——redo+undo总结

<Oracle------redo> 重做日志文件(redo log file)对数据库来说至关重要,他们是数据库的事务日志: Oracle数据库维护着两类重做日志文件:在线重做日志文件(redo)和 归档重做日志文件(archive log),(归档重做日志文件实际上就是已填满的"旧"在线重做日志文件的副本) 这两类重做日志文件都是用于恢复的: ①:如果数据库所在主机掉电,导致实例失败,Oracle会使用在线重做日志将系统恢复到恰好在掉电之前的那个提交点: ②:如果磁盘驱

oracle redo undo

redo--> undo-->datafile insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据. redo解释:在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3-5MB左右.LOG_BUFFER

Oracle redo与undo 第二弹

首先看一下undo与redo的字面意思:   undo:撤销,也就是取消之前的操作.   redo:重做,重新执行一遍之前的操作. 什么是REDO REDO记录transaction logs,分为online和archived.以恢复为目的. 比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点. 比如,磁盘坏了,需要用archived redo logs和online redo logs去恢复数据. 比如,truncate一个表或其他的操作,想恢复到之前的状态

【Unity】改变向量的方向而不改变其大小

最近在做一个打砖块游戏时遇到一个小问题,就是小球有可能会在左右两个边界之间做循环往返运动而导致游戏无法继续进行下去,于是我打算让小球在垂直撞向边界时改变一下方向,但是速度不变,尝试了一些方法但是没有达到效果.后来想到,速度是一个向量,问题就变成了改变一个向量的方向而不改变它的大小,Google一下找到了这个旋转矩阵Wiki页面.虽然游戏是3D的但是只是在一个平面上运动,所以只需要下面这个旋转矩阵 用原向量矩阵[x,y]乘以旋转矩阵矩阵外积,左行乘右列代码如下 /// <summary> ///

oracle redo日志维护

环境 OS:Red Hat Linux As 5 DB:10.2.0.1 1.添加日志组 alter database add logfile group 4 ('/u01/app/oracle/oradata/oracl/redo04.log') size 50m; 2.添加日志组(指定日志已经存在) alter database add logfile group 4 ('/u01/app/oracle/oradata/oracl/redo04.log') size 50m reuse; 3

oracle - redo 损坏或删除处理方法

OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 数据库打开模式,非归档模式,非当前日志损坏 SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RE