问题
详细描述用户连接数据库,执行update语句commit结束后,数据库内部的运行流程。
答案
commit操作
检查点机队列中相关数据块的提交状态修改为已提交
释放持有的锁资源
返回给用户进程提交完成的信息
Buffer Cache & DBWR Buffer Cache 其实就是磁盘数据文件的缓存,以修改块的操作为例,如update,只是修改Buffer Cache中的Buffer,修改完成后,update操作就算完工了。这样Buffer和磁盘中的Block就不一致了,Buffer中有用户最新修改的数据,这些数据还没有写入磁盘。这样的Buffer就是脏Buffer(也可称脏块)。脏块由DBWR进程统一写磁盘,脏块写入磁盘后就不是脏块了,所以DBWR写脏块这个过程,也叫刷新脏块
CKPT & DBWn & LGWR
CKPT会触发数据库写进程(DBWn),通知DBWn将当前检查点队列中已标记为提交状态的数据块从缓存高速缓冲区读出并写入到数据文件中(database buffer cache -> datafiles) ,DBWn在执行前会首先触发一次日志写,确保写入数据文件的提交过的数据块所对应的的重做条目都已持久化在联机重做日志文件中(redo log buffer -> online redo log files) 。 在DBWn把检查点队列记录的所有已提交的数据块全部成功写入数据文件后,CKPT会用控制文件头记录SCN把数据库全部的数据文件头的SCN字段值刷新一遍,刷新完成后,每个数据文件头的的SCN字段值和控制文件保持一致(一致性数据库的标志)。
原理大图 解析Redo数据流 详细解析update语句的过程
|