programmera.net -> oracledba -> normal     för utskrift      info@programmera.net

Bakgrundsprocesser

1. Instansens bakgrundsprocesser
2. Grundläggande bakgrundsprocesser
3. Slavprocesser och koordinatorer
4. Obligatoriska bakgrundsprocesser
5. Döda en bakgrundprocess

1. Instansens bakgrundsprocesser

Om instansen är igång så finns alltid ett antal processer på den aktuella maskinen, dessa processer kallas för Oracles bakgrunsprocesser. En bakgrundsprocess har ofta en eller ett par distinkta uppgifter. Processen DBWn har t.ex. bara till uppgift att skriva datablock till disk, en uppgift som i och för sig kan vara nog så komplicerad. En bakgrundsprocess kommunicerar med följande element:

  • SGA: Bakgrundsprocesser läser och skriver till den allmänna minnesarean SGA (märk att bakgrundsprocesser inte kan komma åt PGA).
  • Filer: Bakgrunsprocesser arbetar ofta med datafiler, kontrollfiler och andra typer av filer.
  • Andra bakgrundsprocesser: Bakgrundsprocesser kommunicerar med andra bakgrundsprocesser på olika sätt. Bakgrundsprocesser skapar ibland andra bakgrundsprocesser, eller startar upp dem om de av någon anledning har krashat. Bakgrundsprocesser meddelar sig med varandra genom att skicka signaler till andra bakgrundsprocesser.
Bilden nedan visar några bakgrundsprocesser och hur de byter data med övriga element:



2. Grundläggande bakgrundsprocesser

En instans kan existera utan att den har någon kontakt med någon databas. För att se vilka processer som är startade då bara instansen är igång startar vi instansen i NOMOUNT:
[olle@dev1]$ su - oracle
Password:
[olle@dev1]$  sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Aug 19 15:32:56 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> STARTUP NOMOUNT
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              75499088 bytes
Database Buffers          205520896 bytes
Redo Buffers                2973696 bytes

Vi kollar i en annan terminal vilka processer som användaren "ORACLE" har startat:
[olle@dev1]$  ps -ef |grep ^oracle |nl
     1  oracle    3913  3910  0 15:32 pts/1    00:00:00 -bash
     2  oracle    3939  3913  0 15:32 pts/1    00:00:00 sqlplus   as sysdba
     3  oracle    3942     1  0 15:33 ?        00:00:00 ora_pmon_orcl
     4  oracle    3944     1  0 15:33 ?        00:00:00 ora_psp0_orcl
     5  oracle    3946     1  0 15:33 ?        00:00:00 ora_mman_orcl
     6  oracle    3948     1  0 15:33 ?        00:00:00 ora_dbw0_orcl
     7  oracle    3950     1  0 15:33 ?        00:00:00 ora_lgwr_orcl
     8  oracle    3952     1  0 15:33 ?        00:00:00 ora_ckpt_orcl
     9  oracle    3954     1  0 15:33 ?        00:00:00 ora_smon_orcl
    10  oracle    3956     1  0 15:33 ?        00:00:00 ora_reco_orcl
    11  oracle    3958     1  0 15:33 ?        00:00:00 ora_cjq0_orcl
    12  oracle    3960     1  0 15:33 ?        00:00:00 ora_mmon_orcl
    13  oracle    3962     1  0 15:33 ?        00:00:00 ora_mmnl_orcl
    14  oracle    3964     1  0 15:33 ?        00:00:00 ora_d000_orcl
    15  oracle    3966     1  0 15:33 ?        00:00:00 ora_s000_orcl
    16  oracle    3967  3939  0 15:33 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
Vi har totalt 16 processer, varav de som börjar med ora_ är instansens bakgrundsprocesser. Processerna har följande uppgifter:

