来自辛明老师:
1.redo的作用
保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。
2.redo功能的实现
redo log buffer
lgwr
redo log file
3.redo log详解
change vector(改变向量):对数据库内某一个数据块所做的一次变更
redo records(重做记录):由一组改变向量组成,数据库的最小恢复单位
例如一个update的重做记录就包括回滚段的改变向量和相应数据块的改变向量
update emp set sal=4000 where sal=7788;
a.检查empno=7788的记录在buffer_cache中是否存在,若不存在则读取到buffer_cache中
b.在回滚表空间的相应回滚段的事务表中分配事务槽,这个操作需要记录redo信息
c.从回滚段读入或者在buffer_cache中创建sal=3000的前镜像,这个操作需要记录undo信息
d.修改sal=4000,这是update的数据变更,需要记录redo信息
e.当用户提交时,会在redo log buffer记录提交信息,并在回滚段标记该事务为非激活(inactive)
4.redo与数据库恢复
当用户在buffer_cache中修改数据时,oracle并不会立即将修改的数据写出到数据文件中,这样做效率很低,
oracle为了减少IO的次数,当修改过的数据达到一定数量后,进行高效的批量写出
正是因为提交时不强制刷脏数据块,所以为了保证数据库发生故障时可以恢复,oracle引入了redo机制
由于redo机制对于数据的保护,当数据库发生故障时,oracle就可以通过redo重演进行数据恢复,
那么一个非常重要的问题就是,恢复应该从何处开始?
如果读取的redo过多,必然导致恢复的时间过长,oracle通过检查点(checkpoint)来缩短恢复的时间
当检查点发生时,oracle会通知dbwr进程,把修改过的数据从buffer_cache写入磁盘,在检查点完成后,
ckpt进程会将相应的检查点信息写入控制文件和数据文件头
在检查点完成之后,此检查点之前的修改过的数据都已经写回磁盘,重做日志文件中的相应的重做记录对于
实例恢复不再有用。如果此后数据库崩溃,那么恢复只需要从最后一次完成的检查点开始恢复即可。如果
数据库运行在归档模式,日志文件在重用之前必须写出到归档文件
5.检查点的分类
完全检查点:dbwr以最高优先级写出脏数据块
——非abort方式关闭数据库
——alter systemcheckpoint
增量检查点:dbwr不一定刷脏数据块
——每隔三秒钟执行一次:只记录控制文件
——每次日志切换:记录控制文件和数据文件头部
6.redo的数量
a.set autotrace traceonly:查询每个操作的redo量
b.v$mystat:查询当前session产生的redo量
select n.name,m.value
from v$statname n,v$mystat m
where n.STATISTIC# = m.STATISTIC#
and n.name =‘redo size’;
c.v$sysstat:查询数据库实例启动以来累积生成的redo量
select name,value
from v$sysstat
where name =‘redo size’;
7.redo写的触发条件
a.每3秒钟
b.redo log buffer1/3满
c.redo log buffer达到1M
d.用户提交
e.在dbwr写之前