Oracle 常见进程
1 服务器进程
专用服务器连接:数据连接跟服务器上的一个进程之间存在1:1的映射
共享服务器连接:多个会话共享一个服务器进程池,由一个调度程序分配
1.1 专用服务器连接
专用服务器连接模式下,客户连接跟服务器进程之间一对一的映射,如果有100条专用服务器连接,就会有相应的100个进程在执行
1.2 共享服务器连接
共享服务器连接强制使用oracle net,客户跟服务器在一个主机也不例外,如果不使用oracle TNS监听,就无法使用共享服务器,客户发出请求,由一个调度程序来分配、
1.3 连接与会话
一条连接上可以建立0个1个或多个会话,各个会话单独,
连接只是客户进程和数据库实例之间的一条特殊线路,最常见就是网络连接,
会话是实例中存在的一个逻辑实体,
1.4 专用服务器和共享服务器
1.4.1 何时使用专用服务器
由于1:1的关系,不必担心长时间运行的事务会阻塞其他事务,其他事务通过自己的专用进程来处理,在非OLTP环境中,有长时间的运行一个事务,就适合用专用服务器
1.4.2 何时使用共享服务器
由于多对1的关系,多个客户对应一个共享服务器,如果一个DBMS_LOCK.SLEEP(20)就会独占共享服务进程20秒的时间,如果独占共享服务器资源,系统就好像挂起,
串行?,使用共享服务器的原则是要确保事务的持续时间尽量短,事务可以频繁的执行,但必须在短时间内执行完,
共享服务器只使用于OLTP系统,适应事务短且频繁,
如果要使用oracle net连接池,就必须使用共享服务器
如果要使用db link,也必须用共享服务器
共享服务器的潜在好处:减少系统进程或线程数,刻意的限制并发,减少系统所需要的内存
小结:除非系统负载过重,或要使用特定的性能使用共享服务器,否则最好使用专用服务器,设置简单,调优容易。
2 后台进程
Oracle实例的一部分是内存sga,另一部分就是后台进程,可以通过2个视图来看后台进程
select * from v$bgprocess 后台启动的进程
select * from v$process 正在运行的进程
select paddr, name, description
from v$bgprocess
where paddr <> '00'
order by paddr desc
2.1 dbwr进程
当sga中的数据缓冲区的数据块被修改后,该数据块就会被标记为脏块,当数据缓冲区的空间不足时,就会触发该进程把脏块写入到数据文件,
读取脏块时也是有lru规则,并不是将所有脏块一次写入数据文件中,当满足下列条件是会触发dbwr进程:
当有数据写入缓冲区,发现空间不够,就会触发,按照lru规则写入数据文件(分散写)
执行检查点(ckpt进程)
默认情况下,oracle只启动一个dbwr进程,dbwr0,最大不超过20个,建议不要超过系统的cpu的数量和磁盘的数量
要修改dbwr进程数量,参数db_writer_processed,默认1,不支持动态修改,重启后生效,
2.2 lgwr进程
日志写进程,将重做日志缓冲区的内容写入到重做日志(磁盘),修改的记录首先生成重做记录,
该进程触发条件
每3秒一次
事务条件(含ddl)
重做日志缓冲区写满1/3或者缓冲区达到1mb的日志
Dbwr进程写脏块到数据文件,如果这部分数据对应的重做日志信息尚未写入到重做日志文件的话,会先等lgwr进程将脏块缓存涉及的重做记录写入到日志文件,然后在将其写入到数据文件,
日志写进程是顺序写,比dbwr进程的分散写快,一个事务提交后,只要日志写入到在线重做日志文件中,就会返回成功。
2.3 ckpt检查点进程
当dbwr进程写脏块到数据文件时,必须要对控制文件和数据文件进行更新,
建立检查点后,oracle数据文件知道记录到了什么位置,当数据库发生崩溃,可以根据重做日志来重建崩溃前的修改,
触发检查点的条件:
重做日志切换
系统收到alter system checkpoint;命令
将表空间置为offline脱机/read only 只读/backup 备份状态,(只会写入相关表空间的脏块信息)
通过初始化参数设置控制检查点的执行频率,如Log_checkpoint_timeout初始化参数可以控制脏块在数据缓冲区的保留时间,10g版本新增自动检查点,初始化参数fast_start_mttr_target未设置值时,oracle能够自动调整检查点的执行时间
Ckpt主要完成以下工作
更新控制文件,并修改数据文件的头信息,记录当前检查点的位置
向dbwr进程发布将脏块写入到数据文件的任务,保证数据库的一致性,
smon 系统监控
pmon 进程监控
arch 归档进程:归档模式下才有该进程,负责将写满的重做日志文件保存到相应的归档路径,(Log_archive_dest_n参数指定的路径下),当对日志文件进行归档时,其他进程均无法访问该文件,一个实例最多运行10个archn进程,默认1个,初始化参数log_archive_max_process,
Jnnn 任务队列job
1 Log Writer (LGWR)
LGWR performs sequential writes from the Redo Log Buffer to the online redo log file under the followingsituations:
1.When a transaction commits
2.When the Redo Log Buffer is one-third full
3.When there is more than 1 MB of changes recorded in the Redo Log Buffer
4.Before DBWn writes modified blocks in the Database Buffer Cache to the data files
5.Every three seconds
.Because the redo is needed for recovery, LGWR confirms the commit operation only after the redo is written todisk.
LGWR can also call on DBWn to write to the data files.
2 Database Writer (DBWn)
The server process records changes to undo and data blocks in the Database Buffer Cache. DBWn writes thedirty buffers from the Database Buffer Cache to the data files. It ensures that a sufficient number of free buffers(buffers that can be overwritten when server processes need to read in blocks from the data files) are availablein the Database Buffer Cache. Database performance is improved because server processes make changes onlyin the Database Buffer Cache.
DBWn defers writing to the data files until one of the following events occurs:
Incremental or normal checkpoint
The number of dirty buffers reaches a threshold value
A process scans a specified number of blocks when scanning for free buffers and cannot find any
Timeout occurs
A ping request in Real Application Clusters (RAC) environment
Placing a normal or temporary tablespace offline
Placing a tablespace in read-only mode
Dropping or truncating a table
ALTER TABLESPACEtablespace nameBEGIN BACKUP
1. 当Buffer Cache中的Dirty List长度达到阀值:
DBWR将Dirty List中的Dirty Buffer写入磁盘(user Server Process在LRU List中查找free buffer时将碰到的dirty blocks移入Dirty List)
2. 当user Server Process在Buffer Cache的LRU List中搜索了过长的时间而仍然没有找到free buffer:
DBWR直接从LRU List中将Dirty Buffer写入磁盘
3. 每过3秒钟:
DBWR把dirty buffers从LRU List移到Dirty List,一旦Dirty List长度达到阀值,DBWR便将数据写入磁盘
4. Checkpoint发生时:
DBWR把所有的dirty buffers从LRU List移到Dirty List,并且开始写数据
5. 当Tablespace开始Hot backup时:
DBWR把所有属于该表空间的dirty buffers从LRU List移到Dirty List,并且开始写数据
6. 当Tablespace offline时:
DBWR把所有属于该表空间的dirty buffers从LRU List移到Dirty List,并且开始写数据
7. 执行Drop时:
drop table或者index将促使DBWR先将属于该segment的dirty blocks写入磁盘
3 checkpoint
checkpoint是一个数据库事件,它将已修改的数据从高速缓存刷新到磁盘,并更新控制文件和数据文件。
我们知道了checkpoint会刷新脏数据,但什么时候会发生checkpoint呢?以下几种情况会触发checkpoint。
1.当发生日志组切换的时候
2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候
3.当运行ALTER SYSTEM SWITCH LOGFILE的时候
4.当运行ALTER SYSTEM CHECKPOINT的时候
5.当运行alter tablespace XXX begin backup,end backup的时候
6.当运行alter tablespace ,datafile offline的时候;
PMON进程:
该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。
PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
SMON进程:
该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
DBWR进程:
该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个ORACLE后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。 ORACLE采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使I/O最小。在下列情况预示DBWR 要将弄脏的缓冲区写入磁盘:
1、当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度时,该服务进程将通知DBWR进行写。该临界长度是为参数DB-BLOCK-WRITE-BATCH的值的一半。
2、 当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区,它停止查找并通知DBWR进行写。
3、出现超时(每次3秒),DBWR 将通知本身。
4、 当出现检查点时,LGWR将通知DBWR 在前两种情况下,DBWR将弄脏表中的块写入磁盘,每次可写的块数由初始化参数DB-BLOCK-WRITE-BATCH所指定。如果弄脏表中没有该参数指定块数的缓冲区,DBWR从LUR表中查找另外一个弄脏缓冲区。 如果DBWR在三秒内未活动,则出现超时。在这种情况下DBWR对LRU表查找指定数目的缓冲区,将所找到任何弄脏缓冲区写入磁盘。每当出现超时,DBWR查找一个新的缓冲区组。每次由DBWR查找的缓冲区的数目是为寝化参数DB-BLOCK-WRITE-BATCH的值的二倍。如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。 在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘。DBWR将指定的缓冲区写入磁盘。 在有些平台上,一个实例可有多个DBWR。在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。参数DB-WRITERS控制DBWR进程个数。
LGWR进程:
该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个ORACLE后台进程。LGWR进程将自上次写入磁盘以来的全部日志项输出,LGWR输出:
1、 当用户进程提交一事务时写入一个提交记录。
2、每三秒将日志缓冲区输出。
3、 当日志缓冲区的1/3已满时将日志缓冲区输出。
4、当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。
LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,LGWR 可继续地写入该组的其它文件。 日志缓冲区是一个循环缓冲区。当LGWR将日志缓冲区的日志项写入日志文件后,
服务器进程可将新的日志项写入到该日志缓冲区。LGWR 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
注意:有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。 ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。