1.1DBWR的作用:将修改后的dirty缓冲数据写入到文件中,
触发的条件主要有:
No free buffers;
checkpoint(会触发内存中的数据都往磁盘上写)
drop table/truncate table
1.2LGWR(Log writer,日志写入进程):将日志数据从日志缓存中写入到redolog文件中。是顺序写
触发的条件:
at commit;
when one-third full
every 3 seconds
defore DBWR writers
其中较重要的就是当你一COMMIT时,只要返回成功就说明已经log_buffer写到日志文件中,
还有一个就是LGWR进程一定是先于DBWR的。
DBWN(db_buffer与db_file)和 LGWR(log_buffer与log_file) 以及写入相应的文件中的关系:
从是否COMMIT来看分两种
一:未进行COMMIT,
则:有三种情况
1,两者将缓存中的数据都写入到 盘中,则:断点后开机,oracle会到日子文件中根据PBA和SCN标记,记录从该点起开始进行数据回滚,因为没有进行COMMINT,所以该数据不该改变存入到db_file文件中,因此oracle 从日志文件中读取出要undo/roll_backward的语句,进行反向处理,将写入到磁盘中的数据去除,回滚到之前的数据。如:你对一个表格进行了先插入一条数据再修改了该条数据,还未COMMINT,现在断电,再开机时,oracle按事物发生的顺序进行执行,而该先插入后修改的操作是一个事物(要不都成功,要不都失败),但在这个事物的内部会先从后面的语句反着执行,再执行前面的语句,即先修改后删除。
至于日志文件具体从哪点开始进行恢复或undo 这还有待研究!!!(这是很重要的)
2.日志缓存写入到日志文件中,但数据缓存没有写入到db_file中,则日志文件中的语句不重新执行,对它不作任何处理,因为您没有进行commit,该改变的数据是不该存在的,即不该将改变的数据写入到磁盘中。
3.若是两者缓冲都没有写入则数据没法恢复!!
二:进行了COMMIT由于进行了commit,则日志缓冲一定写入到redolog日志文件中,所有数据一定能恢复.但是若commit之后数据还在db_buffer中并没有写入到db_file中,则这就要开机的时候从日子文件中,根据从某个点开始进行恢复,即是redo/roll-forward,安照事物发生的先后顺序重新执行一次。