Oracle数据库关键后台进程运行机制解析

2023年 10月 21日 29.2k 0

目录

  • 一、前言
  • 二、后台进程概述
  • 三、如何查看Oracle数据库后台进程
    • 1、操作系统查看
    • 2、数据库视图查看
  • 四、Oracle数据库中的主要后台进程
  • 五、Oracle数据库主要后台进程说明
    • 1、进程监控进程(PMON)
    • 2、系统监控进程(SMON)
    • 3、数据库块写进程(DBWn)
    • 4、日志写进程(LGWR)
    • 5、检查点进程(CKPT)
    • 6、管理监控进程(MMON and MMNL)
    • 7、恢复进程(RECO)
    • 8、归档进程(ARCn)
  • 六、总结
  • 七、写在后面

一、前言

  Oracle的进程分为用户进程、服务器进程和后台进程。今天绍下Oracle一些重要的后台进程。
 
  Oracle数据库是一种强大而广泛应用于企业级系统的关系型数据库管理系统。它以其高可靠性、高性能和丰富的功能而闻名,被广泛应用于各种规模的业务应用。作为一种复杂而庞大的系统,Oracle数据库的运行需要依赖多个后台进程,这些进程在后台默默地工作,承担着维护数据库的各项任务和责任。它们通过协同工作,确保数据库的稳定性、安全性和高效性,为用户提供可靠的数据存储和访问服务。
 
  本文介绍了常见的后台进程及其功能。通过深入理解这些进程的作用,可以更好地了解Oracle数据库的体系结构,为数据库管理和优化提供指导和支持。需要注意的是,后台进程的数量和名称可能因Oracle版本和配置而有所差异,不同的数据库环境可能存在一些特定的进程。然而,核心的后台进程通常是类似的,其职责和功能也是相似的。

二、后台进程概述

  Oracle实例由两个部分组成:SGA和一组后台进程。Oracle后台进程是Oracle数据库为了保持最佳系统性能和协调多个用户请求而设置的一系列后台进程,每个进程都专注于自己的任务,又与其他进程协同工作,它们负责处理数据库的各种请求、维护数据库的稳定性和安全性。这些进程在数据库启动时被自动启动,并且会在整个数据库运行过程中一直保持运行状态。

图 2-1 Oracle 进程与SGA

三、如何查看Oracle数据库后台进程

1、操作系统查看

