oracle redo相关知识

来自辛明老师:

1.redo的作用

保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。

 

2.redo功能的实现

redo log buffer

lgwr

redo log file

 

3.redo log详解

change vector(改变向量):对数据库内某一个数据块所做的一次变更

redo records(重做记录):由一组改变向量组成,数据库的最小恢复单位

例如一个update的重做记录就包括回滚段的改变向量和相应数据块的改变向量

 

update emp set sal=4000 where sal=7788;

a.检查empno=7788的记录在buffer_cache中是否存在,若不存在则读取到buffer_cache中

b.在回滚表空间的相应回滚段的事务表中分配事务槽,这个操作需要记录redo信息

c.从回滚段读入或者在buffer_cache中创建sal=3000的前镜像,这个操作需要记录undo信息

d.修改sal=4000,这是update的数据变更,需要记录redo信息

e.当用户提交时,会在redo log buffer记录提交信息,并在回滚段标记该事务为非激活(inactive)

 

4.redo与数据库恢复

当用户在buffer_cache中修改数据时,oracle并不会立即将修改的数据写出到数据文件中,这样做效率很低,

oracle为了减少IO的次数,当修改过的数据达到一定数量后,进行高效的批量写出

 

正是因为提交时不强制刷脏数据块,所以为了保证数据库发生故障时可以恢复,oracle引入了redo机制

 

由于redo机制对于数据的保护,当数据库发生故障时,oracle就可以通过redo重演进行数据恢复,

那么一个非常重要的问题就是,恢复应该从何处开始?

 

如果读取的redo过多,必然导致恢复的时间过长,oracle通过检查点(checkpoint)来缩短恢复的时间

当检查点发生时,oracle会通知dbwr进程,把修改过的数据从buffer_cache写入磁盘,在检查点完成后,

ckpt进程会将相应的检查点信息写入控制文件和数据文件头

 

在检查点完成之后,此检查点之前的修改过的数据都已经写回磁盘,重做日志文件中的相应的重做记录对于

实例恢复不再有用。如果此后数据库崩溃,那么恢复只需要从最后一次完成的检查点开始恢复即可。如果

数据库运行在归档模式,日志文件在重用之前必须写出到归档文件

 

5.检查点的分类

完全检查点:dbwr以最高优先级写出脏数据块

——非abort方式关闭数据库

——alter systemcheckpoint

增量检查点:dbwr不一定刷脏数据块

——每隔三秒钟执行一次:只记录控制文件

——每次日志切换:记录控制文件和数据文件头部

 

6.redo的数量

a.set autotrace traceonly:查询每个操作的redo量

b.v$mystat:查询当前session产生的redo量

select n.name,m.value

from v$statname n,v$mystat m

where n.STATISTIC# = m.STATISTIC#

and n.name =‘redo size’;

c.v$sysstat:查询数据库实例启动以来累积生成的redo量

select name,value

from v$sysstat

where name =‘redo size’;

 

7.redo写的触发条件

a.每3秒钟

b.redo log buffer1/3满

c.redo log buffer达到1M

d.用户提交

e.在dbwr写之前

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值