在很多情况下我们需要杀死后台进程。比如系统出现了大量HANG住的现象,而通过HANGANALYZE我们发现元凶是一个后台进程,那么我们是否通过杀掉这个进程来解决问题,就要十分谨慎了。因为有些后台进程是不能随便杀的,一旦杀掉就可能导致数据库实例崩溃。因此,有些DBA给自己定了一个金科玉律,就是后台进程绝对是不能杀的。
其实这种做法过于保守了,只要你能够了解后台进程的主要功能,就可以十分安全的管理后台进程了。本节老白将要和大家讨论的问题就是究竟哪些后台进程是可以杀的。本节我们以Oracle 10g 和11g为讨论对象,探讨一下Oracle 的后台进程哪些是可以杀的哪些是不可以杀的。
首先我们来看六大核心进程,其实Oracle 并没有这个概念,这是老白自己的归纳总结。那什哪几个后台进程可以称为六大核心进程呢?Pmon、smon、dbwr、lgwr、reco、ckpt这几个进程是所有Oracle 数据库必不可少的进程,其中ckpt进程的出现较晚,其他四个进程是老白使用Oracle 数据库以来,就存在的系统进程。这些进程无论哪个出现故障,都会导致数据库实例崩溃。因此来说,这些进程是无论如何都不能杀的。如果我们杀掉其中某个进程,在ALERT LOG中就会发现如下的错误:
在某个shell中,杀掉ckpt进程:
[oracle@localhost ~]$ ps -ef|grep ckpt
grid 5245 1 0 Sep25 ? 00:00:00 asmckpt+ASM
oracle 5377 1 0 Sep25 ? 00:00:22 ora_ckpt_orcl
oracle 10891 10763 0 08:48 pts/4 00:00:00 grep ckpt
[oracle@localhost ~]$ kill -9 5377
执行了上述命令后,我们发现ALERT LOG中出现了:
Mon Sep 26 08:48:31 2011
System state dump requested by (instance=1, osid=5342 (PMON)), summary=[abnormal instance termination].
System State dumped to trace file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_diag_5365.trc
Mon Sep 26 08:48:32 2011
PMON (ospid: 5342): terminating the instance due to error 469
Mon Sep 26 08:48:32 2011
ORA-1092 : opitsk aborting process
Dumping diagnostic data in directory=[cdmp_20110926084831], requested by (instance=1, osid=5342 (PMON)), summary=[abnormal instance termination].
Instance terminated by PMON, pid = 5342
我们可以看到,由于ckpt出现故障,PMON进程将实例关闭了。如果杀掉pmon又会出现什么情况呢?
Mon Sep 26 08:52:58 2011
Shutting down instance (abort)
License high water mark = 4
USER (ospid: 11224): terminating the instance
Instance terminated by USER, pid = 11224
Mon Sep 26 08:52:59 2011
Instance shutdown complete
这回我们看到当pmon被杀掉后,是一个前台进程(Instance terminated by User)执行了shutdown abort操作,终结了实例。从这一点上我们也可以看出,虽然pmon是监控进程的后台进程,一旦重要的后台进程出现故障,pmon会自动关闭实例。反过来所有的Oracle 进程,包括前台进程和后台进程都在反过来监视PMON,一旦发现pmon异常,立即会关闭实例。这种相互监控也是大型系统中最为常用的方法。
下面我们来看看10g新增加的MMAN进程,MMAN(Memory Manager )进程是10g新引入的进程,主要目的是执行共享内存自动管理的功能,自动调整共享内存各个组件的大小。
Mon Sep 26 11:09:52 2011
Errors in file /opt/oracle/admin/orcl/bdump/orcl_pmon_6261.trc:
ORA-00822: MMAN process terminated with error
Mon Sep 26 11:09:52 2011
PMON: terminating instance due to error 822
Instance terminated by PMON, pid = 6261
可以看到,一旦MMAN进程出现故障,数据库实例就会崩溃。看样子MMAN是继六大核心进程之后的第七个不可杀的核心进程。
PSP0进程在10g中开始引入,主要功能是启动其他的Oracle 进程。这个进程也是一个十分关键的核心进程,一旦故障,将导致数据库实例故障。
Errors in file /opt/oracle/admin/orcl/bdump/orcl_pmon_32149.trc:
ORA-00490: PSP process terminated with error
Mon Sep 26 14:14:55 2011
PMON: terminating instance due to error 490
Instance terminated by PMON, pid = 32149
至此为止我们已经看到了第八个关键核心进程。
下面我们来看一下cjq0进程,cjq0是一个任务队列的调度进程,负责从job$表中找到需要执行的Job,并分配job进程执行Job,如果job进程不足,会自动产生新的job进程(在job_queue_processes参数限制范围内)。我们下面来看看杀掉这个进程会有什么结果。
Mon Sep 26 09:07:18 2011
Restarting dead background process CJQ0
Mon Sep 26 09:07:18 2011
CJQ0 started with pid=25, OS id=12226
可以看出CJQ进程如果被杀掉,如果杀掉,CJQ0进程会被重启。
既然CJQ0都可以杀,那么CJQ0产生的JXXX进程我们就不用做实验了,肯定是能杀的了。其实老白也是经常杀掉JOB进程的,在某些系统中,经常会有一些JOB进程占用了大量的系统资源,从而导致数据库性能问题,这种情况下,为了恢复OLTP应用的性能,杀掉JOB进程是最简单的方法。不过在杀掉JOB进程之前一定要做仔细的分析,如果JOB进程中正在做一个数据量很大的大型修改事务,那么杀掉这个JOB,可能会导致产生大量的回滚操作,从而对系统性能产生更为不利的影响。
下一个我们要来研究的是arch进程,在Oracle 10g中,arch进程一般是arc0,arc1,…。我们来杀掉一个arch进程,看看会有什么结果。
Mon Sep 26 09:56:27 2011
ARCH: Detected ARCH process failure
ARCH: STARTING ARCH PROCESSES
ARC0: Archival started
ARCH: STARTING ARCH PROCESSES COMPLETE
ARC0 started with pid=16, OS id=6646
ARC0: Becoming the ‘no FAL’ ARCH
ARC0: Becoming the ‘no SRL’ ARCH
我们可以看出,ARC0进程被杀掉后,会自动重启,而数据库实例没有发生故障。因此在某些情况下ARCH进程如果故障,在必要情况下,我们是可以杀掉该进程的。
下面我们来看一下QMON进程,QMON进程是队列监控同步进程(QMNC)和队列服务进程(QXXX)的统称。
Mon Sep 26 09:10:46 2011
Restarting dead background process CJQ0
Mon Sep 26 09:10:46 2011
CJQ0 started with pid=25, OS id=12347
从上面的测试可以看出,QMON进程是可以杀的,杀掉QMON进程的后果是相关进程重启。
MMON和M000是Oracle 10g引入的新后台进程,MMON是管理监控进程,M000是MMON的SLAVE进程,协助MMON进程工作。如果这些进程出现故障会有什么结果呢?
Mon Sep 26 10:11:39 2011
Restarting dead background process MMON
MMON started with pid=11, OS id=11860
MMON进程是可以自动重启的,当然也在可杀范围内了。
类似的MMNL进程也是AWR新增的进程,主要作用是将AWR数据从内存中刷到表中。这个进程也如果被杀掉也是可以自动重启的。在这里我们就不一一列出实验数据了:
n DISPATCHER进程DXXX:如果被杀掉,ALERT会有报错,不会导致实例宕机,根据需要进行重启
n 共享服务进程SXXX:如果被杀掉,不会导致实例宕机,根据需要进行重启
n 并行进程PXXX/PZXX:并行进程,如果被杀掉,不会导致实例宕机,进程根据需要进行重启
n 高级队列从属进程QXXX:如果被杀掉,不会导致实例宕机,进程根据需要重启。如果哦存在高级队列操作,杀掉此类进程要十分慎重