我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解redo的内部过程与lgwr

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解redo的内部过程与lgwr

如何理解redo的内部过程与lgwr,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Oracle采用混合日志记录模式,以数据块为单位,即dba + sql,即避免记录整个块,又可快速恢复
the granularity is at the block level (like physical logging), so one operation is stored for each individual block change

如何理解redo的内部过程与lgwr

一个大事务可由多个mini-transaction即redo record组成,而每个record又可由多个change vector组成;commit/rollback单独对应1个redo record;
每个redo record包含1个原子操作,1个change vector仅对应1个数据块,change vector在实际修改块之前生成;

事务提交时,将生成的redo+undo和commit record写入重做日志文件,同时更新rollback segment header的事务表;
注:临时表只记录undo

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


REDO的生成
Redo先在PGA中生成,依次获取copy latch--allocation latch,将redo写入log buffer后再修改块,Lgwr在刷新redo buffer时获取write latch,避免同时多次刷新;
具体步骤如下
1 以排他模式pin住buffer block
2 在PGA中构建change vector并组合成redo record,由kconew()/kcoadd()完成
3 调用kcrfwr()将record写入log buffer:
 计算record占用的空间大小;
 分配SCN;
 获取copy latch,验证SCN;
 获取allocation latch,检验log buffer/file是否有足够空间,有则释放allocation latch将redo写入log buffer,否则同时释放allocation/copy latch并通知LGWR进行log flush/switch;
 注:为防止多个进程同时通知LGWR刷新redo或切换日志文件,引入write latch(只有1个),只有获取此latch后才能进行下一步操作;
4 将redo record写至log buffer而后释放copy latch,检查是否达到触发LGWR阈值;
5 更改buffer block
如何理解redo的内部过程与lgwr

nologging
此模式下仍记录redo record,其下的change vector类型均为INVALID;每个record可对应多个数据块,应用该redo时相应数据块将被标识为soft-corrupt;

 



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


LGWR触发过程
1 获取write/allocation latch,前者防止LGWR被多次请求,后者防止为前台进程继续分配redo空间
2 确定待写的log buffer范围(从起始处至待刷新的buffer),分配新SCN(避免两次flush使用同一个SCN)
3 释放allocation latch
4 计算所需redo write次数,因为log buffer为环形,故至多写两次(分布于头尾)
如何理解redo的内部过程与lgwr
5计算target RBA,依据log_checkpoint_interval增进增量检查点
6 释放write latch
7 确保待写的log buffer都复制完毕,即等待所有copy latch释放
8 LGWR更新redo block header的SCN和checksum(可选)
9 执行磁盘写,可修改_lgwr_async_io启用异步IO


组提交
Lgwr在c1处接到请求,开始刷新log buffer时新增了c2/g1/c3,此时需等待c3写完(释放redo copy latch)后,连同c3一起刷新,
 如何理解redo的内部过程与lgwr

常见的redo等待事件
log file parallel write-由lgwr触发,将redo record写入当前log文件,其并行度由物理磁盘数决定
log file sync-由前台进程等待,从commit/rollback直到lgwr将日志写入磁盘并通知请求进程为止
log buffer space- log buffer中没有足够空间存放新生成的redo,说明lgwr写出速度较redo生成慢
log file switch-分为checkpoint incomplete和archiving needed


Log file sync流程
 如何理解redo的内部过程与lgwr

lgwr会post哪些前台进程?
当lgwr刷新完日志后,会post相应的前台进程(wakeup)继续工作,那么lgwr怎么判断应该wakeup哪些前台进程呢?
log file sync等待的p1参数的含义为:P1 = buffer# in log buffer that needs to be flushed
当lgwr刷新完buffer后,会扫描活跃会话列表,查看哪些会话在等待log file sync,而且会话的buffer#小于等于它所刷新的log buffer的最大值,这些会话会被wakeup。


