oracle回滚和撤销机制笔记

20 篇文章 2 订阅

oracle回滚和撤销机制笔记

一、回滚段存储的内容

1、对于insert操作:回滚段只需要记录插入记录的rowid,如果回退,只需要将该记录根据rowid删除即可。

2、对于update操作:回滚段只需要记录被更新字段的旧值即可,回退时通过对旧值覆盖新值即可完成回退。

3、对于delecte操作,oracle则必须记录整行的数据,在回退时,oracle通过一个反向操作恢复删除数据的数据。

二、回滚在oracle中的机制。

在一个简单的更新语句中,对于回滚段的操作存在多处,在事务开始时,首先需要在回滚白鸥空间获得一个事务槽,分配空间,然后创建前镜像,此后事务的修改才能进行,oracle必须以此来保证事务是可以回滚得。如果用户提交了事务,oracle会在日志文件记录提交。并且写出日志,同事会在回滚段中把事务标记为已提交,如果用户回滚事务,则oracle需要从回滚段中把前镜像数据读取出来修改数据缓冲区,完成回滚,这个过程本身也需要产生redo,多以回退这个操作时很昂贵的。

三、并发控制和一直性读

1、一方面oracle通过锁定机子实现数据库的并发控制;一方面通过多版本模型来进行并发数据访问。通过多版本架构,oracle实现读写分离,使得写入不阻塞读取,读取不阻塞修改。这是oracle数据库区别于其他数据库的一个重要特征。oracle一方面不允许其他用户读取未提交数据,一方面要保证用户读取数据来自同一时间点。

oracle的回滚和撤销机制

oracle内部使用scn作为时钟,在这里查询结果集就是根据scn来进行判断的,每个数据块头部都会记录一个提交scn。当数据更改提交后,提交scn同事被修改,这个scn在查询时可以用来进行一致性读判读。

假设员工scott的薪水为3000那么:

1)在t1时间,在session1查询可以得到这个结果

2)在t2时间session2进行更新,将scott的薪水增加1000,并为提交

3)在t3时间session1再次查询,注意此时,oracle不会允许其他用户看到未提交数据,所 以此时,oracle需要通过回滚段记录的前镜像进行一致读,将3000恢复出来供给用户,这是 一致性读的作用。

4)在t4时间,session2提交更改,此时数据修改被永久化;

5)在t5时间,其他用户再次查询,将会看到变化后的数据,也就是4000

四、在自动undo管理表空间,oracle 随之引入了几个新的初始化参数

undo_management:用来定义数据块使用的回滚段是否使用自动管理模式。该参数有两个选项,auto表示自动管理,manual表示手工管理。

undo_tablespace:用来定义在自动管理模式下,当前实例使用哪个undo表空间。

undo_retention:表示在自动管理模式下,当回滚段变得非激活之后,回滚段中的数据在被 覆盖前保留的时间,该参数单位是秒。

五、回滚机制的深入研究

1、获取事务信息: v$transaction动态视图

xidusn:回滚段号

xidslot:事务槽

xidsqn:事务的序列号

ubafil:undo block address filenum ubablk:UBA block number ubarec:UBA record number v$rollstat动态视图

usn:回滚段标识

rssize:回滚段默认大小

xacts:活动事务数

writes:回滚段写入数

shrinks:回滚段收缩次数

extends:回滚段扩展次数

gets:获取回滚段头次数

waits:回滚段头等待次数

2、转储undo段

在undo段头的转储文件中,dba指向的就是包含这个事务的前镜像的数据块地址。前 十位代表文件号,后22位代表block号。转储文件中的irb:指的是回滚段中记录的最近未提交 变更开始之处,如果回滚,这是起始的搜索点。rci:该参数代表的是undo chain(同一事务 中的多次修改,根据chain连接关联)的下一个偏移量。在x$BH中class字段中4表示的是段 头,1表示的是数据块,state为3的就是一致读构造的前镜像。

select b.segment_name ,a.file#,a.dbarfil,a.dbablk,a.class,a.state

from x$bh a,dba_extents b

where b.relative_fno=a.dbarfil

and b.block_id<>

and b.block_id+b.blocks>a.dbablk

and b.owner='SCOTT'

and b.segment_name='EMP'

3、转储数据块信息

