Oracle进程结构
oracle进程结构
进程是动态创建的,完成任务后就消亡;而程序是静态的实体,程序是可以复制、编辑的。进程强调的是执行过程,而程序仅仅是指令的有序集合;进程在内存中,程序在外存中。
oracle分为用户进程和oracle进程。
l 用户进程
当用户执行一个基于oracle的应用程序时,客户端就会创建一个oracle的用户进程(如运行的sqlplus、oem都叫用户进程)。
用户进程通过连接登录到oracle服务器,oracle服务器上就产生一个对应的服务器进程(oracle服务器的“外交部”);该服务器进程代表运行在客户端的用户进程与服务器通信。
l oracle进程
oracle进程可以分为服务器进程和后台进程服务器进程。
2 服务器进程
主要是服务于客户端的用户进程。服务器进程又可以分为:专用服务器进程(只为一个用户进程提供服务)和共享服务器进程(可以为多个用户进程提供服务)。
2 服务器进程的任务:
a. 解析并执行用户所提交的sql语句;
b. 搜索sga区的数据库缓存,决定是否读取数据文件。如果数据块不在sga区的数据库缓存中,就将其从数据文件中读入;
c. 将查询执行的结构数据返回给用户。
2 后台进程(backgroundprocess)
服务器进程是由后台进程提供支持的,后台进程主要完成的任务是:
a. 在内存和外存之间进行i/o操作;
b. 监视各个进程的状态;
c. 协调各个进程的任务;
d. 维护的性能;
e. 保证系统的可靠性;
可使用以下查询来检查数据库中启动的后台进程个数及其名称
sql> select * from v$bgprocess
常用的后台进程:
n smon(systemmonitor) 系统监视进程:
ü 启动条件:随oracle数据库系统启动;运行期间oracle可以唤醒smon进程,以检查是否需要执行它所负责的工作;如果其他任何进程需要使用smon进程的功能时,将随时唤醒smon进程。
ü 作用:
a、在例程启动时负责对数据库进行恢复。如果是非正常关闭数据库,则当下次启动例程时,smon进程会自动读取重做日志文件,对数据库进行恢复(即执行将已提交的事务写入数据文件中、回退未提交的事务等操作);
b、清除已经分配但不再使用的表空间中的临时段(如果表空间中有大量的盘区,则清除就会花费大量时间,就会影响数据库启动时的性能) 。
c、合并基于数据字典管理的各个表空间中位置相邻的空闲盘区,使之更容易分配。
ü 备注说明:如果某个表空间的存储参数 pctincrease 被设置为0,则smon进程就不会对该表空间中的空闲盘区进行合并操作。
n pmon(process monitor) 进程监视进程;
ü 启动条件:
a、 需要启动、清除中断或失败的用户进程时(即对oracle数据库的连接发生崩溃、挂起或其他非正常终止等);清除操作还包括非正常中断的用户进程留下的孤儿会话,回退未提交的事务,释放会话所占用的锁、sga区、pga区的资源。
b、 运行期间oracle可以唤醒pmon进程,以检查是否需要执行它所负责的工作;如果其他任何进程需要使用pmon进程的功能时,将随时唤醒pmon进程。
c、pmon是在单独的数据库中启动的,而分布式数据库中是reco 恢复进程来完成pmon进程的任务的。
ü 作用:
a、 恢复中断或失败的用户进程、服务器进程;
b、 清除非正常中断的进程留下的孤儿会话;
c、回退未提交的事务,重置活动事务的状态,从系统活动进程中删除用户进程标识号(id) ;
d、释放进程所占用的各种资源,并通过自动回退事务来解决死锁,释放用户所拥有的表和行上的锁;
e、 定期检查服务器进程和调度进程,如果它们因失败而被异常挂起,则自动重新启动它们。
n dbwn(database writer) 数据库写进程;
ü 启动条件
a、当dirty列表中的脏缓存块达到一定数量(即初始化参数db_block_write_batch指定值的一半),dbwn进程将脏缓存块写入数据文件(同时oracle将对控制文件和数据文件的头部的同步序号scn进行修改,记录下当前数据库的结构和状态,以保证数据库中物理文件之间的同步);
b、当在lru列表中找到一定数量(即初始化参数db_block_max_scan指定的值)的空闲缓存块,但还不够时,为获得更多的空闲缓存块,dbwn进程将脏缓存块写入数据文件;
c、当出现检查点lgwr进程通知dbwn进程进行写操作;
d、一个表空间被置于备份模式、脱机或只读状态时;
e、dbwn进程出现超时(time_out)即大约3秒未启动时。
ü 作用:
a、管理高速缓冲区,保证服务器进程总能找到空闲缓存块,以便保存从数据文件中读取的数据块;
b、将dirty列表中的脏缓存块写入到数据文件中,获取更多的空闲缓存块;
c、使用lru算法将最近正在使用的缓存块即命中块,继续保留在lru列表中,不必重新读取数据文件;
d、dbrn进程通过延迟写入来优化磁盘i/o操作,而服务器进程只在数据高速缓存区中做修改。
ü 备注说明:
a、dbwn进程数最好不要超过cpu的个数,因为每个处理器同时只能运行1个dbwn进程;
b、oracle默认启动一个dbwn进程,启动受初始化参数(db_writer_process)的限制。可以设置初始化参数 db_block_checkpoint_batch来设置每当出现检查点时,dbwn进程写入的脏缓存块的最大数量。增大该值,可以延长启动dbwn进程的时间间隔。
n lgwr(log writer) 日志写进程;
ü 启动条件:
a、用户进程通过commit语句提交当前事务;
b、重做日志高速缓存被写满1/3时,或含有1mb的重做信息时;
c、dbwn进程需要为检查点清除脏缓存块,即将脏缓存块写入数据文件时;
d、lgwr进程出现超时,即大约3秒为启动lgwr进程时。
ü 作用:
a、负责管理重做日志高速缓冲区,即将重做日志记录从高速缓存区写入到重做日志文件;
b、如果例程没有启动ckpt检查点进程,则lgwr进程就来完成检查点执行任务。
ü 备注说明:
a、 每个例程只有一个lgwr进程;
b、 lgwr进程先于dbwn进程启动。
n ckpt (checkpoint) 检查点进程
ü 启动条件:
a、 关闭数据库时;
b、 一个重做日志文件被写满而产生日志切换时;
c、满足参数 log_checkpoint_timeout(指定检查点之间的时间间隔(以秒为单位));
d、参数 log_checkpoint_interval(指定当一定数量的操作系统数据块(非oracle数据块)被写入重做日志文件时,将触发一个检查点)
ü 作用:
a、 触发dbwn进程,使其将自上一个检查点之后的全部已经修改的数据块(脏缓存块)写入数据文件中;
b、 保持数据库高速缓冲区与数据文件之间数据同步(用最新的检查点信息更新控制文件和数据库文件的文件头);
c、检查点信息会在恢复数据库期间使用,当smon进程恢复数据库时,smon会决定最后在数据文件中的检查点。(必须将数据文件的文件头和控制文件中最后记录的检查点之后的联机重做日志文件中的事务编号重新提交到数据文件中。)
ü 备注说明:
a、不要设置不必要的检查点,或迫使不需要的检查点发生;
b、缩短检查点执行的间隔,可以缩短数据库恢复时所需的时间;
c、如果检查点执行的间隔短,将会产生过多的i/o操作;
d、应该使log_checkpoint_interval 设置的操作系统块数与重做日志文件的大小相匹配。
ü oracle在不同的时刻执行不同级别的检查点,故检查点有可分为 4 种:
a、 数据库检查点:每一次重做日志文件切换时都执行数据库检查点;使用normal\transactional\immediate选项关闭数据库时,会执行一个检查点;此时dbwn进程将数据高速缓存区中的所有脏缓存块都写入数据文件中。
b、 表空间检查点:将一个表空间设置为脱机状态或备注为backup模式,会执行一个表空间检查点;此时dbwn只会将高速缓存区中的与该表空间相关的脏缓存块写入数据文件中。
c、手动检查点:使用 alter system checkpoint 语句来手动设置一个检查点。
d、时间检查点:即每隔多久执行一次检查点。可以通过调整(log_checkpoint_timeout和log_checkpoint_interval)参数来改变检查点实行的间隔。
n arcn(archiver) 归档进程;
ü 启动条件:
发生重做日志切换时(必须是归档模式下,并且初始化参数 log_archive_start 为 true ,如果在归档模式下该参数是false当重做日志文件全部写满,数据库将会被挂起。)
ü 作用:避免数据库崩溃无法恢复。
ü 备注说明:
a、一个例程默认只会启动一个归档进程arcn,当arcn正在归档一个重做日志文件时,任何其他进程都不能访问这个重做日志文件。
b、为了避免lgwr进程使用正在归档中的重做日志文件造成数据库被挂起,lgwr进程会根据需要主动启动更多的归档进程。oracle最多可以启用10个arcn。
c、初始化参数 log_archive_dest 指定了归档日志文件所在的位置;log_archive_format指定了归档日志文件的命名格式规则。
n reco(recoverer) 恢复进程
n lckn(lock) 锁进程
n rvwr(recovery writer) 闪回恢复进程
n ctwr(change tracking writer) 闪回变化跟踪写进程
n cjqn(job queue monitor) 作业队列监视进程
n jnnn(job queue) 作业队列进程
n dnnn(dispatcher) 调度进程
n snnn(shared server) 共享服务器进程
2 综合案例
案例:查询后台进程的编号,名称和描述。
col spid format a10;
col name format a10;
col description formata30;
select p.spid, b.name,b.description from v$bgprocess b, v$process p where p.addr=b.paddr;
案例:查询
col spid format a10;
col username formata10;
col terminalformat a10;
col program format a10;
select spid, username,terminal, program from v$process;
案例:查看用户进程情况。username表示用户名,process记录操作系统进程号。
1) 运行cmd,输入sqlplus/nolog,输入conn / as sysdba;建立连接1。
2) 在sqlplus中执行下面命令:
col username formata10;
col process format a10;
col machine format a10;
col program format a10;
select username,process, machine, program from v$session where username is not null;
3) 运行cmd,输入sqlplus/nolog,输入conn scott/tiger as sysdba;建立连接2。
4) 在第一步建立的连接1中再执行下面的命令:
select username,process, machine, program from v$session where username is not null;
5) 对比以上两个查询结果。