解密Oracle redo生成过程

作者: admin 分类: 公众号存档            2 次浏览 发布时间: 2020-06-20 23:53

【转载声明】本文为转载文章,原作者「惠星星」,版权归原作者所有。 原文链接:https://mp.weixin.qq.com/s/mnbCLYGqV6iyNhrQ2Yo18g

公众号:杨建荣的学习笔记 · 作者:惠星星 · 发布:2020-06-20 23:53:20 · 原文链接

作者简介

惠星星,现就职于北京海天起点,持有OCP 10g、OCP 11g、OCM 11g证书,并有长达8年电力行业业务维护、数据库维护服务经验,擅长Oracle数据库性能优化、故障处理及数据可视化技术研究。

online redo log files是Oracle数据库最重要的物理结构之一,由于Write-Ahead-Log(即日志写入优先)机制,确保instance failure时,实例级恢复正常完成,已提交的数据被正常恢复,本文主要通过dtrace工具分析redo产生过程中latch资源的申请过程,分析Oracle redo生成的详细过程。

关于Redo Log Buffer

redo log buffer 是SGA中的一个循环缓冲区,主要存储 redo entries。redo entries包含重构或重做DML或DDL操作对数据库所做的更改所需的信息。数据库恢复将redo entries 应用于数据文件,以重构丢失的更改。

Oracle数据库进程将redo entries从用户内存空间复制到SGA中的重做日志缓冲区。redo entries占用缓冲区中连续的、顺序的空间。LGWR进程将redo log buffer 中的redo entries写入磁盘上online redo log files。

测试脚本

#!/usr/sbin/dtrace -s -n
dtrace:::BEGIN
{
  i=1;
}
 
 
pid$1::kslgetl:entry,
pid$1::kslfre:entry
/pid == $1/
{
 printf("i=%d pid:::==%s:%s:%s:%s %x %x %x %d %x %x",i, probeprov, probemod, probefunc, probename,arg0,arg1,arg2,arg3,arg4,arg5);      
 i=i+1;
}

测试redo entries写入redo log buffer

【session 1】:

查询进程id

SQL> select spid from v$process where ADDR in (select PADDR from v$session where sid=(select sid from v$mystat where rownum=1));
 
SPID
------------------------------------------------------------------------
1358
SQL> create table orastar.t1(c1 varchar2(10),c2 varchar2(10));
 
Table created.

【session 2】:

启动dtrace程序

./list_latch.d -x switchrate=10hz 1391 > list_latch.log

【session 1】:

生成redo entries:

SQL> insert into orastar.t1 values(1,1);
1 row created.
 
SQL> commit;
Commit complete.

分析过程

【生成latch地址】

cat list_latch.log |grep kslgetl|awk '{print "'\''" "00000000" $6 "'\''" ","}'|sort $1 | uniq

【查询latch查询】

set line 200
col name for a30
select lower(addr),LATCH#,NAME,HASH,GETS,WAIT_TIME from V$LATCH_CHILDREN where lower(addr) in (
'000000006000d178',
'000000006000d370',
'000000006000d7e8',
'000000006002dab8',
'000000006010df10',
'00000000bb137e80',
'00000000bb5d6868',
'00000000bb6d6a28',
'00000000bb6d8570',
'00000000bb7d8730',
'00000000bc593120',
'00000000bc6ba8f0',
'00000000bc6e7998',
'00000000bc6ea088',
'00000000bc6ea128',
'00000000bd6c4fe0',
'00000000bd6c50d8',
'00000000bd6c5338',
'00000000be263330',
'00000000be26f100',
'00000000be95ed98'
);

redo生成过程说明

  • server process在user memory space中产生redo entry

  • server process获取redo copy latch

  • server process 获取redo allocation latch

  • 在log buffer中分配空间

  • 释放redo allocation latch

  • server process将redo entry信息写入到log buffer中

  • 释放redo copy latch

说明

以上内容为个人多次测试结果,由于个人原因,如有分析不足之处还请见谅及指正,谢谢。

参考文档

《Oracle® Database Concepts 11g Release 2 (11.2) 》

原创文章,版权归本文作者所有,如需转载请注明出处

喜欢本文请长按下方的二维码订阅Oracle一体机用户组

QQ群号:763628645

QQ群二维码如下, 添加请注明:姓名+地区+职位,否则不予通过

订阅我的微信公众号“杨建荣的学习笔记”,第一时间免费收到文章更新。别忘了加星标,以免错过新推送提示。

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注