oracle内核+相克军Oracle视频 看懂绝对是高级DBA了

本文深入探讨了数据库的事务处理,包括undo记录的前镜像、CR块的构建、回滚与提交机制。讲解了xid在ITL中的作用,如何利用undo和redo进行数据恢复,并分析了buffer cache、redo log buffer以及并发控制中的锁机制。同时,讨论了ASM条带化对I/O性能的影响以及数据库优化策略。
摘要由CSDN通过智能技术生成

相克军:

1.undo记录的不是块,而是前镜像,一条一条的,各undo块之间记录串起来,可以方便rollback 从后向前

2.undo 时,data block指向undo块的位置,为了构建CR块方便不需要根据xid看undo块头,同时写两份可以减少争用,不用老查段头,同步更新也有消耗,比起段头热块争用,还是值得了。 另外如果更新了1000个块,1000个块上有这个信息,同时段头也有。那commit时,直接更新段头就可以(尤其是块已经写入磁盘,未提交写入磁盘啦。更新的话还要读到内存)。那这样块里面的flag没变,每次都要查一下?还是延迟块清理,只是不清行的信息? 但也不对,行不清的话,lck也不能清,所以应该整个快都是延迟清理。视频里面说两个都有可能没清理的,只要有锁就要看一下undo header,因为决定要不要构造cr块。如果要构建就是cr读,如果不要构建cR就是current读。这个块同时也可能已经刷入磁盘了。如果没有刷入磁盘,那磁盘的信息就是很早的,我们能不能不构CR块,直接读磁盘的数据呢? 好像不行,因为找块的时候都是CBClatch先看在不在cache的,在cache就不去磁盘了,因为在cache肯定是未提交或者刚提交。你新来的scn查,我去磁盘查万一查了很久的(commit还没有刷进盘的数)数据就不一致了。

块上的xid去查undo header,如果发现xid那一条覆盖次数比如15 超过xid-13的记录,说明我这个事务已经提交了。已经提交了再查就不能用他回滚了。这时oracle15555错误就出现啦。要找可以,去redo找。但是redo做事不像undo,他说我只能朝后跑,你去把xid12次覆盖的文件找来,我给你redo到13次。redo不能反着来。除非启用了flashback,这时可以反着来了。因为flashback时我没有提供12次覆盖的文件,只能倒退回去!!

3.xid记录了undo块头,第几行 和第几次覆盖,所以xid可以唯一的标记在头内所有过的操作,类似hbase的记录多次修改了。块中有UBA已经可以回滚,但是只能回滚一次,所以记录xid可以超前串起回滚和第一步差不多。

(另外xid记录了可以延迟块清理,下次清理时根据xid对照块头覆盖次数(原来9 现在覆盖次数11,肯定是commit了,不commit不可以覆盖的。)决定块是不是脏块。。)后面学习了发现xid后面还有flag标志,lck,scn fsn 定位了块的scn,确定instance crash时块要不要恢复。

ITL中处理xiduba还有row 锁,行级锁。

由于itl数量限制,所以也会有争用。热块,buffer busy wait。这是update时才有,insert时是一次插多个块,比如阿里那个日志,一次插64块导致的问题,如果有几百个块,问题就少了。但是如果用了sequence,下次根据sequence,select就慢了,取几条记录访问多少块,本来就64块放了五百条。导致select慢了。。。

除了xid uba还有几个信息的,这个在两个里面都有一样的表。

lck就是锁的行数, 加上行的锁(行上放itl number就行,反向也可以查出itl对应多少行。 高明啊)一起配合使用,所有信息一目了然。

----

小结:

ITL中UBA指向data block的最后一个undo block地址,undo block之间指向,都是为了回滚操作;

Data block header 与Undo block的直接指向,为了构造cr块更快速;

ITL中XID指向undo segment header是为了多种提交方式。

1.行删除后回滚

 

 

中间表exchange partition 

这种按月分区吧

 

2.

system的buffer cache

2.索引读取次数

i/o出问题指标

 等待事件oracle知道的,主动登记的 i./o network

等待事件表

 gdb

kslwtbctx kslwait 等待任务

利用sid 找错误 spid

 全局临时表

单独网段的重要性

 指标突然升高降低很大

 存储问题

redo 在pga产生

 等待的状态

AWR

 物理读

iops

到时看一下他的语句 

唯一索引

读不阻塞写

 写阻塞读  如果频繁访问 建唯一索引 pCTused大一点?

 

redo 我也遇到

 

redo太重要了 logbuffer大也没用 ,后面写满还是跟不上

redo记录后镜像 ,undo 记录前镜像

RBA UBA  DBA 这些 

DBWR 异步写,合并写  异步IO相当于并行写 

