Struttura Logica e Fisica di un database

Di seguito il confronto tra la struttura logica e fisica di un database.


La struttura di un Blocco Oracle prevede un Header che indica se il blocco fa riferimento ad una tabella, indice, etc, una Table Directory contenente informazioni sulla tabella e Row Directory che contiene informazioni sulle righe della tabella presenti nel blocco.



Un Tablespace (che chiameremo tbs) è una aggregazione logica di uno o più datafile.
Eccezione per il tbs di tipo BIGFILE che ha un solo datafile che si estende fino a 128TB. Ogni Datafile si estende fino a 32GB. Si può aggiungere un datafile a caldo. Il tbs permette di distribuire i datafile su più dischi.



Query per individuare i Datafile associati ai Tablespace

SQL> select a.name, b.name from V$DATAFILE a join V$TABLESPACE b using (ts#);

NAME                                                                                                                   NAME
-------------------------------------------------------------------------------------------------------------
/home/oracle/u01/app/oracle/oradata/SALES/datafile/o1_mf_system_8gzv1xpy_.dbf  SYSTEM
.....
.....


Tablespace di Default

- SYSTEM  contiene il Data Dictionary e tabelle che contengono informazioni amministrative del db ed appartengono allo schema SYS. Creato automaticamente quando viene creato il db e non può essere rinominato o droppato.
- SYSAUX  è un tablespace ausiliario di SYSTEM e contiene il repository di Enteprise Manager più altro come AWR (Automatic Workload Repository) che contiene le misurazioni delle performance calcolate dal processo Mmon. Creato automaticamente quando viene creato il db e non può essere rinominato o droppato.
- TEMP è un tablespace temporaneo usato per eseguire sql statement che richiedono la creazione di segmenti temporanei come in fasi di ordinamento di un risultato o la creazione di un indice. In genere si definisce un solo tablespace temporaneo per tutti gli utenti di un db.
Ad esempio è usato per Create Index, Analize, Select Distinct, Order By, Group By, Union, Intersect, Minus,....
- UNDO  è usato per il rollback, o undo, dei cambiamenti fatti al database. Quindi è usato per il rollback delle transazioni  quando viene eseguita l'istruzione "Rollback". E' utilizzato per il recovery del database e fornire read consistency. I famosi CB block.
- USERS  è lo spazio associato ad utenti non amministrativi.

Un tbs in genere è associato ad una applicazione o a certi utenti. Infatti quando viene creato un utente deve essere assegnato un tbs, almeno quello di default (USERS).


CREATE TABLESPACE demo_tbs1 
DATAFILE '/u01/app/oracle/oradata/SALES/datafile/deomo_tbs1.dbf' 
SIZE 1024M AUTOEXTEND ON NEXT 50M MAXSIZE 2048M
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO;

Nel esempio il tbs parte da 1GB e se si riempie, viene aggiunto in automatico 50MB fino ad un massimo di 2GB.
Se si una MAXSIZE UNLIMITED la dimensione del datafile può crescere fino a 32GB.


Se non si utilizza la clausola DATFILE, Oracle Managed File crea il tablespace all'interno del path definito nel parametro db_create_file_dest.

CREATE TABLESPACE tbs_11;

Se il parametro non è popolato l'istruzione precedente va in errore.

SQL> show parameter db_create_file_dest

NAME      TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest      string  
 
SQL>  alter system set db_create_file_dest='/u01/app/oracle/oradata/ORCL/pdbts'
 
SQL> show parameter db_create_file_dest

NAME      TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest      string /u01/app/oracle/oradata/ORCL/pdbts




Da Enterprise Manager andare sotto Server\Storage\Tablespaces.
I tbs contengono le seguenti tre caratteristiche:
1) TYPE:
  • Permanent
  • Temporary (contiene i dati che non entrano più in PGA)
  • Undo
2) EXTENT MANAGEMENT: è un opzione che verifica se c'è spazio nei data file per effettuare ddl, dml,..transazioni in generale. Se non c'è spazio invia un messaggio prima di scrivere in cache.

