【Oracle】Oracle体系结构(二):内存结构

二、进程组成

1、进程的种类

Oracle实例有一下几种不同的进程:

1 )客户端进程

client process(也叫用户进程,因为是在客户端的)

​ 是连接到Oracle数据库实例的应用程序或工具,比如SQLPLUS,比如其他的软件

​ 它不会直接连到数据库!而是与服务器进程进行交互

2)数据库进程

Database processes 其中包括:

​ 后台进程 background process

​ 服务器进程 server process

​ 从属进程.....

3) 守护/应用程序 进程

Daemon and Application processes,其中包括:

​ Nertworking listeners 网络监听进程
​ Grid infrastructure dameons ASM与RAC相关的进程

2、会话是怎么产生的?

会话(session)就是user process 与 server process 连接产生的

session的信息保存在 PGA 的UGA中

image

3、服务器进程 Server Process

作用:用来处理客户端发出的请求。客户端进程总是通过单独的服务器进程与数据库通信。

如果有20个客户端进程连接到实例,就有20个server process提供服务

执行的任务:

1)复制处理SQL,包括接收sql语句,找执行计划与解析sql

2)读数据,包括读buffer cache和数据文件中的数据

3)返回信息给用户

4、后台进程 Background Process

后台进程的种类

后台有很多进程中,但是有五大进程是必须有的,它们分别是:

  1. PMON
  2. SMON
  3. DBWn
  4. LGWR
  5. CKPT
## 这是9i的启动顺序。,仅作参考
PMON started with pid=2
DBW0 started with pid=3
LGWR started with pid=4
CKPT started with pid=5
SMON started with pid=6
RECO started with pid=7

查看后台进程

select pname,program from v$process
where pname is not null

PNAME PROGRAM
----- ------------------------------------------------
PMON  oracle@txy.example.com (PMON)
CLMN  oracle@txy.example.com (CLMN)
PSP0  oracle@txy.example.com (PSP0)
VKTM  oracle@txy.example.com (VKTM)
GEN0  oracle@txy.example.com (GEN0)
MMAN  oracle@txy.example.com (MMAN)
RECO  oracle@txy.example.com (RECO)
GEN1  oracle@txy.example.com (GEN1)
SCMN  oracle@txy.example.com (SCMN)
DIAG  oracle@txy.example.com (DIAG)
OFSD  oracle@txy.example.com (OFSD)
SCMN  oracle@txy.example.com (SCMN)
DBRM  oracle@txy.example.com (DBRM)
VKRM  oracle@txy.example.com (VKRM)
SVCB  oracle@txy.example.com (SVCB)
PMAN  oracle@txy.example.com (PMAN)
DIA0  oracle@txy.example.com (DIA0)
DBW0  oracle@txy.example.com (DBW0)
LGWR  oracle@txy.example.com (LGWR)
CKPT  oracle@txy.example.com (CKPT)

PNAME PROGRAM
----- ------------------------------------------------
LG00  oracle@txy.example.com (LG00)
SMON  oracle@txy.example.com (SMON)
LG01  oracle@txy.example.com (LG01)
SMCO  oracle@txy.example.com (SMCO)
W004  oracle@txy.example.com (W004)
LREG  oracle@txy.example.com (LREG)
PXMN  oracle@txy.example.com (PXMN)
MMNL  oracle@txy.example.com (MMNL)
MMON  oracle@txy.example.com (MMON)
D000  oracle@txy.example.com (D000)
S000  oracle@txy.example.com (S000)
TMON  oracle@txy.example.com (TMON)
QM02  oracle@txy.example.com (QM02)
TT00  oracle@txy.example.com (TT00)
TT01  oracle@txy.example.com (TT01)
TT02  oracle@txy.example.com (TT02)
AQPC  oracle@txy.example.com (AQPC)
CJQ0  oracle@txy.example.com (CJQ0)
P000  oracle@txy.example.com (P000)
P001  oracle@txy.example.com (P001)
P002  oracle@txy.example.com (P002)

PNAME PROGRAM
----- ------------------------------------------------
P003  oracle@txy.example.com (P003)
P004  oracle@txy.example.com (P004)
P005  oracle@txy.example.com (P005)
P006  oracle@txy.example.com (P006)
P007  oracle@txy.example.com (P007)
W003  oracle@txy.example.com (W003)
Q002  oracle@txy.example.com (Q002)
Q003  oracle@txy.example.com (Q003)
W000  oracle@txy.example.com (W000)
W006  oracle@txy.example.com (W006)

