我正在学习一些关于Oracle数据库体系结构的基本知识,下面有两个例子。
- 执行数据操作语言(DML)语句所涉及的步骤。
- 执行COMMIT命令的步骤。
执行DML步骤
步骤如下:
- 服务器进程接收到语句并检查库缓存中是否有任何包含类似SQL语句的共享SQL区域。如果发现共享SQL区域,则服务器进程检查用户的请求数据的访问权限,以及现有的共享SQLArea用于处理语句。如果没有,则创建一个新的共享SQL区域为语句分配,以便对其进行解析和处理。
- 如果数据和撤销段块还没有在缓冲缓存中,服务器进程将它们从数据文件中读取到缓冲区缓存。服务器进程锁定将被删除的行修改。
- 服务器进程记录对数据缓冲区进行的更改以及撤消更改。这些更改被写入重做日志缓冲区在内存数据和撤销缓冲区之前修改。这被称为预写日志。
- undo段缓冲区包含数据被修改前的值。撤销缓冲区用于存储文件的前图像数据,以便在必要时回滚DML语句。的数据缓冲区记录数据的新值。
- 用户从DML操作中获得反馈(例如操作影响了多少行)。
COMMIT进程步骤
步骤如下:
- 服务器进程在重做日志缓冲区中放置一条提交记录,以及系统更改号(SCN)。SCN是单调的递增,并且在数据库中唯一。
- LGWR后台进程将所有重做日志缓冲区条目(包括提交记录)连续写入到重做日志文件。
- 如果被修改的块仍然在SGA中,如果没有其他会话正在修改它们,那么数据库将删除与锁相关的事务来自block的信息。
- 服务器进程向用户进程提供关于事务完成的反馈。
第一个问题:服务器进程或后台进程是否最终将重做日志文件移动或迁移到数据文件?如果是,该流程如何进行?
感谢Nicholas Krasnov &JSapkota评论。不存在这种"迁移"过程,因为它们服务于不同的目的。数据文件是数据库的数据,Redo日志文件用于恢复数据库。DBWn负责将数据写入数据文件,LGWR负责将重做日志缓冲区写入磁盘上的活动重做日志文件。
我的第二个问题:什么时候DBwn(数据库写进程)修改缓存中的缓冲区到数据库磁盘?在COMMIT前或COMMIT后更新数据库磁盘
DBwn将不会因为发出commit
语句而写入数据库文件。Commit
表示这是交易的结束。释放表或行上的锁,增加SCN, LGWR
将SCN写入在线redolog文件。
数据库缓存有两个列表
1) Write list
2) least-recently-used (LRU) list
最近最少使用(LRU)列表有脏缓冲区。脏缓冲区是那些被修改过的缓冲区。提交将间接地使缓冲区变脏。它将在缓冲区中,因为它最近被访问过。
DBwn
在提交之前或之后都不写入数据文件。它有自己的场景,如检查点发生或脏缓冲区达到阈值或没有空闲缓冲区等。