文章目录
-
- 1、整体架构
- 2、数据库实例
-
- 2.1、系统全局区
-
- 2.1.1、共享池
- 2.1.2、大池
- 2.1.3、缓冲区高速缓存
- 2.1.4、In-Memory 内存区
- 2.2、程序全局区
- 2.3、后台进程
-
- 2.3.1、PMON
- 2.3.2、PMAN
- 2.3.3、LREG
- 2.3.4、SMON
- 2.3.5、DBWn
- 2.3.6、CKPT
- 2.3.7、MMON & MMNL
- 2.3.8、RECO
- 2.3.9、LGWR
- 2.3.10、ARCn
- 2.3.11、CJQ0
- 2.3.12、RVWR
- 2.3.13、FBDA
- 2.3.14、SMCO
- 2.3.15、Dnnn & Snnn
- 3、数据库
-
- 3.1、数据文件
- 3.2、系统文件
- 3.3、应用容器
- 3.4、自动诊断信息库
- 3.5、备份文件
如果觉得文章有用,欢迎评论、点赞、推荐
1、整体架构
一个数据库实例(database instance)包含了一组后台进程(background processes)和相应的内存结构。主要的内存结构包括系统全局区 SGA(System Global Area)以及程序全局区 PGA(Program Global Area)。后台进程负责对数据文件中的数据进行操作,并且通过内存结构实现这些操作。数据库实例只存在于内存中。
Oracle 数据库还会创建多个服务器进程(server processes)处理数据库连接,它们代表了客户端程序执行操作。例如,解析和运行 SQL 语句、检索和返回查询结果。这类服务器进程也被称为前台进程(foreground processes)。
更多关于 Oracle 数据库实例的信息可以参考官方文档。
2.1、系统全局区
共享池可以分为以下几个组成部分:
- 库缓存(Library cache):用于存储可执行的 SQL 和 PL/SQL 代码。库缓存包含共享 SQL 和 PL/SQL 区以及控制结构,例如锁和库缓存句柄。当用户执行一个 SQL 语句时,数据库尝试重用以前执行过的代码;如果某个解析后的 SQL 语句可以共享,数据库直接执行该代码。这种行为被称为软解析(soft parse)或者库缓存命中(library cache hit)。否则,数据库必须重新构建可执行的代码版本,被称为硬解析(hard parse)或者库缓存未命中(library cache miss)。
- 保留池(Reserved pool):用于分配连续的大块内存。数据库以块(chunk)为单位分配共享池中的内存。分块技术允许将大对象(超过 5 KB)加载到缓存中,而不需要申请连续的内存区域。这种方式减少了由于碎片而耗尽连续内存的可能性。
- 数据字典缓存(Data dictionary cache):用于存储关于数据库对象的信息(也就是字典数据)。数据字典缓存也称为行缓存(row cache),因为它以行的形式缓存数据,而不是缓冲区。
- 服务器结果缓存(Server result cache):用于存储查询结果的内存池。服务器结果缓存包含 SQL 查询结果缓存和 PL / SQL 函数结果缓存,它们使用相同的基础结构。SQL 查询结果缓存存储了查询结果和查询片段,大多数应用程序都可以通过这种缓存提高性能。PL / SQL 函数结果缓存存储了函数的执行结果。 函数结果缓存适用于经常被调用的函数,并且它们的结果依赖于相对静态的数据。
- 其他组件:包括队列(enqueue),锁存器(latch),信息生命周期管理(ILM)位图表,活动会话历史(ASH)缓冲区和其他的内存结构。队列是一种共享的内存结构(锁),可以实现数据库资源的序列化访问。队列可以与一个会话或者事务相关。例如控制文件事务队列、数据文件队列、实例恢复队列、介质恢复队列、事务恢复队列、作业队列等等。锁存器是低级别的序列化控制机制,用于保护 SGA 中共享数据结构的并发访问。例如行缓存对象锁存器、库缓存 pin 锁存器和日志文件并行写锁存器。
关于共享池的更多信息,可以参考官方文档。
2.1.2、大池
数据库缓冲区高速缓存(database buffer cache),或者简称缓冲区高速缓,是 SGA 中存储数据块拷贝的内存区域。一个缓冲区就是一个数据库块大小的内存块。每个缓冲区包含一个地址,称为数据库缓冲区地址(DBA)。所有连接到数据库实例的用户共享缓冲区高速缓存。缓冲区高速缓存的目标是优化物理 I/O,将经常访问的数据块保留在缓冲区高速缓存中,并且将不经常访问的数据块写入磁盘。
用户进程第一次需要特定的数据时,数据库将会在缓冲区高速缓存中查找数据;如果发现缓存中已存在的数据(缓存命中),就可以直接从内存中读取数据;如果进程无法在缓存中找到数据(缓存未命中),它就必须在访问数据之前将数据块从磁盘上的数据文件复制到缓存中的缓冲区中。通过缓存命中访问数据比缓存未命中时更快。
缓冲区的管理通过一个复杂的算法来实现,该算法结合了最近最少使用(LRU)列表和访问计数。LRU 可以确保最近访问最多的数据库倾向于保留在内存中,从而最大程度地减少磁盘访问。
数据库缓冲区高速缓存包含了以下组件:
- 默认池(Default pool):数据块默认的缓存区域。默认块的大小为 8 KB。除非手动配置其他缓冲池,默认情况下只创建默认池 。其他可选池的配置不会影响默认池。
- 保留池(Keep pool):用于缓存经常访问,但是由于默认池缺少空间导致过期的数据块。保留池的作用是在内存中保留指定的对象,从而避免 I/O 操作。
- 回收池(Recycle pool):用于不频繁访问的数据块。回收池可防止指定的对象对缓存不必要的占用。
- 非默认缓冲池(Non-default buffer pools):适用于 2 KB,4 KB,16 KB 和 32 KB 非标准块大小的表空间。每个非默认块大小的表空间都有其自己的缓冲池。这些缓冲池的管理和默认池相同。
- 数据库智能闪存缓存(Database Smart Flash Cache):可以使用闪存设备来增加缓冲区高速缓存的有效大小,而不是增加更多的内存。 闪存缓存可以将数据库缓存中频繁访问的数据存储到闪存中,避免磁盘读取来提高数据库性能。当数据库请求数据时,系统首先在数据库缓冲区高速缓存中进行查找;如果找不到数据,则在数据库智能闪存缓存中查找;如果还找不到数据,才会访问磁盘。对于 Oracle RAC 环境,要么所有的实例都配置闪存缓存,要么都不配置。
- 最近最少使用列表(LRU):包含指向脏缓冲区和非脏缓冲区的指针。 LRU 列表有一个热端和一个冷端。冷缓冲区是最近未使用过的缓冲区,热缓冲区经常被访问并且最近被使用过。从概念上讲,只有一个 LRU,但是支持数据并发访问,数据库实际上使用了多个 LRU。
- 检查点队列
-
闪存缓冲区(Flash Buffer Area):包含一个 DEFAULT 闪存 LRU 链和一个 KEEP 闪存 LRU 链。如果没有数据库智能闪存缓存,当进程尝试访问某个数据块并且该块在缓冲区缓存中不存在时,将会从磁盘读入数据块到内存(物理读取)。当内存中的缓冲区高速缓存已满时,将会基于最近最少使用(LRU)机制将缓冲区从内存中逐出。如果使用了数据库智能闪存缓存,后台的数据库写进程(DBWn)会在逐出干净缓冲区时将其中的内容写入闪存缓存,同时缓冲区的头部信息会保存在 DEFAULT 闪存 LRU 列表或者 KEEP 闪存 LRU 列表中,具体取决于缓存对象的 FLASH_CACHE 属性。KEEP 闪存 LRU 列表用于将缓冲区头部信息保留在单独的列表中,以防止常规缓冲区的头部信息将其替换。因此,具有 KEEP 属性的对象的闪存缓冲区头部信息可以保留更长时间。如果 FLASH_CACHE 对象属性设置为 NONE,
系统不会在闪存缓存或内存中保留相应的缓冲区。当再次访问已过期的内存缓冲区时,系统将检查闪存缓存;如果找到了缓冲区,将会从闪存缓存中再次读回,这种方式消耗的时间只占磁盘读取的一小部分。RAC环境中闪存缓冲区的一致性维护方式与缓存融合相同。因为闪存缓存是扩展缓存,而直接路径 I/O 完全绕过了缓冲区缓存,所以该功能不支持直接路径 I/O。注意,系统不会将脏缓冲区放入闪存缓存中,因为写入闪存缓存不会计入检查点,必须将缓冲区读取到内存中才能对它们进行检查点。
关于数据库缓冲区高速缓存的更多信息,可以参考官方文档。
2.1.4、In-Memory 内存区
- 在共享服务器环境中,多个客户端用户共享服务器进程。UGA 被移动到大池中,PGA 中只包含堆栈空间、哈希区、位图合并区。
- 在专用服务器会话中,PGA 包含了以下组件:
- SQL 工作区:用于数据排序的内存区,例如 ORDER BY 和 GROUP BY。
- 会话内存:用于存储用户会话变量,例如登录信息和数据库会话所需的其他信息。OLAP 池用于管理 OLAP 数据页,相当于数据块。
- 私有 SQL 区:用于存储已解析的 SQL 语句信息和其他用于数据处理的会话信息。当服务器进程执行 SQL 语句或 PL/SQL 代码时,进程使用私有 SQL 区存储绑定变量值、查询执行的状态信息和查询的工作区。同一会话或不同会话中的多个私有 SQL 区可以指向 SGA 中的同一个执行计划。持久区(persistent area)包含了绑定变量的值,运行区(run-time area)包含了查询执行的状态信息。游标(cursor)是私有 SQL 区中指定区域的名称或句柄,客户端可以将游标看作一个指针,服务器可以将游标看作一个状态。因为游标与私有 SQL 区关系紧密,这两个术语有时可以互换使用。
- 堆栈空间:用于存储会话变量和数组。
- 哈希区:用于执行表的哈希连接。
- 位图合并区:用于合并从多个位图索引扫描中检索到的数据。
关于程序全局区的详细介绍,可以参考官方文档。
2.3、后台进程
进程监视器进程(Process Monitor Process)PMON 负责定期扫描所有的进程并发现异常终止的进程。PMON 还负责协调进程的清理操作,具体操作由清理主进程(Cleanup Main Process)CLMN 和清理从属进程(Cleanup Slave Process)CLnn 执行。
PMON 以操作系统进程运行,不支持线程模式。除了数据库实例之外,PMON 也可以在 Oracle 自动存储管理(ASM)实例和 Oracle ASM 代理实例上运行。
2.3.2、PMAN
LREG 可以作为一个操作系统线程或进程运行。除了数据库实例之外,LREG 还可以在 Oracle 自动存储管理(ASM)实例和 Oracle RAC 上运行。
2.3.4、SMON
通常 BWn 写入的数据块分散在整个磁盘中,因此这种写入比日志写进程 LGWR 的顺序写入慢很多。DBWn 尽可能地执行多块写入以提高性能。不同操作系统中批量写入的块数量不同。
初始化参数 DB_WRITER_PROCESSES 设置了数据库写进程的数量,取值可以从 1 到 100。前 36 个数据块写进程的名字为 DBW0-DBW9 和 DBWa-DBWz,第 37 到 100 个数据库写进程的名字为 BW36-BW99。数据库基于 CPU 数量和处理器组设置合适的 DB_WRITER_PROCESSES 默认值,或者调整用户指定的配置。
2.3.6、CKPT
MMON 从 SGA 中收集各种内存统计信息,过滤之后每隔 60 分钟在 AWR 中创建一个统计快照。快照频率默认为 60 分钟,也可以修改该设置。MMON 还会执行自动数据库诊断监视(ADDM)分析并且针对超出其阈值的指标发出警 。
MMNL 收集会话统计信息(例如用户 ID、状态、主机以及正在执行的 SQL)并且存储到活动会话历史(ASH)缓冲区中。具体来说,MMNL 每秒钟对 SGA 中的 V$SESSION 和 V$SESSION_WAIT 视图进行抽样,将数据记录在 V$ACTIVE_SESSION_HISTORY 视图中。非活动的会话不会进行抽样。ASH 是内存中的一个循环缓冲区,因此更早的信息可能被覆盖。当 ASH 缓冲区填满或者 MMON 创建快照时,MMNL 将 ASH 缓冲区刷新(清空)到 AWR 中的 DBA_HIST_ACTIVE_SESS_HISTORY 视图。由于空间有限,只有十分之一的数据会被刷新。另外,MMNL 还会计算各种指标。
MMON 和 MMNL 都可以作为操作系统线程或者进程运行。除了在数据库实例中运行之外,它们也可以运行在 Oracle ASM 实例中。
更多相关的信息可以参考以下内容:
- 管理 SYSAUX 表空间。
- 管理自动工作负载资料库(AWR)。
- 活动会话历史统计。
2.3.8、RECO
LGWR 处理非常快速或必须协调的操作,并且委托日志写工作帮助进程(Log Writer Worker helper processes)LGnn 执行这些操作。多个 LGnn 可以利用并发操作将日志缓冲区中的重做写入重做日志文件,并且在完成写操作后通知给正在等待的前台进程。
重做传输从属进程(Redo Transport Slave Process)TT00-zz 负责将当前在线或者备用重做日志中的重做项发送到配置了异步(ASYNC)重做传输的远程备用目标。
LGWR 可以作为一个操作系统线程或者进程运行。除了在数据库实例中运行之外,LGWR 也可以运行在 Oracle ASM 实例中。Oracle RAC 环境中的每个数据库实例都拥有自己的重做日志文件。
2.3.10、ARCn
作业队列协调器进程(Job Queue Coordinator Process)CJQ0 负责从数据字典中挑选需要执行的作业任务并创建作业队列从属进程(Job Queue Slave Processes)Jnnn 执行这些任务。CJQ0 随着 Oracle Scheduler 的需要自动启动和停止。初始化参数 JOB_QUEUE_PROCESSES 指定了可以创建的最大作业进程数量。CJQ0 基于需要执行的任务数量和可用资源创建相应数量的作业队列从属进程。
Jnnn 负责执行 CJQ0 分配的作业。Jnnn 执行作业的过程如下:
- 收集执行作业所需的元数据,例如程序参数和权限信息。
- 以作业的拥有者启动一个数据库会话,开始一个事务并执行作业。
- 执行完成后提交并结束事务。
- 关闭会话。
完成作业之外,Jnnn 执行以下操作:
- 根据需要重新安排作业。
- 更新作业表的状态,标明作业已经完成还是计划再次执行。
- 插入一条记录到作业日志表中。
- 根据需要更新运行次数、失败次数以及重试次数。
- 执行清理操作。
- 查看新的作业任务,如果没有则进入睡眠状态。
CJQ0 和 Jnnn 都可以作为操作系统线程或者进程运行。
2.3.12、RVWR
当修改表的事务提交时,FBDA 检查新生成的 undo,找出与归档对象相关的信息并将其复制到闪回数据归档表空间中。FBDA 维护了当前数据行的元数据并记录了已经归档的数据量。
FBDA 还负责自动管理闪回数据归档的空间、组织(分区表空间)和保留策略,以及跟踪事务的归档进度。
FBDA 可以作为一个操作系统线程或者进程运行。
2.3.14、SMCO
Snnn 和 Dnnn 都可以作为操作系统的线程或者进程运行。除了在数据库实例中运行之外,Dnnn 还可以在共享的服务器上运行。
关于 Dnnn 和 Snnn 与大池的交互,可以参考上文中的大池部分。
3、数据库
3.1、数据文件
Oracle 数据库在运行期间需要使用以下数据库系统文件,它们都位于数据库服务器中。数据文件是属于数据库容器的物理文件,上文已经介绍过,因此没有列出。
- 控制文件(Control files):用于存储关于数据文件和在线重做日志文件信息(例如文件名和状态)的必要文件。这些信息用于实例打开数据库。控制文件中还包含了数据库未打开时可以访问的元数据。强烈建议在数据库服务器中创建多个控制文件的副本,实现高可用性。
- 参数文件(Parameter file):配置数据库实例的必要文件,启动实例时需要读取该文件。参数文件可以是一个初始化参数文件(pfile)或者服务器参数文件(spfile)。
- 在线重做日志文件(Online redo log files):记录数据库变更的必要文件,用于数据恢复。
- 自动诊断信息库(ADR):ADR 是一个基于文件的资料库,用于记录数据库的诊断数据,例如跟踪文件、转储文件、告警日志、健康监控 告等。ADR 提供了一个支持多产品和多实例的统一目录结构。数据库、Oracle ASM、监听器、Oracle 集群件以及其他 Oracle 产品和组件都可以在 ADR 中存储诊断信息。每个产品的每个实例都在 ADR 中拥有自己的主目录。
- 备份文件(Backup files):用于恢复数据库的可选文件。当介质故障或用户错误损坏或删除了原始文件时,可以使用备份文件进行还原。
- 归档重做日志文件(Archived redo log files):包含数据库实例连续历史数据变更的可选文件。使用归档重做日志文件和数据库备份文件可以恢复丢失的数据文件。也就是说,归档日志可以恢复还原后的数据文件。
- 口令文件(Password file):可选文件,允许用户使用 SYSDBA、SYSOPER、SYSBACKUP、SYSDG、SYSKM、SYSRAC 以及 SYSASM 角色远程连接数据库,执行管理任务。
-
钱包文件(Wallets):对于应用程序通过密码认证连接数据库的大型部署场景,可以将认证信息存储在客户端的 Oracle wallet 中。
Oracle wallet 是一个安全的软件容器,用于存储身份验证和签名凭证。可选的钱包包括用于用户凭证的 Oracle wallet、用于透明数据加密(TDE)的加密钱包以及用于数据库云备份模块的 Oracle 公共云(OPC)钱包。虽然钱包文件是一个可选的文件,但是官方 推荐使用。 - 块变更跟踪文件(Block change tracking file):块变更跟踪技术通过在文件中记录变更的数据块,从而提高增量备份的性能。在增量备份时,RMAN不再需要扫描所有的数据块识别发生过变化的数据块,而是通过该文件识别需要进行备份的数据块。块变更跟踪文件是一个可选的文件。
-
闪回日志(Flashback logs):闪回数据库的作用类似于普通的时间点恢复,它可以将数据库返回到最近的某个时间点。不同之处在于闪回数据库使用自己的日志记录机制,创建闪回
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!