Bakgrundsprocess Betydelse Beskrivning
PMON  Process MONitor  Städar upp då någon process krashar.
PSPn  Process SPawner  Startar bakgrundsprocesser.
MMAN  Memory MANager  Ny i 10g. Denna process sköter ASMM, alltså att automatiskt ändra storlek på Shared pool, default buffer cache, large pool och java pool.
DBWn  Database Block Writer  Ansvarar för att skriva block från DATA BUFFER CACHE till datafilerna. Man kan ha upp till 20 DBW-processer.
LGWR  LoG WRiter  Skriver data från REDO LOG BUFFER till redologfilerna.
CKPT  ChecK PoinT  Hjälper till att utföra en checkpoint genom att uppdatera header-delen i datafilerna.
SMON  System MONitor  Städar på diverse ställen i databasen.
RECO  RECOvery  Hanterar misslyckade distribuerade transaktioner.
CJQn  Coordinate Job Queue  Ansvarar för att starta jobbprocesser (Jnnn), som exekverar job (dvs schemalagda uppgifter).
MMON  Managebility MONitor  Ny i 10g. Denna process ser till att automatiskt upptäcka prestandaproblem, och registrera dessa i AWR (Automatic Workload Repository). MMON startar slavprocesser (Mnnn) som utför själva arbetet.
MMNL  Managebility MoNitor Light  Ny i 10g. Denna process används för att hämta statistik till AWR (Automatic Workload Repository) från databastabellerna.
Dnnn  Dispatcher  Det finns en dispatcherprocess trots att jag kör en dedikerad server. Läs mer om dispatchern i avsnittet om delad server.
Snnn  Server  Det finns en serverprocess trots att jag kör dedikerad server. Läs mer om serverprocesser i avsnittet om delad server.

3. Slavprocesser och koordinatorer

En slavprocess är en typ av bakgrundsprocess som startas av en koordinator efter behov. När en slavprocess har fullgjort sitt uppdrag självdör den oftast. Vi har följande koordinatorer och slavprocesser på mitt system:

Slavprocess Betydelse Koordinatorprocess Beskrivning
Qnnn  Queue  QMNC  Qnnn är en köprocess startad av QMNC. Det antal köprocesser som startas bestäms av parametern AQ_TM_PROCESSES (konstigt nog är denna parameter 0 i mitt system, men som vi snart ser har jag trots detta en process Q000).
Jnnn  Job  CJQn  En jobbprocess startad av CJQn.
Mnnn  Managebility  MMON  Ny i 10g. En slavprocess som samlar prestandarelaterad statistik (startad av MMON).

För att vi ska få se några slavprocesser öppnar vi databasen:
SQL> 
ALTER DATABASE MOUNT;

Database altered.

idle> ALTER DATABASE OPEN;

Database altered.

Vi kollar vilka processer som "ORACLE" kör direkt efter öppningen:
[olle@dev1]$  ps -ef |grep ^oracle |nl
     1  oracle    3913  3910  0 15:32 pts/1    00:00:00 -bash
     2  oracle    3939  3913  0 15:32 pts/1    00:00:00 sqlplus   as sysdba
     3  oracle    3942     1  0 15:33 ?        00:00:00 ora_pmon_orcl
     4  oracle    3944     1  0 15:33 ?        00:00:00 ora_psp0_orcl
     5  oracle    3946     1  0 15:33 ?        00:00:00 ora_mman_orcl
     6  oracle    3948     1  0 15:33 ?        00:00:00 ora_dbw0_orcl
     7  oracle    3950     1  0 15:33 ?        00:00:00 ora_lgwr_orcl
     8  oracle    3952     1  0 15:33 ?        00:00:00 ora_ckpt_orcl
     9  oracle    3954     1  0 15:33 ?        00:00:00 ora_smon_orcl
    10  oracle    3956     1  0 15:33 ?        00:00:00 ora_reco_orcl
    11  oracle    3958     1  0 15:33 ?        00:00:00 ora_cjq0_orcl
    12  oracle    3960     1  0 15:33 ?        00:00:01 ora_mmon_orcl
    13  oracle    3962     1  0 15:33 ?        00:00:00 ora_mmnl_orcl
    14  oracle    3964     1  0 15:33 ?        00:00:00 ora_d000_orcl
    15  oracle    3966     1  0 15:33 ?        00:00:00 ora_s000_orcl
    16  oracle    3967  3939  0 15:33 ?        00:00:02 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=( PROTOCOL=beq)))
    17  oracle    6553     1  0 17:10 ?        00:00:00 ora_qmnc_orcl
    18  oracle    6555     1  5 17:10 ?        00:00:00 ora_q000_orcl
    19  oracle    6557     1  2 17:10 ?        00:00:00 ora_j000_orcl
    20  oracle    6559     1  3 17:10 ?        00:00:00 ora_m000_orcl
    21  oracle    6561     1  3 17:10 ?        00:00:00 ora_j001_orcl
    22  oracle    6563     1  5 17:10 ?        00:00:00 ora_j002_orcl
    23  oracle    6565     1  3 17:10 ?        00:00:00 ora_j003_orcl
    24  oracle    6567     1  5 17:10 ?        00:00:00 ora_j004_orcl
    25  oracle    6571     1  2 17:10 ?        00:00:00 ora_j005_orcl
    26  oracle    6575     1  3 17:10 ?        00:00:00 ora_j006_orcl
    27  oracle    6577     1  0 17:10 ?        00:00:00 ora_j007_orcl
