Oracle startup

Oracle e' il DBMS relazionale commerciale piu' diffuso al mondo. In questa paginetta vediamo le diverse fasi di avvio.

Questa paginetta contiene dettagli tecnici utili ai DBA Oracle e fa riferimento alle piu' recenti versioni disponibili on-premises su unix/linux.
Per un introduzione sul database Oracle si puo' leggere questo documento.

Introduzione

Per potersi connettere ed operare con l'RDBMS Oracle e' necessario che sia attivo e che sia attivo il servizio di rete per raggiungerlo.

Per attivare un'istanza Oracle il comando da utilizzare e':

$ sqlplus / as sysdba
SQL> startup;
E' anche necessario attivare il listener, che consente l'accesso dai client in rete, con:
$ lsnrctl start

Spesso questi comandi sono agganciati ad un servizio e vengono lanciati automaticamente all'avvio di un sistema.

Tutto qui? no!
Le fasi di avvio di una base dati Oracle in realta' sono un poco piu' complesse; conoscere le fasi di avvio e' necessario in caso di riconfigurazioni della base dati o per effettuare il recupero di dati. Ma prima di entrare nei dettagli e' necessario vedere l'architettura della base dati Oracle!

Architettura

L'architettura dell'RDBMS Oracle presenta una certa complessita': vi sono una serie di processi di sistema che si occupano ciascuno di un compito specifico (eg. la scrittura dei dati, il controllo dei processi, l'esecuzione di job, la scrittura dei log, l'archiviazione, ...). Ad ogni connessione utente viene inoltre lanciato un processo dedicato che esegue l'SQL richiesto dall'utente/applicazione. Con il passare delle versioni di Oracle il numero di processi di sistema (background o shadow) e' sempre cresciuto. Dalla versione 12c e' possibile ospitare piu' database (PDB: Pluggable Database) all'interno dello stesso container... ed il numero di processi di background e' piuttosto elevato (circa 40 processi). I vari processi condividono un'area di memoria, implementata come Shared Memory, denominata SGA. La SGA (System Global Area) mantiene i buffer dei dati, l'elenco dei lock, la cache delle strutture della base dati, ... Per l'accesso in Client-Server viene utilizzato il processo listener che crea una processo dedicato per ogni Client. Se il numero di Client e' molto elevato e' possibile sfruttare la tecnica dell'MTS (Multi Threaded Server) che sfrutta un pool di processi per le diverse sessioni.
Architettura Oracle RDBMS Oracle utilizza una serie di file, di cui ora elenchiamo i principali:

I file possono essere ospitati su normali file system del sistema operativo o sull'ASM. La struttura interna dei datafile e' molto complessa poiche' sono molteplici le strutture di memorizzazione che Oracle utilizza. In generale Oracle privilegia la preallocazione degli spazi per costruire strutture di accesso ai dati ottimizzate.

La gestione delle transazioni e' molto efficiente ed affidabile con l'RDBMS Oracle. Per implementarla Oracle utilizza diverse tecniche. Quando deve essere effettuata una modifica su un dato Oracle salva il contenuto del blocco che lo contiene su un segmento di rollback e quindi effettua la modifica sul dato. In tal modo e' sempre possibile effettuare un rollback della transazione in corso. Quando la transazione viene confermata il segmento di rollback viene segnato come libero ed il dato e' definitivamente confermato. I segmenti di rollback sono mantenuti sui datafile e la loro gestione, via via con le diverse versioni di Oracle, e' divenuta sempre piu' sofisticata ed automatizzata.

Per migliorare le prestazioni Oracle utilizza una cache in memoria ed effettua in modo periodico (o quando richiesto dal commit di una transazione) l'allineamento sui dischi. Ogni attivita' di scrittura sui dischi e' riportata sui file di log in modo sincrono al commit delle transazioni. I file di log vengono utilizzati in modo circolare, quindi sono periodicamente ricoperti. Per mantenere la "storia" delle transazioni avvenute su un database e' possibile attivare il log archiving. Con il log archiving attivo quando un file di redo log e' stato completato viene salvato sulla directory definita dal DBA con una numerazione progressiva. Il log archiving permette il point in time recovery ed il backup a caldo. In generale Oracle non effettua il mirroring dei data file: l'implementazione a livello di RDBMS sarebbe infatti inefficiente in termini prestazionali e di occupazione di spazio. Tuttavia Oracle mantiene in mirroring alcune strutture di limitate dimensioni molto importanti per il suo funzionamento come i Control File ed i Redo Log.

