【问题标题】:When does DBwn update buffers in Database buffer cache to database disk?DBwn 何时将数据库缓冲区缓存中的缓冲区更新到数据库磁盘?
【发布时间】:2016-11-13 09:50:58
【问题描述】:

我正在学习一些关于Oracle数据库架构的基础知识,有两个例子。

  1. 执行数据操作语言 (DML) 语句所涉及的步骤。
  2. 执行 COMMIT 命令所涉及的步骤。

Executing DML steps

步骤如下:

  1. 服务器进程接收语句并检查库缓存中是否存在包含类似 SQL 语句的任何共享 SQL 区域。 如果找到共享 SQL 区域,则服务器进程检查用户的 请求数据的访问权限,以及现有的共享 SQL 区域用于处理语句。如果没有,一个新的共享 SQL 区域 为语句分配,以便它可以被解析和 已处理。
  2. 如果数据和撤消段块尚未在缓冲区缓存中,则服务器进程将它们从数据文件中读取到 缓冲区缓存。服务器进程锁定将要保存的行 修改。
  3. 服务器进程记录对数据缓冲区所做的更改以及撤消更改。这些更改被写入 内存数据和撤消缓冲区之前的重做日志缓冲区 修改的。这称为预写日志记录。
  4. 撤消段缓冲区包含修改前的数据值。撤消缓冲区用于存储之前的图像 数据,以便在必要时可以回滚 DML 语句。这 数据缓冲区记录数据的新值。
  5. 用户从 DML 操作中获得反馈(例如操作影响了多少行)。

COMMIT Process steps

步骤如下:

  1. 服务器进程将提交记录连同系统更改号 (SCN) 一起放入重做日志缓冲区。 SCN 是单调的 递增并且在数据库中是唯一的。
  2. LGWR 后台进程执行所有重做日志缓冲区条目的连续写入,直到并包括提交记录到 重做日志文件。
  3. 如果修改的块仍在 SGA 中,并且如果没有其他会话正在修改它们,则数据库删除与锁相关的事务 来自块的信息。
  4. 服务器进程向用户进程提供有关事务完成的反馈。

第一个问题:服务器进程或后台进程最终是否将重做日志文件移动或迁移到数据文件?如果是,这个过程怎么做?

感谢 Nicholas Krasnov 和 JSAPkota cmets。不存在这种“迁移”过程,因为它们用于不同的目的。数据文件是数据库的数据,重做日志文件用于恢复数据库。 DBWn 负责将数据写入数据文件,LGWR 将重做日志缓冲区写入磁盘上的活动重做日志文件。

我的第二个问题:DBwn(Database writer process) 何时将缓存中的缓冲区修改为数据库磁盘?在 COMMIT 之前或之后更新数据库磁盘。

【问题讨论】:

  • 不,他们没有,LGWR(日志写入器后台进程)将重做日志(仅更改向量)从重做日志缓冲区写入红色日志文件。 DBWR(Database Writer Process)将脏缓冲区(缓冲区缓存上的修改块,实际数据)写入数据文件。
  • move or migrate Redo log files to Data files? 数据文件和重做日志文件占用了两种完全不同类型的文件。一个永远不会“迁移”到另一个。他们在那里服务于不同的目的

标签: sql oracle


【解决方案1】:

DBwn 不会因为发出commit 语句而写入数据库文件。 Commit 只是表示这是事务的结束。表或行上的锁被释放,SCN 递增,LGWR 写入 SCN 并更改在线重做日志文件。

数据库缓冲区缓存有两个列表

1) Write list
2) least-recently-used (LRU) list

最近最少使用 (LRU) 列表有脏缓冲区。脏缓冲区是那些被修改的缓冲区。提交将间接使缓冲区变脏。它将在缓冲区中,因为它最近被访问过。

DBwn 在提交之前和之后都不会写入数据文件。它有自己的场景,例如检查点发生或脏缓冲区达到阈值或没有空闲缓冲区等。

希望,我回答了你的问题。谢谢。

【讨论】:

猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多