Process Types
|-1.User Processes
|-2.Oracle Processes |- 2.1 Server Processes
|- 2.2 Background Processes
1、用户进程(User Processes):即通过应用系统(如:ERP系统)或者数据库客户端工具(如:Oracle Enterprise Manager、SQLPlus)访问数据库产生的进程;
2、Oracle进程:其中又包含两小类,一个是服务器进程(Server Processes),另一个是后台进程(Background Processes)。
User Processes
通过应用系统(如:ERP系统)或数据库客户端工具(如:Oracle Enterprise Manager、SQLPlus)访问数据库产生的进程。
Connection、Session、User Processes
Connection、Session、User Processes三者的概念有些接近,常常被混淆。
连接(Connection)是在用户进程和数据库实例中间的一个简单的物理回路-----也可以说是网络连接。
会话(Session):是存在于数据库实例中的逻辑实体。
上边的官方描述还不太好理解,老紫竹的文章 白话Oracle的连接和会话的区别(Connection/Session) ,我觉得解释的比较通俗易懂:
有A/B两个城市,需要从A运送白菜到B城,我们先建设一条公路然后运送白菜过去,包括准备白菜和运送白菜以及返回等一系列的动作。
一条公路,可以运送0-n次的白菜,当然从A到B的公路也可能不只一条。某一次运送白菜,可以在真正上路时才开通某一条道路,一次运送不会影响别的运送的状态
对应数据库,A代表客户端进程,B代表服务器端进程,公路代表连接,运送一次白菜代表一个会话。
一个连接可以进行多次的会话,一个会话可以不依赖于某个连接,甚至没有连接(当我准备好了,真正开始运送时再建立连接),一个会话不会影响别的会话。
Server Processes
服务器进程就是代表客户进程完成工作的进程。应用系统向数据库发送的SQL语句最后就要由服务器进程接收并执行。
当你向数据库提交一个SELECT * FROM EMP 查询时,会有一个Oracle 专用/共享服务器进程解析这个查询,并把它放在共享池中(或者最好能发现这个查询已经在共享池中)。这个进程要提出执行计划,如果必要,还要执行这个执行计划,可能在缓冲区缓存中找到必要的数据,或者将数据从磁盘读入缓冲区缓存中。
这些服务器进程是干重活的进程。在很多情况下,你都会发现这些进程占用的系统CPU 时间最多,因为正是这些进程来执行排序、汇总、联结等等工作,几乎所有工作都是这些进程做的。
服务器进程包含以下几项主要工作:
- Parse and run SQL statements issued through the application, including creating and executing the query plan
- Execute PL/SQL code
- Read data blocks from data files into the database buffer cache (the DBWn background process has the task of writing modified blocks back to disk)
- Return results in such a way that the application can process the information
Background Processes
Oracle实例包括两部分:SGA和一组后台进程。 后台进程执行保证数据库运行所需的实际维护任务。
例如,有一个进程为我们维护块缓冲区缓存,根据需要将块写出到数据文件。另一个进程负责当在线重做日志文件写满时将它复制到一个归档目标。另外还有一个进 程负责在异常中止进程后完成清理,等等。每个进程都专注于自己的任务,但是会与所有其他进程协同工作。例如,负责写日志文件的进程填满一个日志后转向下一 个日志时,它会通知负责对填满的日志文件进行归档的进程,告诉它有活干了。
非RAC环境,非ASM环境,通常包含以下几种后台进程:
- Database writer process (DBWn)
- Log writer process (LGWR)
- Checkpoint process (CKPT)
- System monitor process (SMON)
- Process monitor process (PMON)
- Recoverer process (RECO)
- Job queue coordinator (CJQ0)
- Job slave processes (Jnnn)
- Archiver processes (ARCn)
- Queue monitor processes (QMNn)
可以通过
V$BGPROCESS视图查看当前运行后台进程。
SQL> select * from v$bgprocess order by paddr desc;
PADDR PSERIAL# NAME DESCRIPTION ERROR
---------------- ---------- ----- ---------------------------------------------------------------- ----------
07000000FF4EFA70 1 SMON System Monitor Process 0
07000000FF4EEA00 2 DBW3 db writer process 3 0
07000000FF4ED990 1 DIA0 diagnosibility process 0 0
07000000FF4EC920 1 VKTM Virtual Keeper of TiMe process 0
07000000FA52E340 159 VKRM Virtual sKeduler for Resource Manager 448
07000000FA4F7C10 6 QMNC AQ Coordinator 0
07000000FA4F5B30 19 SMCO Space Manager Process 0
07000000FA4F4AC0 1 RECO distributed recovery 0
07000000FA4F3A50 1 DBW2 db writer process 2 0
07000000FA4F29E0 1 MMAN Memory Manager 0
07000000FA4F1970 1 GEN0 generic0 0
07000000F951B890 1 MMON Manageability Monitor Process 0
07000000F951A820 2 LGWR Redo etc. 0
07000000F95197B0 1 DBW0 db writer process 0 0
07000000F9518740 1 DIAG diagnosibility process 0
07000000F95176D0 1 PMON process cleanup 0
07000000F8572BD8 1 CJQ0 Job Queue Coordinator 0
07000000F856D9A8 1 MMNL Manageability Monitor Process 2 0
07000000F856C938 1 CKPT checkpoint 0
07000000F856B8C8 1 DBW1 db writer process 1 0
PADDR PSERIAL# NAME DESCRIPTION ERROR
---------------- ---------- ----- ---------------------------------------------------------------- ----------
07000000F856A858 1 DBRM DataBase Resource Manager 0
07000000F85697E8 1 PSP0 process spawner 0 0
00 0 RSMN Remote Slave Monitor 0
DBWn - 数据块写入器(Database Block Writer)
数据库块写入器是负责将脏块写入磁盘的后台进程。
DBWn的性能可能很重要。如果它写出块的速度不够快,不能很快释放缓冲区,就会看到Free Buffer Waits和Write Complete Waits的等待数和等待时间开始增长。
最多可以配置多大20个DBWn。如果你的系统资源足够充裕,可以利用多个DBWn来分布工作负载,保持SGA中的一个大缓冲区缓存“干净”,将脏的(修改过的)块刷新输出到磁盘。
LGWR - 日志写入器
LGWR进程负责将SGA中重做日志缓冲区的内容刷新输出到磁盘。
满足以下某个条件的时候,LGWR就会启动工作:
- 每3秒会刷新输出一次;
- 任何事务发出一个提交时;
- 重做日志缓冲区1/3满,或者已经包含1 MB的缓冲数据;
(Oracle引入重做日志缓冲区的目的是用于数据恢复。Oracle在执行任何DML和DDL操作改变数据之前,都会将恢复所需要的信息,先写入重做日志缓冲区,然后再写入 数据库高速缓冲区。 )
Redo Log有两种:
online Redo log files--在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。
Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。
重做日志的简单原理:在数据更新操作commit前,将更改的SQL脚本写入重做日志。主要用于数据库的增量备份和增量恢复。
ARCn:归档进程
ARCn进程的任务是,当LGWR将在线重做日志文件填满时,就将其复制到另一个位置,这些归档重做日志文件可以用于完成介质恢复。
在线重做日志用于出电源故障(实例)时,“修正“数据文件;而归档重做日志文件它是在出现磁盘故障是用于”修正“数据文件。
重做日志redo log file是LGWR进程从Oracle实例中的redo log buffer写入的,是循环利用的。就是说一个redo log file(group) 写满后,才写下一个。
归档日志archive log是当数据库运行在归档模式下时,一个redo log file(group)写满后,由ARCn进程将重做日志的内容备份到归档日志文件下,然后这个redo log file(group)才能被下一次使用。
不管数据库是否是归档模式,重做日志是肯定要写的。而只有数据库在归档模式(Archive Log Mode)下,重做日志才会备份,形成归档日志。
一般来说,归档日志结合全备份,用于数据库出现问题后的恢复使用。
BTW:一般生产环境设置为归档模式,测试环境设置为非归档模式。
SQL> select name,log_mode from v$database;
NAME LOG_MODE
--------- ------------
RQSIT NOARCHIVELOG
PMON(Process Monitor):进程监视器
用户会话是连接到服务器进程的用户进程。PMON监视所有服务器进程,并检测会话中任何问题,如果会话异常终止,PMON将销毁服务器进程,将其PGA内存返回给操作系统的空闲内存池,并回滚任何尚在进行的未完成事物。
SMON(System Monitor:系统监视器
SMON负责系统监控和一些清理及恢复工作。
1. 清理临时表空间和临时段
SMON负责在数据库启动时清理临时表空间中的临时段,或者某些异常操作遗留下来的临时段。
2. 接合空闲空间
在DMT中,SMON负责把表空间中空闲的并且互相临近的extent结合成一个较大的空闲区。
3. 执行实例恢复(Instance recovery)
在实例恢复过程中,SMON的工作分3个步骤:应用Redo执行前滚, 打开数据库提供访问 ,回滚未提交数据。
4. 离线(offline)回滚段
在AUM(自动回滚段管理)中负责offline 不再需要的回滚段。
5. 执行并行恢复
CKPT:检查点进程
大多数关系型数据库都采用"在提交时并不强迫针对数据块的修改完成"而是"提交时保证修改记录(以重做日志的形式)写入日志文件"的机制,来获得性能的优势。这句话的另外一种描述是:
当用户提交事务,写数据文件是"异步"的,写日志文件是"同步"的。这就可能导致数据库实例崩溃时,内存中的DB_Buffer 中的修改过的数据,可能没有写入到数据块中。数据库在重新打开时,需要进行恢复,来恢复DB Buffer 中的数据状态,并确保已经提交的数据被写入到数据块中。检查点是这个过程中的重要机制,通过它来确定,恢复时哪些重做日志应该被扫描并应用于恢复。CKPT获取发生检查点时对应的SCN,通知DBWr要写到这个SCN为止,dbwr 写dirty buffer 是根据 buffer 在被首次修改的时候的时间的顺序写出,也就是 buffer被修改的时候会进入一个queue (checkpoint queue),dbwr 就根据queue从其中批量地写到数据文件。
Refer( Oracle 检查点(ckpt) )
---------------------------------------------------------------------------------------------
未完待续
参考
9 Process Architecture
15 Process Architecture
白话Oracle的连接和会话的区别(Connection/Session)