如何理解redo和lgwr的内部流程

分类:编程技术 时间:2024-02-20 16:00 浏览:0 评论:0
0
很多新手不太清楚如何理解redo和lgwr的内部流程。为了帮助大家解决这个问题,下面小编就来详细讲解一下。有这方面需求的人可以过来学习。希望你能有所收获。 。

Oracle采用混合日志模式,基于数据块,即dba+sql,避免记录整个块,可以快速恢复
粒度是块级别(类似于物理日志),因此每个单独的块更改都会存储一个操作



一个大事务可以由多个小事务(即重做记录)组成,每个小事务记录可以由多个变化向量组成; commit/rollback单独对应1条redo记录;
每条redo记录包含1个原子操作,1个变更向量只对应1个数据块,且变更向量是在块实际修改之前生成的;

< p>事务提交时ted,将生成的redo+undo和commit记录写入redo日志文件,同时更新回滚段头的事务表;
注意:临时表只记录undo

Redo有3种latch
1 Copy,可以通过_LOG_SIMULTANEOUS_COPIES设置多个
2 Allocation只有1个
3 Write只有1个

< p>
REDO的生成
Redo首先在PGA中生成,依次获取复制latch--分配latch,将redo写入日志缓冲区,然后修改块。当Lgwr刷新redo buffer时获取写latch,避免同时多次刷新;
具体步骤如下
1以独占模式Pin buffer块
2构建变化向量
3 调用kcrfwr()将记录写入日志缓冲区:
计算该记录占用的空间记录;
阿尔定位SCN;
获取复制锁存器并验证SCN;
获取分配锁存器并检查日志缓冲区/文件是否有足够的空间。如果有足够的空间,则释放分配锁存器并将重做写入日志缓冲区。否则,释放分配/复制锁存,并通知LGWR执行日志刷新/切换;
注意:为了防止多个进程同时通知LGWR刷新重做或切换日志文件,需要一个写锁存器(仅1个) )的介绍。只有获得这个latch后才能进行下一步;
4将redo记录写入日志缓冲区,然后释放复制latch,检查是否达到触发LGWR的阈值;
5更改buffer block


nologging
该模式下redo记录仍然被记录,其下的change向量类型全部为INVALID;每条记录可以对应多个数据块,当应用重做时,对应的数据块将被标记为软损坏;




LGWR触发阈值
1 前台进程触发:日志缓冲空间不足;事务提交
2日志缓冲区满1/3
3重做超过1M
4 3秒超时
5日志切换
6重做线程关闭


LGWR触发流程
1 获取写/分配latch。前者防止LGWR被多次请求,后者防止前台进程继续分配重做空间
2确定要写入的日志缓冲区范围(从开始到要刷新的缓冲区),分配新的SCN(避免两次刷新使用相同的SCN)
3释放分配latch
4计算所需的redo写入次数,因为日志缓冲区是一个环,所以最多可以写入两次(分布在头部和尾部)

5 计算目标RBA,根据log_checkpoint_interval增加增量检查点
6 释放写锁存器
7 确保所有要写入的日志缓冲区都被复制,即等待所有复制锁存器被释放
8 LGWR更新重做块头的SCN和校验和(可选)
9 进行磁盘写入,可以修改_lgwr_async_io启用异步IO


分组提交
lgwr在c1处收到请求,日志缓冲区启动时添加了c2/g1/c3焕然一新。此时需要等待c3写入(释放redo copy lock),然后与c3一起刷新。

常见redo等待事件
日志文件并行写入-由lgwr触发,将重做记录写入当前日志文件,其并行度由物理磁盘数量决定
前台进程同步等待的日志文件,从commit/rollback直到lgwr将日志写入磁盘并通知请求进程
日志缓冲区空间-日志缓冲区没有足够的空间来存储新生成的重做,表明lgwr写入速度为比重做生成慢
日志文件切换分钟对于检查点不完整且需要归档


日志文件同步过程

< p>lgwr 将发布哪些前台进程?
lgwr刷新日志后,会post相应的前台进程(wakeup)继续工作。那么lgwr如何确定哪些前台进程应该被唤醒呢?
日志文件同步等待的p1参数的含义是:P1 = buffer# in log buffer that need to belush
lgwr刷新缓冲区后,会扫描活动会话列表以查看哪些会话正在等待日志文件同步,并且该会话的 buffer# 小于或等于其刷新的日志缓冲区的最大值,这些会话将被唤醒。


Lgwr文件同步和缓冲区忙等待
事务提交的堆栈调用如下
是ktcCommitTxn=> ktcmt => kcbchg => kcbchg1_main => kcrfw_redo_gen => kcrf_commit_force
kcbchg==>区块变更,为什么会发生区块变更?因为commit需要对Buffer Cache中的block进行立即的block cleanout,所以这期间需要一个独占模式pin;
如果此时其他会话访问该block,就会等待buffer busy wait
http://www.askmaclean .com/archives/why-slow-redo-write-cause-buffer-busy-wait.html


归档日志流程
1 ARCH 读取控制文件来决定归档哪些日志文件
2 分配归档内存 _LOG_ARCHIVE_BUFFERS * _LOG_ARCHIVE_BUFFER_SIZE;
3 以只读方式打开要归档的日志组的所有成员(读取日志缓冲区中的日志缓冲区)以循环方式轮转),并验证日志文件头;如果db_block_checksum=true,则每个日志块也会验证校验和
4 创建并打开归档日志文件
5 从复制日志将在线日志以循环方式写入归档日志,并对每个缓冲区进行健全性检查

关闭在线日志a执行后的归档日志

看完以上内容对您有帮助吗?如果您想了解更多相关知识或阅读更多相关文章,请关注行业资讯频道。感谢您的支持。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何理解redo和lgwr的内部流程

用户评论