ITPub博客

首页 > 数据库 > Oracle > Redo Generation 重做生成

Redo Generation 重做生成

原创 Oracle 作者:dbs101 时间:2011-08-07 19:27:47 0 删除 编辑

一个逻辑原子数据库改变正常是由俩个或者多个物理块改变组成。这包括数据块,索引块,
回滚段块等等。

1. Oracle读block到data buffer中,然后改变block中的值。
2. 在一个回滚段中找到一个空闲的block,然后写进可以reverse的信息。
3. Oracle放置一个条目在transaction table中,这是在回滚段文件的第一个头block,用来
鉴别这个transaction和保留回滚空间。
4. 为了保护数据改变,Oracle将这个改变写到log buffer中。这里包括回滚段的transaction
table的改变,回滚段的block改变和数据block的改变。

为了防止并发改变data buffer和log buffer,Oracle使用不同的latch。

这里主要关注log buffer

1. 进程首先获取redo copy latch,用来表明进程正在copy重做信息到log buffer中,LGWR
要等到copy完成时,才会写log buffer到磁盘。
2. 进程获取redo allocation latch来分配log buffer中的空间。这个latch保护SGA的变量,
这些变量记录了那些log buffer的blocks已用或空闲。如果使用空间超过1/3 log buffer,
那必须要等到LGWR写log buffer到磁盘,等待事件是log file sync。
3. 进程释放redo allocation latch
4. 进程从进程的pga临时buffer中copy change vector到log buffer。
5. 进程将改变应用到data block中
6. redo entry被标志成有效的
7. 进程释放reco copy latch。
8. 进程可能需要通知lgwr刷新log buffer到磁盘。(log buffer中使用的blocks超过了
_log_io_size=1/3 log buffer size,timeout 3秒,这时lgwr启用background writes。
或者发出了commit,这时lgwr启用sync writes,服务进程post lgwr,并等待log file sync
在1秒钟之内。如果这期间有几个commits同时发生,那么这些commit标志将被一起刷新到磁
盘。
或者发生了checkpoint,DBWn写data block到磁盘时,需要先等lgwr将log buffer中相关的
改变写道磁盘中,这个等待事件是log file sync。

9. lgwr获取redo writing latch,并更改SGA变量,防止其他进程无用地post lgwr。
10. 如果没有post,lgwr获取redo allocation latch来检查有没有redo log要写。
11. 如果没有redo log要写,就启动一个rdbms ipc message等待。
12. 如果有redo log要写,lgwr检查redo copy latch的SGA latch recovery area,确定
有没有copy正在进行。如果有,lgwr就等待redo copy latch。
13. 当copy完成时,lgwr将会被post。在这个时间,lgwr持有redo writing,redo allocation
latch并被记录到redo writing的统计信息中。
14. 在online log 文件中找到一个空闲的空间,如果没有,发出一个log switch。
14. 写操作完成。
15. lgwr获取redo allocation latch更改SGA variable,清空log buffer。

redo allocation:
每个instance只有一个redo allocation。这里给出的关于redo allocation latch的方法是
减少它的load。由于过低的_log_io_size引起的lgwr过度活跃。DBWn不要checkpoint最近
block的改变太集中。
在9.2中,可以有多个redo allocation latch,这是由参数LOG_PARALLELISM决定的。

redo copy:
redo copy latch是由_log_simultaneous_copies隐含参数来决定的。在着手解决reco copy
latch之前,先优化redo allocation latch和减少redo生成。
在9.2中,redo copy latch是由CPU个数决定的。并可以通过_log_simultaneous_copies隐含
参数修改。

redo latch主要是用来redo生成的,但是也和log file sync关联。redo latch很少是个问题。

redo io是主要的redo contention的问题。

下列语句用来检查redo latch的miss ratio
SELECT  substr(ln.name, 1, 20), gets, misses, immediate_gets, immediate_misses,
  immediage_misses/(immediate_misses+immediate_gets) ratio1,
  misses/(misses+gets) ratio2
FROM v$latch l, v$latchname ln
WHERE   ln.name in ('redo allocation', 'redo copy')
                and ln.latch# = l.latch#;

REDO BUFFER ALLOCATION RETRIES:统计信息,反映服务进程等待redo log buffer空间的
次数。

REDO LOG SPACE REQUESTS:统计信息,反映服务进程等待redo log 文件空间的次数。这有
可能是checkpoint或者log switch引起的,这需要检查checkpoint和archiving进程。

参考:
http://www.ixora.com.au/tips/tuning/redo_latches.htm

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25105315/viewspace-704355/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-12-18

  • 博文量
    92
  • 访问量
    446516