关键字(Keyword):数据库(database),实例(instance),体系结构,内存,SQL
本文将数据库问题诊断的基础---数据库的体系结构和基本动作流程,并通过寄存行李服务来帮助“理解”。
01
—
理解数据库的体系结构
使用数据库过程中遇到的问题可能是千奇百怪的,难以预测的,所以仅仅靠总结各种问题集合来诊断问题的话,如果遇到新问题的话,是很难解决的。
纵使它有千变万化,我有一计定海神针。即理解理解数据库的体系结构和基本动作流程,以不变应万变。
实例(Instance)和物理数据库(Database)
我们首先明确2个概念:实例(Instance)和物理数据库(Database)。

▲Figure 1-1 Oracle Instance and Database (Database Concepts)
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/introduction-to-oracle-database.html#GUID-8F2EEEC8-0372-4419-88FF-7D77A9C0FCAD
如上图所示,我们通常所说的数据库其实可以分为实例(Instance)和物理数据库(Database)2个部分。
简单而言,实例(Instance)指后台进程/线程和内存结构,如 PMOM、SMOM、DBW、LGWR、CKPT等后台进程和服务器进程,以及 shared pool、db buffer Cache、redo log buffer等内存区域。物理数据库(Database)指存储数据的物理文件 ,如数据文件、控制文件、重做日志、归档日志等物理文件。
单实例数据库而言,实例(Instance)和物理数据库(Database)的对应关系为1对1;RAC (real application cluster) 构成的情况下,实例(Instance)和物理数据库(Database)的对应关系为1对多,即实例可以分别在不同服务器上,而数据文件存储在共享的磁盘阵列上,多实例可同时对物理数据库进程操作。
寄存行李服务图(简化的体系结构图)
如果将整个数据库处理流程类比成火车站寄存行李服务的话,我们可以将数据库体系结构简化成如下内容(以下内容为高度抽象和概括的信息,和实际略有不同):
1. 客户,存行李或者取行李。2. 前台服务员,提供服务。3. 前台,临时存放寄存行李。4. 后台工作人员,负责将前台行李搬运到仓库间。5. 仓库,用于存放行李。

▲简化的数据库体系结构图1
以上内容对应到数据库的各部分如下:
1. 客户端进程,即用户的客户端,通过发行SQL语句来实现业务的需要。2. 服务器进程,用于接收客户端的SQL/PL/SQL语句,进行解析和执行,访问内存中的相关数据,将数据文件中的数据载入内存。3. 数据库内存结构,用于临时处理的数据4. 后台进程, 将内存中的数据保存到数据文件。5. 物理文件,用于永久的存放数据
如果进一步细化一下寄存前台的主要工作,可以包括下面3类:
1. 接待工作, 接受用户的存取请求。2. 搬运工作,根据请求处理行李。3. 登记工作,将存取结果登记入册
并且放在仓库中的物品也可以细化为如下2类:
1. 行李2. 登记册
这样简化的数据库体系结构图变成如下:

▲简化的数据库体系结构图2
相对应地,数据库内存的主要区域的相关工作包括下面内容:
1. 共享池(shared pool),用于处理缓存SQL游标,SQL语句解析,执行等工作2. 数据库缓冲区(Database buffer cache),用于处理从数据文件中读取的数据块,更改数据块等工作,主要关联进程为DBW,服务器进程3. 日志缓冲区(redo log buffer),用于记录 DML和DDL操作对数据块的更改,主要关联进程为LGWR
物理文件主要包括控制文件,数据文件,日志文件。
02
—
寄存行李服务(数据库基本动作)流程
由此,寄存行李服务(客户操作数据库)可以分下如下几类:
取行李(查询数据)的过程:1. 客户发出取行李请求。(客户端发行SQL)2. 前台服务员,接受用户的取行李请求。(解析和执行SQL)3. 根据请求开始处理行李,如果前台有相应的行李话,直接提供给客户;(buffer cache中有相应数据块,直接返回查询结果给客户端)4. 如果前台没有的话,前台人员去仓库搬运来。(buffer cache中没有相应数据块,服务器进程读取数据文件)5. 前台人员,根据情况从仓库搬运行李。(服务器从数据文件读取相应数据块)6. 前台提供给客户行李。(返回查询结果给客户端)
存行李(插入数据)的过程:
1. 客户发出存行李请求。(客户端发行SQL)2. 前台服务员,接受用户的存行李请求。(解析和执行SQL)3. 根据请求开始处理行李,将行李打包或贴上标签(buffer cache中取得空块,修改数据块)4. 登记信息入册(在 Log Buffer中写Redo信息)5. 请后台人员将行李搬入仓库。(DBW将相应数据块写入数据文件)6. 前台将存行李结果反馈给客户。(返回Insert结果给客户端)7. 后台人员非同期将登记册搬入仓库。(LGWR非同期将Redo信息写入更新日志,服务器进程无需等待)
1. 客户发出替换行李中的物品请求。(客户端发行SQL)2. 前台服务员,接受用户的替换请求。(解析和执行SQL)3. 根据请求开始处理行李,如果相应的行李还在前台的话,替换物品。(buffer cache中有相应数据块,修改数据块)4. 如果行李没在前台的话,前台从仓库搬运来。(buffer cache中没有相应数据块,服务器进程读取数据文件)5. 前台人员,根据情况从仓库搬运行李。(服务器进程从数据文件读取相应数据块)6. 在前台替换物品。(buffer cache中修改数据块)7. 登记信息入册(在 Log Buffer中写Redo信息)8. 前台将替换结果反馈给客户。(返回Update结果给客户端)9. 后台人员非同期将登记册搬入仓库。(LGWR非同期将Redo信息写入更新日志,服务器进程无需等待)
1. 客户同意签字确认。(客户端发行Commit)2. 前台服务员,接受用户的请求。(解析和执行SQL)3. 前台服务员提供登记册给用户签字后,前台等待后台反馈。(在 Log Buffer中写Redo信息,服务器进程等待)4. 后台人员将登记册搬入仓库。(LGWR将Redo信息写入更新日志)5. 前台接收到后台反馈, 将结果反馈给客户。(返回Commit结果)
本文主要介绍了数据库的基本体系结构和动作流程,并通过寄存行李服务来帮助“理解”,希望对你有所帮助。
※本文主要对前一篇中关于服务器进程和DBWR进程的动作进行了修正
※特别感谢峰哥的指正
专注于技术不限于技术!
用碎片化的时间,一点一滴地提高数据库技术和个人能力。
欢迎关注微信订阅号:Oracle数据库技术(TeacherWhat)
原文作者:SQL和数据库技术;如有侵权,请联系管理员删除。