在oracle數(shù)據(jù)庫中,執(zhí)行數(shù)據(jù)修改時(shí)都會(huì)產(chǎn)生相應(yīng)的日志信息,
undo日志:
undo日志用于存放數(shù)據(jù)被修改前的值,如果一個(gè)事務(wù)做回滾或某種原因執(zhí)行失敗了,需要根據(jù)undo日志中記錄的原數(shù)據(jù)做數(shù)據(jù)恢復(fù);
redo日志:
undo日志是保存數(shù)據(jù)修改前的值,redo日志可以理解為保存數(shù)據(jù)修改后的值,數(shù)據(jù)需要做修改時(shí),需要將數(shù)據(jù)讀到buffer pool中,然后在buffer pool中做修改。寫到redo日志中去,此時(shí)數(shù)據(jù)時(shí)沒有持久化到數(shù)據(jù)庫文件中去的,如果此時(shí)發(fā)生異常中斷,或數(shù)據(jù)丟失,可以根據(jù)redo中記錄的修改后的數(shù)據(jù)做數(shù)據(jù)恢復(fù),持久化到數(shù)據(jù)庫文件中去。
undo日志在保存原數(shù)據(jù)時(shí)會(huì)被分配數(shù)據(jù)塊,在修改做回滾操作之后,undo被分配的數(shù)據(jù)塊還是存在的,所以會(huì)有可能存在一些經(jīng)常做新增刪除的表數(shù)據(jù)量不多的情況下查詢異常的慢,這是由于每次全表查詢會(huì)去掃描之前undo保存原數(shù)據(jù)的數(shù)據(jù)塊;
undo和redo日志不一定同時(shí)存在,和數(shù)據(jù)庫的策略有關(guān),steal、no steal、force、no force策略分別和這兩個(gè)日志有關(guān);
steal:允許在事務(wù)commit之前把內(nèi)存中的數(shù)據(jù)寫入磁盤。此時(shí)需要undo ,undo日志可以保證做數(shù)據(jù)回滾能恢復(fù)原數(shù)據(jù);
no steal:不允許在事務(wù)commit之前把內(nèi)存中的數(shù)據(jù)寫入磁盤,在commit之前數(shù)據(jù)并未寫入到磁盤,此時(shí)數(shù)據(jù)文件中的數(shù)據(jù)還是原數(shù)據(jù),數(shù)據(jù)回滾不需要undo日志來恢復(fù)原數(shù)據(jù);
force:內(nèi)存中的數(shù)據(jù)最晚在commit的時(shí)候?qū)懭氪疟P。不需要redo ,
no force:內(nèi)存中的數(shù)據(jù)可以一直保留,在commit之后過一段時(shí)間再寫入磁盤。此時(shí)需要redo,因?yàn)閿?shù)據(jù)在系統(tǒng)崩潰的時(shí)候可能還沒寫入到磁盤,如果不redo,磁盤上的數(shù)據(jù)就是不完整的