I.O 次数 和写入总数不同,因为大块 小块

 LRU

 大小表策略 小表可以是热表 大的不行

以前忽略的 dbwr checkpoint Q和lruw都要写数据cache

一般不用改变mttr 改变这个影响I/O 和CPU的使用情况,CPU换I/O 

chain长了 latch就多 cpu就多,那就多写I/O 少用cpu, 脏块写入不就是没有commit的写入了数据文件。。

 上面这句是不是有点问题lruw不写脏块啊,看到脏的不是放到热端嘛

数据文件start scn的改变,写入就是写最新的scn进去,告诉你这块以前的redo已经不要了啊,可以覆盖了

ckpt dbwr 不想不等待, 什么时候等,那就是所有的redo都是active的,那没有可用的redo,ckpt要等待dbwr写完, 不过所谓的等也是中途要休息一下。 oracle 所谓的醒来,只是为了释放latch,不一直持有latch吧, 就是cbclatch一样,加锁了就释放,不用等待一直完成。用户体验好,直接出光标。

 

redo大一点好啊

redo 什么时候inactive 什么时候写data header,并不是切换就要写完脏数据,active是不会改数据头的,只有改完数据头,LRBA才会更新,只有dbwr写完才可以覆盖,如果dbwr满,就会出现checkpoint not complete,can not allocate new log等待。

DML一定是current read gets!!

 从锁理解吧

,不然容易模糊, 

 

pga 的作用  读到pga的是行,三个字节‘’yyy‘’

每次读多少行,客户端定的

to client那不是很快,内存间的, from很慢 ,网络间的

时间主要就是找数据的时间了,下面是不是反了,如果按下面的要等待啥?

都是有些迷糊,和我们想的不同

 

 这是一个好的办法,如果一定要这么多数据的话,但是另一方面逻辑读可以忽略不计啦

重点I/O不同

 看次数,不看每次多少,因为异步i/o每次多少大家都差不多。

架构 

 

 

 redo中先记录undo 后记录数据块,所以undo和数据库是一起恢复的,事务表记录在undoheader中,所以和undo在一个数据文件中。

 commit直接修改undo 头就好,fast cleanout?

imu中 undo既然已经在imu中修改了 ,而且也已经写入了redo,为什么buffer中还要修改呢,因为imu不够用时可以在buffer中存取?, 而且undo的文件中的修改还是要dbwr来改。

这就导致数据块先变脏,然后才是undo变脏的。undo变脏只需要刷入undofile中,不用在写入redo(shared pool中redo写)了,已经写过了(imu刷进buffercache中还是有一点redo的)。

redo log buffer 没有好的办法,只有放在快盘

 要重建数据块嘛,不是参数?

 

sync等待就是写等待,所以要快盘,还不能并行。。。

 rac ogg性能影响。 imu CR块构建也会快很多的

buffer busy 等待和redo有关,原因! 

1.块不够多

2块pctused太大

3.redo太慢。。。申请修改锁要先申请undo redo

IMU使用情况

====

undo 重用原则

,是不是就是覆盖次数 SEQ 

Shared pool,

Shardpool 比buffer cache 复杂多了,所以RAC不能实现sharedpool共享,导致IMU不能用

Package 包里面的对象改变,package失效,如果有package body的话,包头不会失效,那么递归调用的包也不会失效

 

2. shared pool latch

上面是library cache , 管理这些cache又是latch了, 所以这个latch名字好理解。

latch 和lock一样,要lock X S方式,取得后就要pin住,如果有等待就是这些等待事件了。

 

轻量级latch mutex 

 

latch lock 都有要锁的过程,本身不是锁,要到锁去链上加锁,mutex不同

 

 

 latch去锁对象,通过hash算法去找cache 链。 互相指向,就是latch获得了。

 

申请期间写上我sid,成功了就去掉。这样别人可以申请

 

 

mutex自我管理能不能共享和独享了。。。 

mutex不等待,不停重试,所以消耗cpu 11g之后要等待10ms,减少cpu消耗 

软软解析为什么快,根据执行计划直接执行就可以了

 

优化 绑定变量,cursor_shared 参数

SQL不同,执行计划相同也不会共用吧。这样不会导致sid之间争用,多个sid还是会争用,又是空间换争用问题。和插日志表buffer busy一样。

 

一次解析多次执行,退出时不关游标

 

 

 

ASM

条带:

本来数据一个AU 一个AU 4Mb的存,条带后AU4m 但是512 k 的存,这样访问2M的时候可以访问四个盘, 根据下面的讲述,要并行才行,一个I/O不行的。

如果不并行访问,就是一个进程,加再多磁盘也是没有提高

最大I/O可以是一个AU,但最小一定是一个block大小  asm undo redo metadata的最小不一样,但都至少一个块大小

 条带化操作

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值