51 rows selected
[root@txy ~]# ps -ef | grep smon
oracle    6221     1  0 Feb12 ?        00:00:17 ora_smon_txydb
[root@txy ~]# ps -ef | grep "ora_*"
oracle    3525     1  0 16:00 ?        00:00:00 ora_w007_txydb
oracle    4153     1  0 16:02 ?        00:00:00 ora_w006_txydb
oracle    6170     1  0 Feb12 ?        00:00:55 ora_pmon_txydb
oracle    6172     1  0 Feb12 ?        00:00:24 ora_clmn_txydb
oracle    6174     1  0 Feb12 ?        00:02:49 ora_psp0_txydb
oracle    6182     1  0 Feb12 ?        03:14:41 ora_vktm_txydb
oracle    6186     1  0 Feb12 ?        00:00:46 ora_gen0_txydb
oracle    6188     1  0 Feb12 ?        00:00:22 ora_mman_txydb
oracle    6192     1  0 Feb12 ?        00:03:38 ora_gen1_txydb
oracle    6196     1  0 Feb12 ?        00:00:46 ora_diag_txydb
oracle    6198     1  0 Feb12 ?        00:00:24 ora_ofsd_txydb
oracle    6202     1  0 Feb12 ?        00:10:06 ora_dbrm_txydb
oracle    6204     1  0 Feb12 ?        00:21:15 ora_vkrm_txydb
oracle    6206     1  0 Feb12 ?        00:00:48 ora_svcb_txydb
oracle    6208     1  0 Feb12 ?        00:01:45 ora_pman_txydb
oracle    6210     1  0 Feb12 ?        00:10:19 ora_dia0_txydb
oracle    6212     1  0 Feb12 ?        00:01:21 ora_dbw0_txydb
oracle    6214     1  0 Feb12 ?        00:00:37 ora_lgwr_txydb
oracle    6216     1  0 Feb12 ?        00:03:15 ora_ckpt_txydb
oracle    6218     1  0 Feb12 ?        00:00:28 ora_lg00_txydb
oracle    6221     1  0 Feb12 ?        00:00:17 ora_smon_txydb
oracle    6223     1  0 Feb12 ?        00:00:14 ora_lg01_txydb
oracle    6225     1  0 Feb12 ?        00:01:17 ora_smco_txydb
oracle    6227     1  0 Feb12 ?        00:00:10 ora_reco_txydb
oracle    6231     1  0 Feb12 ?        00:00:38 ora_lreg_txydb
oracle    6235     1  0 Feb12 ?        00:00:21 ora_pxmn_txydb
oracle    6239     1  0 Feb12 ?        00:09:18 ora_mmon_txydb
oracle    6241     1  0 Feb12 ?        00:04:50 ora_mmnl_txydb
oracle    6243     1  0 Feb12 ?        00:00:15 ora_d000_txydb
oracle    6245     1  0 Feb12 ?        00:00:43 ora_s000_txydb
oracle    6247     1  0 Feb12 ?        00:00:13 ora_tmon_txydb
oracle    6274     1  0 Feb12 ?        00:00:12 ora_tt00_txydb
oracle    6276     1  0 Feb12 ?        00:00:10 ora_tt01_txydb
oracle    6278     1  0 Feb12 ?        00:00:36 ora_tt02_txydb
oracle    6282     1  0 Feb12 ?        00:00:11 ora_aqpc_txydb
oracle    6287     1  0 Feb12 ?        00:04:19 ora_p000_txydb
oracle    6289     1  0 Feb12 ?        00:04:15 ora_p001_txydb
oracle    6291     1  0 Feb12 ?        00:03:29 ora_p002_txydb
oracle    6293     1  0 Feb12 ?        00:03:17 ora_p003_txydb
oracle    6295     1  0 Feb12 ?        00:00:44 ora_p004_txydb
oracle    6297     1  0 Feb12 ?        00:00:45 ora_p005_txydb
oracle    6299     1  0 Feb12 ?        00:00:44 ora_p006_txydb
oracle    6301     1  0 Feb12 ?        00:00:45 ora_p007_txydb
oracle    6479     1  0 Feb12 ?        00:25:44 ora_cjq0_txydb
oracle    6560     1  0 Feb12 ?        00:00:12 ora_qm02_txydb
oracle    6564     1  0 Feb12 ?        00:00:14 ora_q002_txydb
oracle    6566     1  0 Feb12 ?        00:00:12 ora_q003_txydb
oracle    7215     1  0 Feb12 ?        00:00:15 /opt/oracle/product/12.2.0.1/dbhome_1/bin/tnslsnr LISTENER -inherit
oracle    8819     1  0 16:17 ?        00:00:00 ora_w005_txydb
oracle   22122     1  0 17:00 ?        00:00:00 ora_w003_txydb
oracle   22441     1  0 17:01 ?        00:00:00 ora_w000_txydb
root     24466 24177  0 17:08 pts/0    00:00:00 grep --color=auto ora_*
[root@txy ~]#