ITL事务槽指interested transaction list,事务必须获得一个ITL事务槽才能够进行数据 修改ITL内容包括:

xid:事务的id

uba:undo块的地址

lck:lock status xid=undo.segment.number+transaction.table.slot.number+wrap

image-20210719105837071

事务的内部流程 1)首先当一个事务开始时,需要在回滚段事务表上分配一个事务槽

2)在数据块头部获取一个ITL事务槽,该事务槽指向回滚段头的事务槽

3)在修改数据之前,需要记录前镜像信息,这个信息以undo record的形式存储在回滚 段中,回滚段头事务槽指向该记录。

4)锁定修改行,修改行锁定位指向ITL事务槽。

5)数据修改可以进行。

4、块清除(block cleanouts)

在事务需要修改数据时,必须分配ITL事务槽,必须锁定该行,必须分配回滚段事务槽 和回滚空间记录前镜像。当事务提交时,oracle需要将回滚段上的事务表信息标记为非活动, 以便空间可以重用;那么还有ITL事务信息和锁定信息需要清除,以记录提交。由于oracle在 数据块上存储了ITL和锁定等事务信息,所以oracle必须在事务提交之后清除这些事务数据, 这就是块清除。块清除主要清除的数据有行级锁、ITL信息(包括提交标志、SCN等)。如果 提交时修改过的数据块仍然在buffer cache之中,那么oracle可以清除ITL信息,这叫做快速 块清除,如果事务提交时修改过的数据块已经被写回到数据文件上,oracle会等到下次访问该 block时再来清除ITL锁定信息,这就是延迟块清除。

5、产生ora-01555错误的原因

1)由于回滚段是循环使用的,当事务提交以后,该事务占用的回滚事务表被标记为非活 动,回滚段空间可以被覆盖重用。那么当一个查询需要使用被覆盖的回滚段构造前镜像实现一 致读,此时就会出现oracle著名的ora-01555错误

2)因为延迟块清除。当一个查询触发延迟快清除时,oracle需要去查询回滚段获得该事 务的提交scn,如果事务的前镜像信息已经被覆盖,并且查询scn也小于回滚段中记录的最小 scn,那么oracle将无法判断查询scn和事务提交scn的大小,此时就会出现延迟块清除导致的 ora-01555错误。

3)使用sqlldr直接加载数据时。

alter tablespace tablespace_name retention guarantee;

oracle提供一个内部事件(10203事件)可以用来跟踪数据库的块清除操作,10203事件 可以通过以下命令设置,设置后需要重新启动数据库该参数才能生效

alter system set event='10203 trace name context forever' scope=spfile;

alter database datafile '.....' offline drop;

六、回滚段的空间过大

1)通过查询试图v$dba_data_file和v$dba_temp_files确定临时表空间和undo表空间的大 小

2)新建一个undo表空间 create undo tablespace tablespace_name;

3)切换undo表空间 alter system set undo_tablespace=undotbs2 scope=both;

4)等待原表空间所有undo segment offline;

5)删除原undo表空间 drop tablespace undotbs1 including contents;

七、特殊情况的恢复

在很多情况下,特别是在使用隐含参数强制打开数据库之后,可能会在ora-006004194错 误,在alert文件中,记录主要错误日志,出现此种错误时,最好的办法是通过备份进行恢 复,如果没有备份,那么可以通过特殊的初始化参数进行强制启动,

1)从当前的日志文件中找到对应的AUM(auto undo management)下的回滚段名称。

2)修改init.ora参数文件,使用oracle隐含参数_corrupted_rollback_segments将回滚段 标记为损坏,oracle会跳过对于这些回滚段的相关操作,强制启动数据库。 _

3)使用init.ora参数文件启动数据库 startup pfile=initconner.ora

4)重新创建新的undo表空间,删除出现问题的表空间,修改参数文件,由参数文件生成 新的spfile,重新启动数据库。

create undo tablespace undotbs1 datafile '.......' size 10m;

alter system set undo_tablespace=undotbs1 scope=both;

drop tablespace undotbs2;

修改参数文件,变更undo表空间,并取消_corrupted_rollback_segments设置。

有参数文件创建spfile;

打开数据库即可;

转载:http://www.360doc.com/content/16/0926/15/28512492_593768000.shtml

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值