Oracle写入数据流程

1.Oracle dml操作——执行,首先在log buffer中记录语句,在butfer cache中执行更改,修改数据块。
然后LGWR进程根据上述规则,将redo buffer中的信息写入到物理文件。此过程比较快,redo log为连续写。
(redo buffer中的内容会被写入联机重做日志文件,若系统发生断电,内存中的redo buffer 内容会丢失,但是磁盘上的redo log file不会丢失)
完成后,DBWN会将buffer cache中脏数据块对应的原始数,复制到undo表空间,然后更新数据。(随机写,比较慢)。
期间ckpt进程根据3秒的原则,作检查点,记录哪些脏数据写到了datafile中(这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到那里了。)
将需要的信息记录在控制文件中。若实例崩溃或需要错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。
此时根据事务是否提交了,未提交的事务,根据 undo表空间的数据进行恢复 (常说的undo,后滚操作)

2.事务开始
在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中
事务修改buffer cache的数据块,该数据被标识为“脏数据”,同时写入log buffer中(先记录到log buffer 再修改 buffer cache)
事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;
当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的胜数据写入到数据文件中。

3.假设现在有一张员工工资表,员工号 7899 的员工张三工资为 8000,由于工作表现良好,现在为其加薪到 10000。
1> 此时,第一次读取,需要将数据从数据文件读入数据库高速缓冲区。
2> 数据读入数据库高速缓冲区后,我们修改数据的条目先记录入重做日志缓冲区。
3> 接着新数据被写入数据库高速缓冲区
4> 提交,LGWR 进程将条目从重做日志缓冲区写入联机重做日志文件
5> 执行检查点 CKPT,同步数据库,发现联机日志文件为最新,同步更新数据文件、控制文件,触发了DBWn进程

posted @ 2023-03-10 10:31  狍zz  阅读(264)  评论(0)    收藏  举报