1)DBWn

DBWn(Database Writer Process)是数据库写入进程,作用是将buffer cache中的脏块(已修改的块)写入到磁盘,释放buffer cache里面的空间。

推进检查点。

注意:写入的是异处理的的,用户修改了数据,发起commit时不是立刻写进数据文件里

触发条件

DBWn在下列条件会将脏数据块写入到磁盘中:

  1. 如果脏数据块超过一定限度时
  2. 每3秒启动一次DBWn
  3. DROP或者TRUNCATE表是
  4. 当表空间OFFLINE时
  5. 当表空间发生BEGIN BACKUPO时
  6. 发生CKPT检查点经常
  7. 数据库不易shutdown abort形式关闭时
  8. 没有了空间缓冲区时

怎么判断哪些脏块应该写入磁盘

LRU算法

2)LGWR

​ LGWR(log wirter process) 日志写入器进程

关键字:转储

​ 前面我们已经了解了redo log buffer的作用,redo log buffer是循环写的,如不将buffer内的内容写进文件里就会满了,满了之后就会把旧的删除,所以这部分的redo log就会丢失了。

​ LGWR进程的作用就是将日志缓冲区内内容写进redo log file里,这个过程成为“日志缓冲区转储”

​ 与DBWn不同,LGWR几乎是实时写入到redo log buffer中的:会话发出commit,LGWR将缓冲区写入到磁盘,此时会话将刮起,事务记录为已经提交(因此是不可逆的)。

​ 以下几种情况LGWR将复制重做条目至redo log file

1)提交事务:COMMIT之后,在LGWR真正将redo log buffer写入到磁盘前,会话将挂起。只有在写操作完成之后,才返回提交成功的信息给会话,服务器进程才能正常工作。这种操作可以确保事务永不丢失:已提交事务的每个变更向量都可以在磁盘上的重做日志中找到,并且可以应用于数据备份。因此,如果数据库被损坏,可以通过备份进行还原,可以做到重做子备份以来执行的所有工作

2)日志缓冲区的的占用率达到1/3

3)在DBWn将脏数据块从buffer cache写入到磁盘之前。

4)自LGWR上一次写入已过了三秒。

5)联机重做日志切换时

3)CKPT

checkpoint process 检查点进程

使用检查点信息更新控制文件和数据文件头,并通知 DBWn 将块写入磁盘。检查点信息包括检查点位置、 SCN、 联机重做日志中 的起始恢复位置等等。

检查点信息记录在

1)控制文件(control file)

2)每个数据文件头(datafile)

4)PMON

PMON(Process Monitor process)进程监视器进程.

它的作用:

1 监视其他的后台进程,异常时执行进程回复,会回滚事务

2 清理buffer cache

3 将实例注册到Oracle Net Listener (12c后由LRRG完成了)

4 释放异常终止进程的资源、释放锁、

5)SMON

SMON(system monitor process)系统监视进程。更多地完成一些系统级别的功能,比如数据库startup。

与PMON一样也有着清理的功能,不过是系统级别的清理。

主要作用:

1)清理

​ 清理临时段(这里的临时段不是临时表空间的段,是指永久表空间的上的临时段);当然临时表空间中的临时段也是SMON清理的

posted on 2023-02-28 17:41  小yq  阅读(84)  评论(0编辑  收藏  举报

导航