Fasi di avvio

L'avvio di Oracle avviene in fasi diverse che e' necessario conoscere in caso di riconfigurazioni o di attivita' di recupero. Fasi di avvio Oracle RDBMS

Ecco le fasi di avvio di Oracle:

Per poter avviare una base dati Oracle l'installazione deve essere stata effettuata correttamente, deve essere utilizzato un utente di sistema operativo diverso dall'amministratore root (spesso si utilizza l'utente di sistema oracle), il PATH deve contenere la directory degli eseguibili Oracle e l'LD_LIBRARY_PATH deve indirizzare le librerie dinamiche Oracle, debbono essere impostate correttamente le variabili ORACLE_HOME, ORACLE_SID.
Il controllo si effettua facilmente con comandi come env, ls, ...
Nella fase di SHUTDOWN non vi deve essere alcun processo o segmento di moria attivo.
Il controllo che non vi sia nulla di attivo si effettua facilmente con ps -efa | grep ora, ipcs -a, ...

I passi che Oracle esegue per entrare in fase di NOMOUNT sono diversi.
Viene cercato il file di parametri nella directory di default, se presente viene utilizzato l'SPFILE altrimenti il PFILE. Sulla base dei parametri presenti viene allocata la SGA ed attivati i processi di background come: SMON, PMON e LGWR. Vengono aperti e scritti i file di log e di trace.
Le operative che e' possibile svolgere con un database in NOMOUNT non sono molte. Ma e' ad esempio possibile creare nuovi control file quando si vuole clonare un'istanza.

I passi che Oracle esegue per entrare in fase di MOUNT sono diversi.
Vengono aperti e controllati i control file, quindi con i riferimenti trovati vengono individuati i datafile e gli online redo log file.
Con una base dati aperta in modalita' di MOUNT vengono tipicamente eseguite tutte le attivita' di recover del database.

I passi che Oracle esegue per entrare in fase di OPEN sono diversi. Vengono aperti tutti gli online datafile, quindi viene selezionato ed aperto l'undo tablespace, infine vengono aperti gli online redo log file. Oracle controlla l'allineamento di ogni file con l'SCN.
Se la base dati era stata chiusa correttamente non sono necessarie operazioni ma se il databse era stato chiuso con un abort o il sistema ospite era caduto debbono prima essere applicate ai datafile tutte le modifiche presenti sui redo file (rollforward), quindi debbono essere cancellate le operazioni che non hanno ricevuto un commit (rollback).
Quando tutto e' terminato correttamente la base dati viene aperta per le normali operazioni.

Shutdown

Per spegnere un'istanza Oracle il comando da utilizzare e':

$ sqlplus / as sysdba
SQL> shutdown immediate;

Tipicamente si utilizza la clausola immediate per non attendere la disconnessione di tutte le sessioni connesse alla base dati. In casi piu' rari, ad esempio quando la clausola immediate non e' sufficiente, si utilizza la clausola abort.

Varie ed eventuali...

Sull'avvio della base dati Oracle avevo gia' pubblicato Startup e shutdown di Oracle (versioni fino alla 12), Startup e shutdown di Oracle (versioni 6.x e 7.x), ... ma l'evoluzione delle funzionalita' dell'RDBMS Oracle nel tempo e' stata notevole e serviva un aggiornamento.
Maggiori dettagli sulle diverse versioni di Oracle sono riportate in questo documento mentre l'evoluzione nel tempo viene descritta in modo assai piu' romanzato in questo documento.

Nel caso in cui lo startup di una base dati fallisca a causa di un errore o di una corruzione e' possibile effettuare un'attivita' di recovery della base dati che richiede pero' conoscenze specialistiche.


Titolo: Oracle startup
Livello: Avanzato (3/5)
Data: 1 Gennaio 2025
Versione: 1.0.0 - 1 Gennaio 2025
Autore: mail [AT] meo.bogliolo.name