Lgwr file sync与buffer busy wait
事务commit的stack call如下
为ktcCommitTxn=> ktucmt => kcbchg => kcbchg1_main => kcrfw_redo_gen => kcrf_commit_force
kcbchg==> block change ,为什么要发生block change呢? 因为commit需要对在Buffer Cache里的block做immediate block cleanout,期间需要排他模式pin;
若此时其他会话访问该块则会等待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 以只读方式打开待归档日志组的所有成员(以轮循方式依次读取log buffer),并验证log file header;如果db_block_checksum=true每个log block还将验证checksum
4 创建并打开归档日志文件
5 以循环方式将日志从online log复制到archive log,对每个buffer都执行sanity check
 如何理解redo的内部过程与lgwr
执行完毕后关闭online log和archive log

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解redo的内部过程与lgwr

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解Java内部类中的局部内部类

这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或
2023-06-05

如何理解Java内部类中的成员内部类

如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的
2023-06-05

如何理解Java内部类中的匿名内部类

如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名
2023-06-05

如何理解CPU的内部结构

如何理解CPU的内部结构,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 CPU的责任是解释和运行最终转换成机器语言的程序内容。 CPU和内存都是由大
2023-06-04

linux如何显示内核引导过程中的内部事件

本文介绍了在Linux中显示内核引导过程内部事件的方法,包括使用引导加载程序日志、内核日志、klogd、syslog、内核调试信息、引导跟踪以及其他工具。这些方法提供了从低级到高级的选项,以根据需要查看详细程度不同的引导事件。通过使用这些技术,可以深入了解Linux内核启动过程,帮助识别和解决问题。
linux如何显示内核引导过程中的内部事件
2024-04-02

如何解决SpringAop内部调用时不经过代理类的问题

如何解决SpringAop内部调用时不经过代理类的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringAopAOP代理织入时期编译时织入 - aspectj框架类
2023-06-22

一个MySQL存储过程如何调用它内部的另一个MySQL存储过程?

一个 MySQL 存储过程很可能可以调用其内部的另一个 MySQL 存储过程。为了演示这一点,我们举一个例子,其中一个存储过程将调用另一个存储过程来找出last_insert_id。示例mysql> Create table employe
2023-10-22

如何理解Linux进程的内存管理

这篇文章给大家介绍如何理解Linux进程的内存管理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。几个关键的数据结构一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_str
2023-06-15

Android下如何理解onMeasure,onLayout的过程

在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,近重新整理一下,通俗的讲解一下。View绘制过程好比你向银行贷款,在执行onMeasure的时候,好比银行告诉你大概贷款额度有多少?你根据自己的需求,进行各方面
2022-06-06

如何理解C++多态的实现过程

如何理解C++多态的实现过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。多态描述的是使用基类的指针或引用操作多个类型的能力。我们知道,子类的指针是可以隐式转化为父类的,所
2023-06-17

C++ 内存管理如何与其他编程语言的内存管理进行比较?

C++ 内存管理与其他编程语言的比较简介内存管理是编程中的一个关键概念,负责分配和释放内存空间来存储程序数据。在不同的编程语言中,内存管理方式各不相同,影响着程序的性能、可维护性和可靠性。本文将比较 C++ 内存管理和几种其他流行编程语
C++ 内存管理如何与其他编程语言的内存管理进行比较?
2024-05-24

如何通过ODBC在Oracle中管理大数据的存储过程与函数

要在Oracle中通过ODBC管理大数据的存储过程和函数,可以遵循以下步骤:首先,确保你已经安装了适当的ODBC驱动程序,以便连接到Oracle数据库。你可以从Oracle官方网站上获取适用于你的操作系统的ODBC驱动程序。在你的计算机上配
如何通过ODBC在Oracle中管理大数据的存储过程与函数
2024-07-16

如何解决javac不是内部或外部命令,也不是可运行程序的问题

如果您在使用命令行或终端运行javac时遇到了"javac不是内部或外部命令,也不是可运行程序"的错误,可能是由于以下几个原因导致的:1. Java Development Kit(JDK)未正确安装:确保您已正确安装了JDK,并且JAVA
2023-08-25

编程热搜

目录