Archive for the ‘Oracle’ Category
Note su Oracle
Di seguito gli appunti di un seminario Oracle seguito qualche anno fa (20/04/2004) che ho ritenuto utile trascrivere.
Un database Oracle consiste di:
- Memoria SGA: DB Buffer Cache, Shared Pool, Redolog Buffer
- Processi: DBWR, LGWR, SMON, PMON, CKPT
- File: Datafile, Control File, Redo Log File
DB Buffer Cache: fa permanere in memoria i dati piu’ frequentemente usati
Shared Pool: cache dei piani di esecuzione degli statement SQL arrivati al database
Redo Log Buffer: registro delle operazioni che hanno modificato il database
DBWR: scrive i dati nei datafile
LGWR: scrive le operazioni dal Redolog Buffer al Redolog File
SMON: system monitor, legge il control file per attivare le attivita’ di recovery in caso di crash
PMON: gestore dei processi, libera le risorse usate dalle connessioni scadute
CKPT: check point, si occupa della sicronizzazione tra i dati in memoria e su disco

Le operazioni in caso di istruzione SQL di Select sono le seguenti:
- Parsing
- Calcolo del piano di esecuzione
- Fetch
Ma se l’istruzione e’ gia’ presente in shared pool la sola fase di fetch viene eseguita
La fetch preleva i dati da la DB buffer cache se gia’ presenti in memoria altrimenti li preleva da datafile.
Le operazioni in caso di istruzione che modifica i dati sono le seguenti:
- Scrittura di un Rollback Block nella DB buffer cache
- Scrittura dell’operazione fatta nel Redo Log Buffer
L’operazione di commit non sincronizza i datafile ma semplicemente i Redolog, l’operazione di modifica viene riportata nel Redo Log File.
Il blocco modificato viene marcato come sporco (Dirty) e non potra’ essere modificato fino a che non verra effettuata la sicronizzazione (di default dopo 3 minuti oppure prima se viene superato il numero di blocchi dirty di soglia). E necessaria una sincronizzazione (Check Point) anche nel caso di un Redo Log pieno.
Il Check Point produce un numero l’SCN scritto nel Control File e nel Redo Log file. In caso di auto recovery tutte le operazioni successive all’ultimo SCN sono quelle necessarie al recovery.
Gli stati di apertura di un database sono nell’ordine:
- shutdown
- nomount: viene letto il parameter file init<SID>.ora
- mount: viene letto il control file
- open:
Le opzioni di chiusura di un database sono:
- abort
- immediate
- transactional
- normal
Alla fine della creazione di un database generalmente possono essere cancellate:
- la cartella template assistant/dbca
- e i tablespace TOOLS, USERS, INDX
Out of memory on oracle startup
Sintomo: allo startup del database errore out of memory
SQL> startup
ORA-27102: out of memory
SVR4 Error: 22: Invalid argument
SQL> Disconnected
una volta verificato che oracle_home, oracle_sid etc … siano settati in modo corretto verificare che non si siano raggiunti i limiti di memoria massima concessi all’utente oracle.
Con la procedura seguente e’ possibile modificare provvisoriamente i parametri di sistema:
$ id -p
uid=60003(oracle) gid=203(oinstall) projid=100(user.oracle)
$ prctl -n project.max-shm-memory -i project user.oracle
project: 100: user.oracle
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-memory
privileged 4.00GB - deny -
system 16.0EB max deny -$ su -
# prctl -n project.max-shm-memory -v 6gb -r -i project user.oracle
# exit
$ prctl -n project.max-shm-memory -i project user.oracle project: 100: user.oracle
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-memory
privileged 6.00GB - deny -
system 16.0EB max deny -$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.2.0 – Production on Mon Sep 15 08:43:06 2008
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.Total System Global Area 1073741824 bytes
Fixed Size 2132680 bytes
Variable Size 266171704 bytes
Database Buffers 801112064 bytes
Redo Buffers 4325376 bytes
Database mounted.
Database opened.
SQL>
Per modificare permanentemente tali parametri occorre aggiungere un nuovo progetto nel project file:
# cat /etc/project
system:0::::
user.root:1::::
noproject:2::::
default:3::::
group.staff:10::::
Per aggiungere un progetto usare il comando projadd, per modificarlo usare projmod:
# projadd -U oracle -K "project.max-shm-memory=(priv,6144MB,deny)" user.oracle
# projmod -s -K "project.max-sem-ids=(priv,256,deny)" user.oracle
Il project file dovrebbe apparire cosi’:
# cat /etc/project
system:0::::
user.root:1::::
noproject:2::::
default:3::::
group.staff:10::::
user.oracle:100::oracle::project.max-sem-ids=(priv,256,deny);project.max-shm-memory=(priv,6442450944,deny)
Spostare datafile, redolog file e controlfile – Oracle Database
Datafile e RedoLog file
Per spostare i datafile e i redolog file eseguire il seguente comando:
SQL>alter database backup controlfile to trace;
che crea un file di trace generalmente nella seguente cartella:
$ORACLE_HOME/admin/[$ORACLE_SID]/udump/
copiare il file ed editare lo statement di creazione del control file modificando i path dei datafile da spostare;
fare lo shutdown;
SQL>shutdown immediate;
fare la copia fisica dei datafile e dei redolog file nella nuova posizione;
eseguire i comandi precedentemente editati ponendo attenzione a evitare le righe commentate che potrebbero creare problemi;
alter database backup controlfile to trace;
vi $ORACLE_HOME/admin/[$ORACLE_SID]/udump/sid_ora_XXXXX.trc
shutdown immediate;
cp -p /oracleDB/oraBase/oradata/SILDEV/redo*.log /spare2/SILDEV/
cp -p /oracleDB/oraBase/oradata/SILDEV/system01.dbf /oraDB_data/dbase/SILDEV/
cp -p /oracleDB/oraBase/oradata/SILDEV/sysaux01.dbf /oraDB_data/dbase/SILDEV/
cp -p /oracleDB/oraBase/oradata/SILDEV/users01.dbf /oraDB_data/dbase/SILDEV/
cp -p /oracleDB/oraBase/oradata/SILDEV/undotbs01.dbf /oraAS/SILDEV/
cp -p /oracleDB/oraBase/oradata/SILDEV/temp01.dbf /oraDB_data/dbase/SILDEV/STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE “SILDEV” NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ‘/spare2/SILDEV/redo01.log’ SIZE 50M,
GROUP 2 ‘/spare2/SILDEV/redo02.log’ SIZE 50M,
GROUP 3 ‘/spare2/SILDEV/redo03.log’ SIZE 50M
DATAFILE
‘/oraDB_data/dbase/SILDEV/system01.dbf’,
‘/oraAS/SILDEV/undotbs01.dbf’,
‘/oraDB_data/dbase/SILDEV/sysaux01.dbf’,
‘/oraDB_data/dbase/SILDEV/users01.dbf’
CHARACTER SET WE8ISO8859P1
;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE ‘/oraDB_data/dbase/SILDEV/temp01.dbf’
SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
Controlfile
Per spostare i controlfile occorre modificare il file spfile.ora nella cartella:
$ORACLE_HOME/dbs/spfile[$ORACLE_SID].ora
farne una copia di sicurezza;
esso e’ un file binario; per cui occore prima trasformarlo in un file di testo col seguente comando:
SQL>create pfile='[path]/pfile[$ORACLE_SID].ora' from spfile='$ORACLE_HOME/dbs/spfile[$ORACLE_SID].ora';
editare il file “pfile[$ORACLE_SID].ora” e modificare il path dei controlfile che si vogliono spostare e/o eventuali altri parametri di sistema;
fare lo shutdown;
SQL>shutdown immediate;
spostare i controlfile nella nuova posizione;
fare una prova del pfile startando il db col seguente comando:
SQL> startup pfile='[path]/pfile[$ORACLE_SID].ora';
e verificare che l’istanza parta correttamente.
potrebbe generare un errore di tipo “ORA-01991: invalid password file…”
in questo caso va rigenerato il file di password che generalmente ha un path del tipo:
[$ORACLE_HOME]/dbs/orapw[$ORACLE_SID]
rinominare il file (per sicurezza) e ricrearlo, il comando è il seguente:
orapwd file=[$ORACLE_HOME]/dbs/orapw[$ORACLE_SID] password=[password]
a questo punto provare a startare di nuovo l’istanza attraverso il pfile,
se tutto va a buon fine ricreare l’spfile dal pfile appena modificato;
SQL>create spfile='$ORACLE_HOME/dbs/spfile[$ORACLE_SID].ora' from pfile='[path]/pfile[$ORACLE_SID].ora';
fare lo startup del database;
SQL>startup;
Verificare il corretto funzionamento del Database.
Oracle imp exp con file compressi
Export
mkfifo exportFIFO.dmp
nohup exp scott/tiger tables=(EMP, DEPT) file=exportFIFO.dmp&
nohup gzip < exportFIFO.dmp > export.dmp.gz&
Import
mkfifo importFIFO.dmp
nohup gzip -d < export.dmp.gz > importFIFO.dmp&
nohup imp scott/tiger fromuser=scott touser=scott ignore=Y file=importFIFO.dmp&