(1条消息)理解redo(3)详解一个update的过程_数据库_记录
创业路上的一些想法-CSDN博客
理论解析:
1)server process 搜索buffer cache中是否有update要更新的block(内存中又名buffer),没有则从disk读入
buffer cache
2)server process 构造一组change vector来记录对数据块的改动(此时放于PGA中),这组change vector组
成 redo record
这里可能有4个数据块会被改动:
回滚段的段头块:相应的事务表上标注事务信息,其中包括了xid,uba等;并且分配回滚块
数据块的块头块:分配事务槽,标注事务信息,其中包含了xid,uba等
回滚块:记录前镜像
数据块:修改
3)用redo record 的大小判断需要多少redo log buffer空间
4)判断current scn,将其存到redo record(不同的redo record可能会共享同样的SCN值,用change vector
header里面的值SEQ加以区别)
5)获得redo copy latch,接着获得redo allocation latch
6)查看当前是否有其它process比当前持有的SCN 更高的SCN值,有的话生成一个新SCN,替换第4步中的
SCN。总之,保存最新的scn。
7)判断是否有足够的redo log buffer空间,具体如下:
如果redo log buffer没有足够空间,释放redo copy latch,redo allocation latch,释放后如果此时有其
它进程或条件出发了LGWR则要等待lgwr完成,如果此时LGWR没启动,则触发lgwr 启动(需要redo writing latch,
从LOG BUFFER 把redo record写入online current redo log file中时 LGWR进程会一直占着这个LATCH,防止
其他process同时触发LGWR,其它process要尝试获得该latch必须等待,还会获得redo allocation latch 防止有
新的change vector继续写入log buffer,造成LGWR无法确定应该写多少redo),当没有足够空间时,释放完redo
copy/allocation latch后,会立刻尝试获取redo writing latch 获取不到 就表明lgwr被其他process启动了,等待,
继续尝试,获取到后会先检查log buffer是否有空间了(因为前面LGWR 可能释放了大量redo log buffer空间)此
时要是有空间了 释放redo writing latch,然后获得redo copy/allocation latch,没空间的话触发lgwr,并且释放
redo writing latch(把这个latch给了lgwr).如果没有空间,且lgwr 将redo log buffer 里面的redo record 写入
online current redo logfile时 ,redo logfile空间不足不够写入时,则process会检查是否有其它process启动了
switch logfile,如果没有则触发switch logfile,有其他进程启动了,则当前进程等待,switch logfile 后,继续让lgwr
写入redo log buffer .(注意switch log时候 禁止生成redo)
评论