Redo log In-depth(Only for experienced Oracle DBA NOT for Fresher DBA)
昨天看到了一篇关于redo的英文介绍,感觉还不错,特根据自己的理解翻译了一下,这篇文章比较老了,但是还是值得借鉴一下,对于10g或者是11g有些内容还是改变了一些,先在空间记录一下吧。
一般概述:
log buffer 是位于系统全局区域的一个共享区域,它的一些子选项组件也位于oracle的share pool中,redo的大小依赖于操作系统数据块的大小。
1)redo log buffer的原理介绍:
每一个DML语句或者是DDL语句的执行都会写入redo log buffer,当提交事务后,所有的日志条目都会写入到日志文件中去。这个写入进程是一个被称为日志写入的后台进程,被简短的叫做LGWR。
select或者update语句同样 会在redo buffer中生成redo改变条目。
作为一名dba哪么肯定会关心redo的相关细节,并且知道redo log 和归档进行测一些概念。
什么是redo?
就是存储了一些数据库中改变了的重做 数据历史记录。
redo有什么作用?
实例恢复
介质恢复
使用Log Miner utility进行审计和恢复
用于oracle streams utility
redo包含什么?
redo record header
thread -thread number
RBA-Redo byte address
LEN-Length of change number
SCN-system change number,date and time
什么是RBA
rba被称作一个日志的字节地址。大小最大为10比特。它用来确定代表了日志记录的开始地址。rba包括4字节的日志序列号,4字节的日志文件的块的编号,2比特的重做日志记录在日志块中的起始偏移字节数目。
在sga中有下面几种不同的rba类型。
low rba:脏块被修改时记录的第一次redo地址信息叫做 low rba
high rba:脏块被最后一次修改时记录的redo地址叫做high rba
checkpoint rba:当增量检查点到达时,DBWR进程会对buffer cache中的脏块按照检查点序列进行写入数据文件操作,这时会记录检查点的RBA信息。这个RBA会记录在控制文件中反应出检查点进程的记录,当进行实例恢复的时候,会从控制文件的这个开始检查点的rba进行检查。我们可以从oracle的内部试图xtargetrba查看这个rba的信息。
target rba:它代表了这个DBWR进程想要从实例恢复中能够达到的一个提前检查点的rba。
ondisk rba:这个rba记录了是在线日志把redo record刷新到了日志文件时的哪个rba地址。这个rba会记录在控制文件中做一个记录。
这也是实例恢复的一个终点。
log buffer 是怎么进行写操作的呢?
当进程想写入咯个buffer的时候,它会获得一个 redo copy latch,这个latch发生时会保护log buffer 使其LGWR不能把logbuffer内容从logbuffer写入到日志文件。lgwr等到日志record从pga copy到了sga完成后才能进行写入日志文件操作。
当获得redo copy latch 后,进行必须分配也要获得一个redo allocation latch,以便在redo buffer中分配redo space存放copy的record。这个redo allocation latch 会保护sga中log buffer空间的使用和空闲块的管理工作。
一旦获得了redo allocation latch,进行就会立即释放这个latch然后开始从pga或是temporary buffer中把changed record 写入到log buffer中。
当把等到把change vectors copy到log buffer中,所有的改变条目都会被写入各自被分配的redo数据块中。这些日志条目将会打上可用标记,并且会释放redo copy latch。lgwr等到完成了copy工作并且释放了redo copy latch后,才开始执行它的任务。这个时候开始获得redo writing latch去检查lgwr执行任务情况并探测是否lgwr已经被激活。
lgwr进程详细的执行过程。
当lgwr进程被唤醒去把redo buffer的数据写入redo log file的时候,它会获得第一个redo writing latch并且update sga的变量去记录lgwr是被激活的并且也会改变sga的变量去记录使用的和空闲的空间分配情况。当lgwr获得redo allocation lathc的时候,那么它会检查log buffer有没有被前台进程进行写入操作。如果它发现有很多没有完成的进程操作或者是激活的进程,那么它会进入自己的一个休眠期。这个事件被称为”LGWR wait for redo copy"。如果它发现没有激活的进程,那么它开始把redo buffer中的redo record flush到日志文件中去。完成后,那么lgwr会又一次获得redo allocation latch 然后更新(update)sga 中的variable变量去释放并且重新分配log buffer中的空间成为没有被使用的空间状态。
怎么决定log block size的大小?
redo条目的大小是byts,lgwr写入的日志记录在日志文件中的磁盘的块中,因此,日志文件的块大小依赖于操作系统。
可以使用这个命令进行查看log block size的大小:select max(size) from X$kccle;
上面这个命令执行后的结果reflects 了日志文件块的大小。
日志块的大小对于磁盘的读写性能非常的重要。下面的这些参数直接对日志块进行影响
log_checkpoint_interval
max_dump_file_size
_log_io_size
log buffer是怎样写入redo log file的呢?
log buffer 划分操作依据于块的大小,每一个log buffer块都指向了日志文件的块,它不是不是依赖于oracle的块的大小,而是依赖于操作系统块的大小。
当LGWR准备把logbuffer中的信息写入或者flush到日志文件的时候,会有两个sga 变量被分配。一个指向log buffer的第一个开始的块,另一个指向redo 日志文件为end buffer。lgwr 开始把sga的第一个sga变量到end sga 变量写入日志文件。另一个sga变量也在log buffer 中使用index去记录空闲的redo space 去为下一次的使用做准备,当把所有数据写入到了日志文件中,这些变量空间将会被是否为了下一次的使用。这两个sga 变量 也会被redo allocation latch 所保护。也就是说这个redo allocation latch也是在腾出空间需要的。
在log buffer 中写了哪些东西?
所有的改变信息都会被写入到redo logbuffer中,每一个改变条目,叫做change vector。change vector 代表了每一个数据块的改变矢量。
change vector的详细内容:
每一个改变矢量都包含一个头部。这个改变矢量的头部信息包含改变号码,改变类型,操作码。同样改变矢量也包含物理文件的位置,段的id,数据块地址,以及各自的rowid。它也包含数据块的版本号码。
所有数据库中改变的重现都会被记录为change vector 并且记录在redo log buffer中去。每一个改变矢量都会记录单一的dml的操作。每一个改变矢量号码都依赖于段号码的影响和每次改变的执行情况。
我们可以举一个例子去理解其中的内容。
一般概述:
log buffer 是位于系统全局区域的一个共享区域,它的一些子选项组件也位于oracle的share pool中,redo的大小依赖于操作系统数据块的大小。
1)redo log buffer的原理介绍:
每一个DML语句或者是DDL语句的执行都会写入redo log buffer,当提交事务后,所有的日志条目都会写入到日志文件中去。这个写入进程是一个被称为日志写入的后台进程,被简短的叫做LGWR。
select或者update语句同样 会在redo buffer中生成redo改变条目。
作为一名dba哪么肯定会关心redo的相关细节,并且知道redo log 和归档进行测一些概念。
什么是redo?
就是存储了一些数据库中改变了的重做 数据历史记录。
redo有什么作用?
实例恢复
介质恢复
使用Log Miner utility进行审计和恢复
用于oracle streams utility
redo包含什么?
redo record header
thread -thread number
RBA-Redo byte address
LEN-Length of change number
SCN-system change number,date and time
什么是RBA
rba被称作一个日志的字节地址。大小最大为10比特。它用来确定代表了日志记录的开始地址。rba包括4字节的日志序列号,4字节的日志文件的块的编号,2比特的重做日志记录在日志块中的起始偏移字节数目。
在sga中有下面几种不同的rba类型。
low rba:脏块被修改时记录的第一次redo地址信息叫做 low rba
high rba:脏块被最后一次修改时记录的redo地址叫做high rba
checkpoint rba:当增量检查点到达时,DBWR进程会对buffer cache中的脏块按照检查点序列进行写入数据文件操作,这时会记录检查点的RBA信息。这个RBA会记录在控制文件中反应出检查点进程的记录,当进行实例恢复的时候,会从控制文件的这个开始检查点的rba进行检查。我们可以从oracle的内部试图xtargetrba查看这个rba的信息。
target rba:它代表了这个DBWR进程想要从实例恢复中能够达到的一个提前检查点的rba。
ondisk rba:这个rba记录了是在线日志把redo record刷新到了日志文件时的哪个rba地址。这个rba会记录在控制文件中做一个记录。
这也是实例恢复的一个终点。
log buffer 是怎么进行写操作的呢?
当进程想写入咯个buffer的时候,它会获得一个 redo copy latch,这个latch发生时会保护log buffer 使其LGWR不能把logbuffer内容从logbuffer写入到日志文件。lgwr等到日志record从pga copy到了sga完成后才能进行写入日志文件操作。
当获得redo copy latch 后,进行必须分配也要获得一个redo allocation latch,以便在redo buffer中分配redo space存放copy的record。这个redo allocation latch 会保护sga中log buffer空间的使用和空闲块的管理工作。
一旦获得了redo allocation latch,进行就会立即释放这个latch然后开始从pga或是temporary buffer中把changed record 写入到log buffer中。
当把等到把change vectors copy到log buffer中,所有的改变条目都会被写入各自被分配的redo数据块中。这些日志条目将会打上可用标记,并且会释放redo copy latch。lgwr等到完成了copy工作并且释放了redo copy latch后,才开始执行它的任务。这个时候开始获得redo writing latch去检查lgwr执行任务情况并探测是否lgwr已经被激活。
lgwr进程详细的执行过程。
当lgwr进程被唤醒去把redo buffer的数据写入redo log file的时候,它会获得第一个redo writing latch并且update sga的变量去记录lgwr是被激活的并且也会改变sga的变量去记录使用的和空闲的空间分配情况。当lgwr获得redo allocation lathc的时候,那么它会检查log buffer有没有被前台进程进行写入操作。如果它发现有很多没有完成的进程操作或者是激活的进程,那么它会进入自己的一个休眠期。这个事件被称为”LGWR wait for redo copy"。如果它发现没有激活的进程,那么它开始把redo buffer中的redo record flush到日志文件中去。完成后,那么lgwr会又一次获得redo allocation latch 然后更新(update)sga 中的variable变量去释放并且重新分配log buffer中的空间成为没有被使用的空间状态。
怎么决定log block size的大小?
redo条目的大小是byts,lgwr写入的日志记录在日志文件中的磁盘的块中,因此,日志文件的块大小依赖于操作系统。
可以使用这个命令进行查看log block size的大小:select max(size) from X$kccle;
上面这个命令执行后的结果reflects 了日志文件块的大小。
日志块的大小对于磁盘的读写性能非常的重要。下面的这些参数直接对日志块进行影响
log_checkpoint_interval
max_dump_file_size
_log_io_size
log buffer是怎样写入redo log file的呢?
log buffer 划分操作依据于块的大小,每一个log buffer块都指向了日志文件的块,它不是不是依赖于oracle的块的大小,而是依赖于操作系统块的大小。
当LGWR准备把logbuffer中的信息写入或者flush到日志文件的时候,会有两个sga 变量被分配。一个指向log buffer的第一个开始的块,另一个指向redo 日志文件为end buffer。lgwr 开始把sga的第一个sga变量到end sga 变量写入日志文件。另一个sga变量也在log buffer 中使用index去记录空闲的redo space 去为下一次的使用做准备,当把所有数据写入到了日志文件中,这些变量空间将会被是否为了下一次的使用。这两个sga 变量 也会被redo allocation latch 所保护。也就是说这个redo allocation latch也是在腾出空间需要的。
在log buffer 中写了哪些东西?
所有的改变信息都会被写入到redo logbuffer中,每一个改变条目,叫做change vector。change vector 代表了每一个数据块的改变矢量。
change vector的详细内容:
每一个改变矢量都包含一个头部。这个改变矢量的头部信息包含改变号码,改变类型,操作码。同样改变矢量也包含物理文件的位置,段的id,数据块地址,以及各自的rowid。它也包含数据块的版本号码。
所有数据库中改变的重现都会被记录为change vector 并且记录在redo log buffer中去。每一个改变矢量都会记录单一的dml的操作。每一个改变矢量号码都依赖于段号码的影响和每次改变的执行情况。
我们可以举一个例子去理解其中的内容。
sql>insert into dept values (50,'computer','mumbai');
上面语句向dept表中插入了一行数据,但是当我们讨论“check vector”的结果却不仅仅是那么简单一句insert命令
1)事务开始了,然后检查undo 段的头部信息和并在undo 段中分配空间(事务槽),undo的头部会因为这次任务将被修改并产生改变矢量。
2)空间在undo段中被分配,并把这次insert 条目记录在段中记做undo record。改变向量将会为这次任务的执行所分配。
3)数据块的段将被修改然后存储事务的详细细节内容并锁定数据块。改变向量将被分配记录。
4)如果是数据字典管理影响段,那么段列表和空闲区将会被修改。改变向量将被分配去执行这次任务。
5)如果这次事务索引段被涉及到了那么索引段块被修改并记录索引健。改变矢量将被分配去执行这个事务。
6)如果触发器在一个表短重存在,当它flush data到另一个段的时候,这个改变矢量同样会被记录分配去完成这次事务。
7)当审计功能在数据库中开启时,然后执行DML语句符合了审计要求,然后审计条目将会被记录到系统的审计表中。意思就是这个改变矢量将会被操作。
这上面的例子阐述了一个DML操作所产生了改变向量的操作过程。
change vector的用途是什么?
为了重做或者是回滚改变的数据。
在恢复操作过程中它将被使用归档日志内容完成操作。