Vi ser att instansen har skapat 11 nya processer (process 17 till 27):

  • 10 av dessa är slavprocesser (Jnnn, Qnnn, Mnnn).
  • 1 av dessa är QMNC, en ny koordinatorprocess som hanterar AQ.
Om vi väntar en stund och sedan listar processerna så ser vi att många av de nya processerna har försvunnit:
[olle@dev1]$ ps -ef |grep ^oracle |nl
     1  oracle    3913  3910  0 15:32 pts/1    00:00:00 -bash
     2  oracle    3939  3913  0 15:32 pts/1    00:00:00 sqlplus   as sysdba
     3  oracle    3942     1  0 15:33 ?        00:00:00 ora_pmon_orcl
     4  oracle    3944     1  0 15:33 ?        00:00:00 ora_psp0_orcl
     5  oracle    3946     1  0 15:33 ?        00:00:00 ora_mman_orcl
     6  oracle    3948     1  0 15:33 ?        00:00:00 ora_dbw0_orcl
     7  oracle    3950     1  0 15:33 ?        00:00:00 ora_lgwr_orcl
     8  oracle    3952     1  0 15:33 ?        00:00:00 ora_ckpt_orcl
     9  oracle    3954     1  0 15:33 ?        00:00:00 ora_smon_orcl
    10  oracle    3956     1  0 15:33 ?        00:00:00 ora_reco_orcl
    11  oracle    3958     1  0 15:33 ?        00:00:01 ora_cjq0_orcl
    12  oracle    3960     1  0 15:33 ?        00:00:02 ora_mmon_orcl
    13  oracle    3962     1  0 15:33 ?        00:00:00 ora_mmnl_orcl
    14  oracle    3964     1  0 15:33 ?        00:00:00 ora_d000_orcl
    15  oracle    3966     1  0 15:33 ?        00:00:00 ora_s000_orcl
    16  oracle    3967  3939  0 15:33 ?        00:00:02 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
    17  oracle    6553     1  0 17:10 ?        00:00:00 ora_qmnc_orcl
    18  oracle    6555     1  0 17:10 ?        00:00:00 ora_q000_orcl
    19  oracle    6582     1  0 17:11 ?        00:00:00 ora_q001_orcl
    20  oracle    6595     1  1 17:19 ?        00:00:00 ora_j000_orcl
Det är för att jobben som startas i samband med uppstart har kört klart.

4. Obligatoriska bakgrundsprocesser

Det finns 5 bakgrundsprocesser som är obligatoriska för en normal (dedikerad) installation. Om någon av dessa processer kraschar (eller dödas av t.ex. en dba) kommer instansen att omedelbart gå ner. De obligatoriska processerna är:

Klicka på någon av processerna för att se en närmare beskrivning.

5. Döda en bakgrundprocess

Ibland har instansen hängt sig så att inte ens SHUTDOWN ABORT fungerar. Då kan det enda sättet att få ner instansen vara att döda en av de obligatoriska processerna. Man kan döda en process genom att först kolla vilket PID (process ID) den har. Vi ser ovan att PMON har PID=3961. Vi dödar PMON på detta sätt:
[root@dev1]#  kill -9 3961
[root@dev1]#  ps -ef |grep ^oracle|nl
     1  oracle    3929  3926  0 08:06 pts/2    00:00:00 -bash
     2  oracle    3955  3929  0 08:06 pts/2    00:00:00 sqlplus   as sysdba
     3  oracle   21315 21314  0 13:36 pts/1    00:00:00 -bash
Vi såg nu att alla andra "ora_xxxx_orcl"-processer är borta, vilket betyder att instansen gått ner.