Che cos'è un Extent?
Non è altro che un associazione continua di al massimo 8 blocchi oracle (è quindi un associazione logica). 
Prevede due possibili opzioni:
Dictionary : non si usa più nella 11g ma solo per compatibilità con le versioni precedenti. Nel DataDictionary c'erano tabelle in cui era scritto per ogni tbs, se i suoi datafile contenevano blocchi liberi (ad esempio, dal blocco 100 per la lunghezza di n extent);
Local: nell'header del datafile, di lunghezza 128 blocchi, sono scritti gli extent vuoti. Si parla di EXTENT MAP. Da Enterprise Manager selezionare il tbs di interesse e l'opzione action = "show tablespaces contents" e infine esplodere "Extent Map".

3) SEGMENT MANAGEMENT:
Il segment è invece l'aggregazione di tutti gli extent riconducibili alla stessa tabella o indice.


I Segment Type includono:
- Table and Cluster: per una tabella partizionata, le singole partizioni sono memorizzate in singoli segment
- Index: per un indice partizionato, le singole partizioni sono memorizzate in singoli segment 
- Undo
- Temporary: è un segmento temporaneo usato per statement di ordinamento e quando è terminata l'operazione, gli extents presenti nel temporary segment vengono rilasciati. 

Sono possibili due opzioni:
Manual: nell'header del data file c'è l'elenco dei blocchi vuoti, in genere soglia del 60%.
Auto: Oracle usa i bitmaps per gestire lo spazio libero nei segmenti. Il bitmap contiene lo stato di ogni data block del segment con riferimento allo spazio libero che ha per inserire righe.
Nell'header di ogni blocco c'è scritto:
         > tipo di blocco (tabella, indice,..)
         > SCN
         > T.S. (Transaction Block che fanno riferimento all'undo)
         > Row Directory (indirizzo delle righe popolate)
         > Stato del blocco: Free, Clean, Dirty (perché non è più manipolato da un pò di tempo), Pinned, Bitmap (il blocco è come se fosse diviso in 4 sezioni individuate da una sequenza di 4 bit).

Le righe della tabella vengono memorizzate nei blocchi e si chiamano row piece.  Se i dati di una riga possono essere memorizzati in un solo Data Block allora la riga è individuata da un solo row piece. Se invece i dati sono tanti o sono state fatte insert che hanno fatto crescere i dati della riga allora oracle memorizza la riga in più row piece che possono appartenere allo stesso Data Block o a blocchi differenti appartenti allo stesso extent. 


Supponiamo di avere due segment di due tabelle X e Y contigue e di effettuare una insert in tabella X (nella figura ha gli extent in celeste);


Il nuovo extent è aggiunto a destra dell'extent della tabella Y (nella figura sono i due extent in giallo).


Se effettuo altre insert in tabella X (da 2 a 16 extent in figura) non è detto che vengano aggiunti altri extent se ho ancora blocchi vuoti nell'ultimo extent inserito, perché interviene la proprietà Segment Management.


Sempre nel caso di Segment Management Auto i primi blocchi dell'extent di un Segment contengono invece dei dati l'elenco dello stato delle BITMAP dei blocchi successivi. Quindi se questo criterio dice che non c'è spazio sui blocchi degli extent, parte il controllo EXTENT LOCALLY MANAGEMENT sull'header del Datafile per trovare extent liberi.
Se si effettuano continuamente insert il sistema in automatico decidere di avere blocchi maggiori di 8 KB come nel caso della tabella Y.
Se selezioniamo la voce Extents della tabella Y otteniamo la mappa degli extent dove si nota come gli ultimi extent sono di 128 blocchi.



Con il seguente comando si visualizza la directory dove sono salvati i file:

SQL> show parameter db_create_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      /home/oracle/u01/app/oracle/oradata


Verifica se autoextent e la dimensione massima del tablespace.

SELECT file_name, bytes, autoextensible, maxbytes 
FROM dba_data_files 
WHERE tablespace_name= 'SYSAUX';

SELECT EXTENT_MANAGEMENT 
FROM DBA_TABLESPACES 
WHERE TABLESPACE_NAME = 'SYSAUX';

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database