[oracle@hellodba ~]$ ps -aef | grep ora_...._$ORACLE_SID | grep -v grep
oracle 9918 1 0 23:39 ? 00:00:00 ora_pmon_hellodb
oracle 9920 1 0 23:39 ? 00:00:00 ora_clmn_hellodb
oracle 9922 1 0 23:39 ? 00:00:00 ora_psp0_hellodb
oracle 9925 1 0 23:39 ? 00:00:01 ora_vktm_hellodb
oracle 9929 1 0 23:39 ? 00:00:00 ora_gen0_hellodb
oracle 9931 1 0 23:39 ? 00:00:00 ora_mman_hellodb
oracle 9935 1 0 23:39 ? 00:00:00 ora_gen1_hellodb
oracle 9939 1 0 23:39 ? 00:00:00 ora_diag_hellodb
oracle 9941 1 0 23:39 ? 00:00:00 ora_ofsd_hellodb
oracle 9945 1 0 23:39 ? 00:00:00 ora_dbrm_hellodb
oracle 9947 1 0 23:39 ? 00:00:00 ora_vkrm_hellodb
oracle 9949 1 0 23:39 ? 00:00:00 ora_svcb_hellodb
oracle 9951 1 0 23:39 ? 00:00:00 ora_pman_hellodb
oracle 9953 1 0 23:39 ? 00:00:00 ora_dia0_hellodb
oracle 9955 1 0 23:39 ? 00:00:00 ora_dbw0_hellodb
oracle 9957 1 0 23:39 ? 00:00:00 ora_lgwr_hellodb
oracle 9959 1 0 23:39 ? 00:00:00 ora_ckpt_hellodb
oracle 9961 1 0 23:39 ? 00:00:01 ora_lg00_hellodb
oracle 9963 1 0 23:39 ? 00:00:00 ora_smon_hellodb
oracle 9965 1 0 23:39 ? 00:00:00 ora_lg01_hellodb
oracle 9967 1 0 23:39 ? 00:00:00 ora_smco_hellodb
oracle 9969 1 0 23:39 ? 00:00:00 ora_reco_hellodb
oracle 9971 1 0 23:39 ? 00:00:00 ora_w000_hellodb
oracle 9973 1 0 23:39 ? 00:00:00 ora_lreg_hellodb
oracle 9975 1 0 23:39 ? 00:00:00 ora_w001_hellodb
oracle 9977 1 0 23:39 ? 00:00:00 ora_pxmn_hellodb
oracle 9982 1 0 23:39 ? 00:00:00 ora_mmon_hellodb
oracle 9984 1 0 23:39 ? 00:00:00 ora_mmnl_hellodb
oracle 9986 1 0 23:39 ? 00:00:00 ora_d000_hellodb
oracle 9988 1 0 23:39 ? 00:00:00 ora_s000_hellodb
oracle 9990 1 0 23:39 ? 00:00:00 ora_tmon_hellodb
oracle 10050 1 0 23:39 ? 00:00:00 ora_tt00_hellodb
oracle 10052 1 0 23:39 ? 00:00:00 ora_tt01_hellodb
oracle 10054 1 0 23:39 ? 00:00:00 ora_tt02_hellodb
oracle 10057 1 0 23:39 ? 00:00:00 ora_aqpc_hellodb
oracle 10061 1 0 23:39 ? 00:00:00 ora_cjq0_hellodb
oracle 10063 1 0 23:39 ? 00:00:00 ora_p000_hellodb
oracle 10065 1 0 23:39 ? 00:00:00 ora_p001_hellodb
oracle 10067 1 0 23:39 ? 00:00:00 ora_p002_hellodb
oracle 10069 1 0 23:39 ? 00:00:00 ora_p003_hellodb
oracle 10071 1 0 23:39 ? 00:00:00 ora_p004_hellodb
oracle 10073 1 0 23:39 ? 00:00:00 ora_p005_hellodb
oracle 10075 1 0 23:39 ? 00:00:00 ora_p006_hellodb
oracle 10077 1 0 23:39 ? 00:00:00 ora_p007_hellodb
oracle 10323 1 0 23:40 ? 00:00:00 ora_qm02_hellodb
oracle 10327 1 0 23:40 ? 00:00:00 ora_q002_hellodb
oracle 10329 1 0 23:40 ? 00:00:00 ora_q003_hellodb
oracle 10383 1 0 23:40 ? 00:00:00 ora_w002_hellodb
oracle 10801 1 0 23:41 ? 00:00:00 ora_w003_hellodb
oracle 10869 1 0 23:42 ? 00:00:00 ora_w004_hellodb
oracle 10999 1 0 23:44 ? 00:00:00 ora_w005_hellodb

2、数据库视图查看

SQL> select paddr,name,description from v$bgprocess where paddr'00' and description is not null order by paddr desc;
PADDR NAME DESCRIPTION
-------------------------------------------------------------------------------------
000000006BDA9818 CJQ0 Job Queue Coordinator
000000006BDA76F8 AQPC AQ Process Coord
000000006BDA34B8 TMON Transport Monitor
000000006BDA0308 MMON Manageability Monitor Process
000000006BD9F278 MMNL Manageability Monitor Process 2
000000006BD9F278 FENC IOServer fence monitor
000000006BD9E1E8 PXMN PX Monitor
000000006BD9C0C8 LREG Listener Registration
000000006BD99FA8 RECO distributed recovery
000000006BD98F18 SMCO Space Manager Process
000000006BD96DF8 SMON System Monitor Process
000000006BD94CD8 CKPT checkpoint
000000006BD93C48 LGWR Redo etc.
000000006BD92BB8 DBW0 db writer process 0
000000006BD91B28 DIA0 diagnosibility process 0
000000006BD90A98 PMAN process manager
000000006BD8FA08 SVCB services background monitor
000000006BD8E978 VKRM Virtual sKeduler for Resource Manager
000000006BD8D8E8 DBRM DataBase Resource Manager
000000006BD8B7C8 OFSD Oracle File Server BG
000000006BD8A738 DIAG diagnosibility process
000000006BD88618 GEN1 generic1
000000006BD864F8 MMAN Memory Manager
000000006BD85468 GEN0 generic0
000000006BD843D8 VKTM Virtual Keeper of TiMe process
000000006BD83348 PSP0 process spawner 0
000000006BD822B8 CLMN process cleanup
000000006BD81228 PMON process cleanup

四、Oracle数据库中的主要后台进程

Process Monitor Process (PMON):进程监控进程
System Monitor Process (SMON):系统监控进程
Database Writer Process (DBWn):数据库块写进程
Log Writer Process (LGWR):日志写进程
Checkpoint Process (CKPT):检查点进程
Manageability Monitor Processes (MMON and MMNL):管理监控进程
Recoverer Process (RECO):恢复进程
Archiver Processes (ARCn):归档进程

五、Oracle数据库主要后台进程说明

