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

Avancerad Uppstart

1. Hur Startas Oracle?
2. DOWN
3. NOMOUNT
4. MOUNT
5. OPEN
6. RESTRICT
7. Exempel: Ta bort alla loggfiler

1. Hur Startas Oracle?

Databasen har 4 olika nivåer av "vakenhet":

  • DOWN: Varken instansen eller databasen är startad.
  • NOMOUNT: Endast instansen är startad.
  • MOUNT: Databasen är mountad men inte öppnad.
  • OPEN: Databasen är öppen och användare kan logga in och köra SQL.
Se bild:



2. DOWN

I detta läge är varken instansen eller databasen startade. Man hamnar automatiskt i detta läge om man inte har startat databasen. Vi testar att logga in som SYS:
[olle@dev1]$  sqlplus sys/oracle as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Aug 3 08:29:58 2006

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

Connected to an idle instance.

Texten "Connected to an idle instance" berättar att vi är i läget "DOWN". I detta läge kan man ändå utföra vissa operationer, som t.ex:
SQL>  CREATE pfile FROM spfile;

File created.

3. NOMOUNT

I läget NOMOUNT har parameterfilen lästs och instansen startats (SGA och bakgrundsprocesserna har skapats). Det är egentligen bara om du vill skapa en databas (t.ex. via ett script) som du startar instansen i detta läge. Du startar Oracle i läget NOMOUNT genom att skriva:
[olle@dev1]$ sqlplus sys/oracle as sysdba

SQL>  STARTUP NOMOUNT;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              88082000 bytes
Database Buffers          192937984 bytes
Redo Buffers                2973696 bytes
	
Här kan man se om parameterfilen har lästs in på ett korrekt sätt, genom att titta på hur parametrarna är satta. Jag har i min PFILE följande inställning:

...
*.sga_target=285212672
...
Vi såg i utskriften ovan att "Total System Global Area" är satt till samma storlek som "SGA_TARGET" i kontrollfilen, det verkar stämma. Vi tittar på en annan parameter i kontrollfilen, nämligen CONTROL_FILES:

...
*.control_files='/u02/oradata/orcl/control01.ctl','/u03/oradata/orcl/control02.ctl'
...
Jag har alltså bara 2 kontrollfiler som ligger på olika diskar. Nu kan vi kontrollera att instansen har parametern CONTROL_FILES korrekt satt:
SQL>  SHOW PARAMETERS control_files;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u02/oradata/orcl/control01.ct
                                                 l, /u03/oradata/orcl/control02
                                                 .ctl
Det verkar vara rätt. Däremot är det inte möjligt att se t.ex. vilka datafiler som finns i systemet:
SQL>  SELECT status, name FROM v$datafile;
SELECT status, name FROM v$datafile
                         *
ERROR at line 1:
ORA-01507: database not mounted

Man går sedan vidare till nästa steg genom att använda ALTER DATABASE:
SQL>  ALTER DATABASE MOUNT;

Database altered.

Nu har instansen gått till läget MOUNT.

4. MOUNT

I läget MOUNT har även databasens kontrollfil lästs in. Detta innebär att instansen känner till alla tabellutrymmen och datafiler (men har inte börjat bruka dessa ännu). Databasen måste befinna sig i detta läge då du utför följande uppgifter:

  • Sätta på eller stänga av arkivloggning.
  • Utföra "RECOVER" på hela databasen.
Vi startar en databas i detta läge genom att skriva:
SQL>  STARTUP MOUNT;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              88082000 bytes
Database Buffers          192937984 bytes
Redo Buffers                2973696 bytes
Database mounted.

Eftersom instansen läser kontrollfilen för att komma till läget MOUNT känner instansen nu till vilka datafiler som bygger upp databasen:
SQL>  SELECT status, name FROM v$datafile;

STATUS  NAME
------- --------------------------------------------------
SYSTEM  /u04/oradata/orcl/system01.dbf
ONLINE  /u06/oradata/orcl/undotbs01.dbf
ONLINE  /u04/oradata/orcl/sysaux01.dbf
ONLINE  /u07/oradata/orcl/app1_data01.dbf
ONLINE  /u08/oradata/orcl/app1_idx01.dbf

Det gick bra.
  • OBS: Ovan såg vi att det gick att använda V$DATAFILE för att se datafilerna. Däremot kan vi t.ex. inte använda DBA_DATA_FILES i detta läge eftersom denna vy räknas som ett schemaobjekt, och inga schemaobjekt går att använda innan databasen är öppen.
Vi kan gå till OPEN genom följande kommando:
SQL>  ALTER DATABASE OPEN;

Database altered.

5. OPEN

När databasen går från MOUNT till OPEN utför instansen följande:

  • Kontrollerar att de datafiler och redologgfiler som kontrollfilen pekar ut verkligen finns på plats. Om någon fil fattas kommer Oracle att skriva ut ett fel och avbryta.
  • Jämför det SCN (Sytem Change Number) som finns i kontrollfilen med datafiler och redologgar. Om det visar sig att någon har ett SCN som inte överenstämmer med kontrollfilen kan en recovery behövas.
Att starta en databas till OPEN kan göras med "STARTUP OPEN" eller bara "STARTUP":
SQL>  STARTUP
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              92276304 bytes
Database Buffers          188743680 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

Nu är databasen öppen och fungerar som vanligt.

6. RESTRICT

Genom att starta instansen med RESTRICT kan endast de användare som har privilegierna CREATE SESSION och RESTRICTED SESSION logga in. Dessutom kan man bara logga in lokalt (från den aktuella maskinen). RESTRICT är bra om du vill utföra något av följande:

  • Exportera eller importera data.
  • Köra SQL*Loader (går iofs bra även utan RESTRICT).
  • När man utför uppgradering eller migrering av databasen.
Du statar instansen med RESTRICT på detta sätt:
SQL> STARTUP RESTRICT
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              96470608 bytes
Database Buffers          184549376 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

Om en vanlig användare nu försöker logga in händer följande:
SQL>  sqlplus olle/oracle

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Aug 3 13:31:51 2006

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

ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege


Enter user-name: 

7. Exempel: Ta bort alla loggfiler

Jag testade att ta bort alla REDO-loggar på min maskin:
[root@dev1]#  cd /u02/oradata/orcl/
[root@dev1]#  mv redo0101.log redo0101X.log
[root@dev1]#  mv redo0201.log redo0201X.log
[root@dev1]#  mv redo0301.log redo0301X.log
[root@dev1]#  cd /u03/oradata/orcl/
[root@dev1]#  mv redo0102.log redo0102X.log
[root@dev1]#  mv redo0202.log redo0202X.log
[root@dev1]#  mv redo0302.log redo0302X.log
Nu kommer inte Oracle att hitta någon REDO-fil. Vi testar hur långt vi kommer när vi försöker starta Oracle:
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

SQL> ALTER DATABASE MOUNT;

Database altered.

SQL>  ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u02/oradata/orcl/redo0101.log'
ORA-00312: online log 1 thread 1: '/u03/oradata/orcl/redo0102.log'

Oracle kunde inte starta, vilket var väntat.