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.