LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

oracle如何工作保障数据一致性?

时间:2012-07-05 11:18来源:未知 编辑:admin 点击:
当发生DML操作时, 先记在redo_buffer中,再记到db_buffer中(先写日志,再写数据),然后redo_buffer中的数据由LGWR按照触发条件适时写入redo_file中, db_buffer中的数据则由DBWR按照触发条件适时写入db_f
db_buffer,db_file,DBWR,redo_buffer,redo_file,LGWR如何共同工作保障数据一致性?
当发生DML操作时, 先记在redo_buffer中,再记到db_buffer中(先写日志,再写数据),然后redo_buffer中的数据由LGWR按照触发条件适时写入redo_file中, db_buffer中的数据则由DBWR按照触发条件适时写入db_file中,现假设存在一个commit了的DML操作,和一个未commit了的DML操作,那么将出现如下情况;

1. 对于commit了的DML操作,该操作在commit时一定会被LGWR从redo_buffer中写入redo_file(因为LGWR的触发条件之 一就是commit),但该操作在commit时不一定会被DBWR从db_buffer中写入db_file(因为commit并非DBWR的触发条 件),那么此时数据库失败时恢复时,若发现该DML操作尚未写入db_file,数据库将去redo_file中找到该已经commit了的操作,进行 redo重做操作; 若该操作已写入db_file,就无须进行redo重做操作了。

2. 对于未commit的DML操作,该操作可能会被LGWR从redo_buffer中写入redo_file(当LGWR的其他触发条件发生时),也可能 未写入redo_file. 同样,该操作也可能会被DBWR从db_buffer中写入db_file,也可能未写入db_file,即总共出现以下四种情况:

2.1 该操作未写入redo_file,也未写入db_file,那么发生数据库失败恢复时,数据库将直接丢弃该DML操作,反正该操作尚未commit,丢掉了也没关系;

2.2  该操作已写入redo_file,而未写入db_file,那么发生数据库失败恢复时,数据库将去到redo_file中找到该DML操作数据库先进行redo,再进行undo,因为sql语句之间有关联,不能简单的丢弃;

2.3 该操作未写入redo_file,而已写入db_file,这种情况不可能发生,因为LGWR触发的条件中,有一条就是DBWR发生时,LGWR也将被同 时触发,即发生DBWR时,LGWR必同时发生,也即DBWR将db_buffer中的数据写入db_file中时,LGWR一定会同时将 redo_buffer中的数据写入redo_file,因此这种操作未写入redo_file,而已写入db_file的情况是不可能发生的;

2.4 该操作已写入redo_file,也已写入db_file,那么发生数据库失败恢复时,数据库将去到redo_file中找到该DML操作,数据库先进行redo,再进行undo,因为sql语句之间有关联,不能简单的丢弃。

转载请保留固定链接: https://linuxeye.com/database/661.html

------分隔线----------------------------
标签:db_bufferdb_fileDBWRredo_bufferredo_fileLGWR
栏目列表
推荐内容