oracle教程:浅写Oracle Online Redo Logfiles
时间:2012-12-02 08:06 来源: 翻译器在线 作者:52ij
Online Redo Logfiles就是联机日志文件,联机日志文件是干嘛用的呢?这个就得跟Oracle的运行机制有关系了。
联机日志文件用于记录对数据库的改变,防止数据丢失。这里的数据丢失指的当然是数据文件上的数据了,一般的SQL操作提取的永久性数据都是从数据文件里面提取的。那么联机日志文件可以防止应该写入数据文件中的数据丢失,由此可见在永久性数据写入磁盘上的数据文件前,就已经将数据以某种方式写入了联机日志文件里面,那么联机日志文件里面的数据又是从何而来?联机日志文件里面的数据从日志缓冲区(Redo Log buffer)中来。那日志缓冲区中的数据又从何而来?日志缓冲区里面的数据是在用户通过工具向数据库里面书写数据的时候,Oracle自动将数据存入数据缓冲区,并且以一个改变因子(change Vectors)描述一次对某个数据库的改变,然后在后台进程LGWR把日志缓冲区的东东写入联机日志文件中时,是以一系列的改变因子为单位,其实就是“日志条目”的形式写入Online Redo Logfiles。并且LGWR会赋予一个系统改变号给联机日志文件,用于标识联机日志文件改变的时间,这个就是system change number即SCN。SCN可以用于标识事务的日志条目。只有当“日志条目“被成功写到了磁盘上的联机日志文件中,这个事务的提交commit work才算完成。

可以想象下为什么当事务写入了联机日志文件才算是commit完成,而不是日志文件,也不是缓冲区?
答案很简单,因为你对数据文件做recover时用的就是联机日志文件,那么说明数据从Data Buffer中写入数据文件之前 ,Redo Log Buffer中的日志条目已经被写入联机日志文件中了,作为对数据库改变的标志了,并赋予了SCN了。当然为什么commit不是指写入缓冲区中就完成了呢?如果commit是以写入缓冲区中就完成的话,那么一旦数据库崩溃,比如说断电,你commit了的数据就会被擦除,也就是说本来你commit了的数据应该被永久保存的,但是由于断电的原因被擦除了,这显然是不可接受的。所以commit是以日志缓冲区中的日志条目写入联机日志文件中为结束的,这样的话,用户commit了的事务在磁盘上就有了标识,可以永久保存了。
那么联机日志文件满了怎么办?那就得切换联机日志文件了,所以联机日志文件至少有两个组,这个满了还有另一个,对吧。那么如果我的一个联机日志组数据由于某种原因数据丢失了怎么办?这就需要多元化联机日志文件组了,就是每个联机日志组为了安全起见,可以每个联机日志文件组中存在3~4个联机日志文件,当然这些联机日志文件的内容是一样的,就像control files多元化是一样的。那么如果我的联机日志文件太大,恢复起来岂不是需要很长时间?当然了,需要把联机日志文件里的对数据库的修改恢复到数据文件里面,时间当然由联机日志组中的文件大小决定,那么我们需要做的就是让联机日志文件组中的联机日志文件不至太大,但是为了保证每次LGWR从日志缓冲区中向联机日志文件中书写时不会因为日志文件已满而导致等待,我们就需要多建几个日志文件组。
那么什么操作会导致LGWR将Redo Log Buffer中的日志条目写入Online Redo Files呢?
1、每隔3秒;
2、Redo Log Buffer中已满1/3的容量;
3、Redo Log Buffer中有将近1MB的数据;
4、用户执行提交commit work;
5、系统执行checkpoint 时;
如果我的所有联机日志组都满了,系统会干吗呢?当然是擦除原先的旧数据,填入新数据。那么我想保持数据库的所有记录怎么办?那么就将联机日志文件归档吧~~~在数据库mount状态下alter database archivelog ,然后再open 数据库,这样的话,就可以从数据库诞生那刻起,记录对数据库的所有改变,如果你的归档日志文件没被删除的话。
联机日志文件用于记录对数据库的改变,防止数据丢失。这里的数据丢失指的当然是数据文件上的数据了,一般的SQL操作提取的永久性数据都是从数据文件里面提取的。那么联机日志文件可以防止应该写入数据文件中的数据丢失,由此可见在永久性数据写入磁盘上的数据文件前,就已经将数据以某种方式写入了联机日志文件里面,那么联机日志文件里面的数据又是从何而来?联机日志文件里面的数据从日志缓冲区(Redo Log buffer)中来。那日志缓冲区中的数据又从何而来?日志缓冲区里面的数据是在用户通过工具向数据库里面书写数据的时候,Oracle自动将数据存入数据缓冲区,并且以一个改变因子(change Vectors)描述一次对某个数据库的改变,然后在后台进程LGWR把日志缓冲区的东东写入联机日志文件中时,是以一系列的改变因子为单位,其实就是“日志条目”的形式写入Online Redo Logfiles。并且LGWR会赋予一个系统改变号给联机日志文件,用于标识联机日志文件改变的时间,这个就是system change number即SCN。SCN可以用于标识事务的日志条目。只有当“日志条目“被成功写到了磁盘上的联机日志文件中,这个事务的提交commit work才算完成。

可以想象下为什么当事务写入了联机日志文件才算是commit完成,而不是日志文件,也不是缓冲区?
答案很简单,因为你对数据文件做recover时用的就是联机日志文件,那么说明数据从Data Buffer中写入数据文件之前 ,Redo Log Buffer中的日志条目已经被写入联机日志文件中了,作为对数据库改变的标志了,并赋予了SCN了。当然为什么commit不是指写入缓冲区中就完成了呢?如果commit是以写入缓冲区中就完成的话,那么一旦数据库崩溃,比如说断电,你commit了的数据就会被擦除,也就是说本来你commit了的数据应该被永久保存的,但是由于断电的原因被擦除了,这显然是不可接受的。所以commit是以日志缓冲区中的日志条目写入联机日志文件中为结束的,这样的话,用户commit了的事务在磁盘上就有了标识,可以永久保存了。
那么联机日志文件满了怎么办?那就得切换联机日志文件了,所以联机日志文件至少有两个组,这个满了还有另一个,对吧。那么如果我的一个联机日志组数据由于某种原因数据丢失了怎么办?这就需要多元化联机日志文件组了,就是每个联机日志组为了安全起见,可以每个联机日志文件组中存在3~4个联机日志文件,当然这些联机日志文件的内容是一样的,就像control files多元化是一样的。那么如果我的联机日志文件太大,恢复起来岂不是需要很长时间?当然了,需要把联机日志文件里的对数据库的修改恢复到数据文件里面,时间当然由联机日志组中的文件大小决定,那么我们需要做的就是让联机日志文件组中的联机日志文件不至太大,但是为了保证每次LGWR从日志缓冲区中向联机日志文件中书写时不会因为日志文件已满而导致等待,我们就需要多建几个日志文件组。
那么什么操作会导致LGWR将Redo Log Buffer中的日志条目写入Online Redo Files呢?
1、每隔3秒;
2、Redo Log Buffer中已满1/3的容量;
3、Redo Log Buffer中有将近1MB的数据;
4、用户执行提交commit work;
5、系统执行checkpoint 时;
如果我的所有联机日志组都满了,系统会干吗呢?当然是擦除原先的旧数据,填入新数据。那么我想保持数据库的所有记录怎么办?那么就将联机日志文件归档吧~~~在数据库mount状态下alter database archivelog ,然后再open 数据库,这样的话,就可以从数据库诞生那刻起,记录对数据库的所有改变,如果你的归档日志文件没被删除的话。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/130.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