1、进程监控进程(PMON)

PMON监控Oracle其他后台进程的健康状态,并在服务器或调度程序进程异常终止时执行进程恢复或者故障转移。
 
PMON负责清理数据库缓冲区缓存并释放客户端进程使用过的资源。例如,PMON重置活动事务表的状态,释放不再需要的锁,并从不活动进程列表中删除进程ID。
 
PMON还向Oracle侦听器注册有关实例和调度程序进程的信息。当实例启动时,PMON轮询监听是否正在运行。如果侦听器正在运行,则PMON会向其传递相关参数。如果它没有运行,则PMON会定期尝试联系它。
 
PMON会跟踪和记录各种警告信息,如参数文件错误等。

2、系统监控进程(SMON)

SMON主要负责数据库的恢复和各种系统级别的清理任务。
 
需要的话,在实例启动时执行实例恢复。如果启动上一次非正常关闭的数据库时,Oracle在打开数据库之前会自动通过重做日志文件对实例进行恢复,确保数据库一致性,然后打开数据库。
 
在Oracle RAC数据库中,一个数据库实例的SMON进程可以对故障实例执行实例恢复。
 
清理未使用的临时段。例如,Oracle 数据库在创建索引时分配扩展数据块。如果操作失败,则 SMON 将清理临时空间。
 
监控表空间使用情况,定期合并字典管理的表空间中的空闲空间。
 
SMON定期检查是否被需要。如果其他进程检测到需要SMON,则可以调用它。

3、数据库块写进程(DBWn)

DBWn主要负责将数据库缓冲区中修改的缓冲区写入磁盘。
 
当数据库缓冲区的块被修改时,它被标记为脏缓冲区并添加到以SCN为顺序的 LRUW(LRUWriter)列表。同时,这个顺序与重做日志缓冲区的顺序一致。
 
尽管一个数据库写进程(DBW0)对于大多数系统来说已经足够了,但可以配置多个DBWn以便在系统大量修改数据时提高写入性能。最多可以启动20个DBWn进程,DBW0到DBW9,以及DBWa到DBWj。通过DB_WRITER_PROCESS参数可以控制DBWn进程的数量。这些额外的 DBWn 进程在单处理器系统上没有用。
 
在以下条件下将触发DBWn:
1.没有可重用的缓存区时,它会向 DBWn 发出写入信号。DBWn 在执行其他处理时尽可能异步将脏缓冲区写入磁盘。
2.DBWn定期写入缓冲区以推进检查点(大约3S)。
3.ckpt进程触发DBWn写进程。
 
多数情况下,DBWn写入的块分散在整个磁盘中。因此,写入往往比LGWR执行的顺序写入慢。DBWn在可能的情况下执行多块写入以提高效率。多块写入中写入的块数因操作系统而异。

4、日志写进程(LGWR)

LGWR主要负责管理重做日志缓冲区并将其内容刷新到联机重做日志文件中。
 
日志写进程(LGWR)管理 REDO LOG BUFFER(重做日志缓冲区)。Oracle数据库通过LGWR进程将 REDO LOG BUFFER 中的数据写入到 REDO LOG FILE。
 
通过将修改的缓冲区、将脏缓冲区分散写入磁盘和将重做日志快速顺序写入磁盘的任务分开,数据库提高了性能。
 
当运行 DML 或 DDL 语句时,服务器进程首先要将事务的变化记载到重做日志缓冲区,然后才会写入数据库缓冲区,并且重做日志缓冲区的内容将会被写入联机重做日志文件。保证事务日志记录写入磁盘。LGWR会确保事务提交前将相关的日志记录刷新到磁盘中。
 
在以下条件下将触发LGWR:
1.用户提交一个事务。
2.在线重做日志切换。
3.距离LGWR上次写入已过去三秒。
4.重做日志缓冲区已满三分之一或包含1MB的缓冲数据。
5.DBWR进程触发。(在DBWn写入脏缓冲区之前,必须将与缓冲区更改相关的重做记录写入磁盘(预写协议)。如果DBWn发现一些重做记录尚未写入,它会向LGWR发出信号,将记录写入磁盘,并等待 LGWR 完成,然后再将数据缓冲区写入磁盘。)
 
LGWR和COMMIT
Oracle数据库使用快速提交机制来提高已提交事务的性能。当开启一个事务时,事务会被分配一个SCN(系统更改编号)。LGWR将提交记录放入重做日志缓冲区,并立即将其与提交SCN和事务的重做条目一起写入磁盘。
 
