关于redo的几个小知识点
关于redo,可能不了解的小知识点,我也不知道是否总结的就对,不过先总结着吧。
1、主机掉电,会导致实例失败,在重启db时需要实例恢复。
2、在实例恢复时,oracle可以根据redo日志,将系统恢复到实例失败的那个时刻。
3、一般能用undo的情况也就是我们执行了rollback或者恢复时的回滚。
4、手动管理undo段是,需要我们手动建立或删除undo段,而自动管理undo时,oracle会自动创建或销毁undo段。
5、 在回滚时,oracle会将undo应用到数据块和索引块上,使数据块和索引块恢复。如果此时数据块和索引块已经被写到磁盘上了(大事务),那oracle会将这些块读入缓存,然后再应用undo回滚。
6、在回滚时,不需要redo,redo的读只是用在恢复和归档时。
7、commit的开销:
会增加与数据库间的通信。
commit会等待redo写磁盘,等待事件为log file sync。
8、当发生事务时,会在SGA中生成undo块、已经修改的块、生成对于前2项缓存的redo块。
9、每次commit,scn就会加1。
10、触发器对redo的影响
DML操作 AFTER BEFOR AFTER BEFORE
(10g 以前) (10g 以前) (10g) (10g)
DELETE 不影响 不影响 不影响 不影响
INSERT 增加redo 增加redo 常量redo 常量redo
UPDATE 增加redo 不影响 增加redo 增加
11、当db是nologg模式的话,ddl几乎是不会被记录redo的。如果生产redo的话,也是为了保护更新数据字典而生成的。
12、我们可以对索引设置nologging模式,那如果在重建索引时,那岂不是就可以缩短时间啦。
13、insert时,临时表几乎不产生redo的,但会产生undo,而在产生undo时会产生undo相应的redo,所以说临时表只是会产生相当少的redo。而delete时,临时表和普通表产生的redo一样多,update时临时表产生的redo是普通表的一半。