重做日志缓冲区是循环使用的,当 LGWR 将重做日志缓冲区中的重做条目写入联机重做日志文件后,服务器进程可以在重做日志缓冲区中已写入磁盘的条目上进行复用。LGWR 通常写入速度足够快,以确保缓冲区中始终有空间可用于新条目,即使访问在线重做日志很繁重也是如此。Oracle数据库向提交事务返回成功代码,尽管数据缓冲区尚未写入磁盘。对数据块的相应更改被推迟,直到DBWn有效地将它们写入数据文件为止。
LGWR 可以在事务提交之前将重做日志条目写入磁盘。仅当事务稍后提交时,受重做条目保护的更改才会成为永久性更改。
 
当用户提交时,LGWR将事务的重做条目写入磁盘。在写入期间,如果有其他用户提交,在前一次写入完成之前,LGWR无法写入磁盘以提交这些事务。完成后,LGWR可以在一个操作中写入等待事务(尚未提交)的重做条目列表。通过这种方式,数据库可以最大限度地减少磁盘I/O并最大限度地提高性能。如果提交请求以高速率继续,那么LGWR的每次写入都可能包含多个提交记录。

图 4-1 重用在线重做日志文件

5、检查点进程(CKPT)

CKPT主要负责执行检查点来更新数据文件头和控制文件中的信息,帮助减少实例恢复所需要的时间量。
 
检查点进程(CKPT)用于更新控制文件和数据文件头,当执行检查点时,系统向 DBWn 发出信号将数据缓冲区中数据的变化写入磁盘。同时完成对数据文件和控制文件的更新,记录下当前数据库的结构和状态。
 
在以下条件下将触发CKPT:
1.日志切换时。
2.数据库实例关闭时。
3.手动执行检查点操作(alter system checkpoint)。

图 5-1 检查点进程

6、管理监控进程(MMON and MMNL)

MMON主要负责监控和调节SGA内存使用情况。
 
MMON执行许多AWR相关的任务。例如,当指标违反其阈值时,MMON 会写入、拍摄快照并捕获最近修改的 SQL 对象的统计信息值。
 
监控SGA的内存使用,跟踪共享池、缓冲区高速缓存等SGA组件的内存分配和使用情况。并根据内存使用情况,自动调整共享池大小以释放或申请更多SGA内存。跟踪缓冲区缓存的使用情况,监控缓冲区缓存中脏块的数量,并发出写回请求。优化内存的分配和使用,将未使用的内存重新分配给需要的SGA组件。生成内存监控报告,收集内存使用情况并生成相关报告。跟踪共享池锁等待,找出导致共享池争用的SQL语句。优化执行SQL语句的内存,分析SQL语句的内存需求并优化内存分配。
 
MMNL主要负责共享服务器连接管理和监控的后台进程。
MMNL将统计数据从SGA中的活动会话历史(ASH)缓冲区写入磁盘。当ASH缓冲区已满时,MMNL会写入磁盘。
 
监控共享服务器进程的连接和会话,跟踪每个服务器进程处理的用户连接和会话数量。均衡调度会话请求,根据服务器进程的负载情况,将新的用户会话请求分配给负载较轻的进程。监控服务器进程状态,检测和报告服务器进程的异常终止等问题。共享服务器进程管理,在需要时启动或终止服务器进程。参数和规则管理,根据配置和规则动态调整共享服务器的相关参数。性能统计,收集服务器进程的性能和统计数据。问题诊断,分析并报告共享服务器相关的性能或故障问题。共享池管理,与MMON协同,管理共享池的内存使用情况。

图 6-1 Automatic Workload Repository (AWR)

7、恢复进程(RECO)

RECO进程主要用于解决分布式事务中的故障。
 
RECO用于解决分布式数据库中由于网络或系统故障导致挂起的分布式事务。在规定的时间间隔内,本地的RECO进程会试图连接到远程数据库,并自动完成挂起的分布式事务在本地的提交或回滚。

8、归档进程(ARCn)

ARCn主要用于存档重做日志文件。
 
在发生重做日志切换后,ARCn进程负责将重做日志复制到归档日志文件中,这样可以保留所有重做记录。这些进程还可以收集事务重做数据,并将其传输到备用数据库目的地。只有当数据库处于ARCHIVELOG模式并且启用了自动存档时,ARCn进程才存在。

六、总结

  Oracle 后台进程在数据库系统中扮演着关键的角色。通过对后台进程的了解和管理,可以提升数据库的稳定性、安全性和性能。深入研究后台进程的技术文档将为数据库管理员和开发人员提供有价值的参考,帮助他们更好地理解和应用Oracle数据库。

七、写在后面

由于本人有限的能力和知识储备,可能存在错误或疏漏之处,如有错误敬请批评指正!

 
公众号:Hello DBA
 

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论