Initialization Parameters
I parametri di inizializzazione possono essere modificati a livelli di sistema o di sessione
SQL> alter SYSTEM set... scope=MEMORY | BOTH | SPFILE | DEFERRED
SQL> alter SESSION set.....scope=MEMORY | BOTH | SPFILE | DEFERRED
La vista V$PARAMETER contiene tre colonne che indicano in base a loro valore come effettuare la modifica:
ISSES_MODIFIABLE: a livello di sessione
ISSYS_MODIFIABLE: a livello di sistema.Assume i seguenti valori:
FALSE, vuole dire che è un parametro statico e quindi potrebbe essere cambiato ma solo a livello di Spfile e occorre riavviare il db;
IMMEDIATE vuol dire che i cambiamenti sono immediati;
DEFERRED, i cambiamenti diventato effettivi per le nuove sessioni.
Vediamo i valori di "scope":
MEMORY indica che le modifiche sono fatte in memoria e sono immediate ma si perdono al prossimo riavvio del db.
SPFILE indica che la modifica è fatta nel file spfile e diventa effettivo solo dopo il riavvio del db.
BOTH indica che la modifica è fatta sia a livello di memoria che di file spfile.
DEFERRED indica che la modifica è applicata alla successiva sessione
ISDEFAULT è TRUE se il parametro è settato al valore di default mentre FALSE se il valore è specificato nel parameter file (spfile or pfile).
MAX_IDLE_TIME specifica il massimo numero di minuti che una sessione può essere in idle. Dopodiché la sessione è automaticamente terminata.
Se il server parameter file non è usato per avviare l'istanza allora ogni riga della vista conterrà la il valore FALSE nella colonna ISSPECIFIED.
ISPDB_MODIFIABLE: a livello di PDB. Se TRUE vuol dire che può sovrascrivere i parametri ereditati dal container db.
Vediamo i valori di "scope":
MEMORY indica che le modifiche sono fatte in memoria e sono immediate ma si perdono al prossimo riavvio del db.
SPFILE indica che la modifica è fatta nel file spfile e diventa effettivo solo dopo il riavvio del db.
BOTH indica che la modifica è fatta sia a livello di memoria che di file spfile.
DEFERRED indica che la modifica è applicata alla successiva sessione
Esempi:
SQL> select name, value, ISSES_MODIFIABLE,ISSYS_MODIFIABLE,ISPDB_MODIFIABLE from V$parameter where name ='nls_date_format';
NAME VALUE ISSES ISSYS_MOD ISPDB
-------------------- --------------- ----- --------- ---------------------------
nls_date_format (null) TRUE FALSE TRUE
SQL> select name, value, ISSES_MODIFIABLE,ISSYS_MODIFIABLE,ISPDB_MODIFIABLE from V$parameter where name ='nls_date_format';
NAME VALUE ISSES ISSYS_MOD ISPDB
-------------------- --------------- ----- --------- ---------------------------
nls_date_format (null) TRUE FALSE TRUE
Il parametro può essere modificato a livello di sessione e di pdb.
Il valore è null perché è un parametro che dipende dal parametro NLS_TERRITORY.
SQL> select sysdate from dual;
SYSDATE
---------
26-AGO-20
SQL> alter session set nls_date_format ='dd/mm/yyyy';
Modificata sessione.
SQL> select sysdate from dual;
SYSDATE
----------
26/08/2020
SQL> select name, value, ISSES_MODIFIABLE,ISSYS_MODIFIABLE,ISPDB_MODIFIABLE
from V$PARAMETER
where name ='nls_date_format';
NAME VALUE ISSES ISSYS_MOD ISPDB
-------------------- --------------- ------------------------------------------------------
nls_date_format dd/mm/yyyy TRUE FALSE TRUE
La modifica vale solo per questa sessione.
**************************************************************************
SQL > select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,con_id
from V$PARAMETER
where name ='control_files';
NAME VALUE ISSES ISSYS_MOD ISPDB CON_ID
-------------------- --------------- ----- --------- ----- ----------------------------------------------------------
control_files /u01/app/oracle FALSE FALSE FALSE 1
/oradata/ORCL/c
ontrol01.ctl, /
u01/app/oracle/
oradata/ORCL/co
ntrol02.ctl
Abbiamo due control file che possono essere modificati solo a livello di spfile e occorre riavviare il db.
Notare che si trova nel Contaier root (con_id=1).
Se la colonna "value" contiene più di un valore si può usare la seguente vista che rende più leggibile l'output della query.
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,con_id
from V$PARAMETER2
where name ='control_files';
NAME VALUE ISSES ISSYS_MOD ISPDB CON_ID
-------------------- --------------- ----- --------- ----- --------------------------------------------------------
control_files /u01/app/oracle FALSE FALSE FALSE 1
/oradata/ORCL/c
ontrol01.ctl
control_files /u01/app/oracle FALSE FALSE FALSE 1
/oradata/ORCL/c
ontrol02.ctl
**************************************************************************
V$SYSTEM_PARAMETER è la vista che mostra i parametri a livello di istanza e tutti quelli che sono ereditati dalle nuove sessioni.
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable, ISDEFAULT,con_id
from V$SYSTEM_PARAMETER
order by name;
Ad esempio il parametro "nls_date_format" è definito a livello di spfile e se eseguiamo la query otteniamo il valore TRUE.
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$SYSTEM_PARAMETER
where name='nls_date_format';
NAME VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
--------------- ----- ----- --------- ----- --------- -----------------------------------------------------------
nls_date_format (null) TRUE FALSE TRUE TRUE 0
Se proviamo a modificarlo il suo valore resta sempre null mentre cambia nella tabella V$parameter
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,con_id
from V$PARAMETER
where name='nls_date_format';
NAME VALUE ISSES ISSYS_MOD ISPDB CON_ID
--------------- ----- ----- --------- ----- ----------------------------------------------------------
nls_date_format dd/mm/yyyy TRUE FALSE TRUE 1
**************************************************************************
SQL> show parameter max_idle_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_idle_time integer 0
Creiamo un pfile e aggiungiamo il parametro suddetto.
SQL> create pfile='test.ora' from spfile;
Modificate il file test.ora aggiungendo il parametro seguente;
*.max_idle_time=10
Riavviare il db passandogli il pfile appena creato.
SQL> startup pfile='/u01/app/oracle/product/18/db_1/dbs/test.ora'
SQL> show parameter max_idle_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_idle_time integer 10
Dopo 10 min di inattività alla prima istruzione compare il messaggio seguente:
SQL> select current_date from dual;
select current_date from dual
*
ERRORE alla riga 1:
ORA-03113: end-of-file on communication channel
ID processo: 20172
ID sessione: 73, numero di serie: 3934
Le modifiche del parametro possono essere fatte anche a livello di spfile
SQL> alter system set max_idle_time=2 scope=both;
SQL> show parameter max_idle_time
NAME TYPE VALUE
------------------------------------ --------------------------
max_idle_time integer 2
Se si vuole impostare il valore maggiore di 2 va in errore:
SQL> alter system set max_idle_time=3 scope=both;
alter system set max_idle_time=3 scope=both
*
ERRORE alla riga 1:
ORA-32017: errore durante l'aggiornamento di SPFILE
ORA-02097: impossibile modificare il parametro perche il valore specificato non è valido
Per risolvere il problema occorre prima impostare il valore di default e poi impostare il nuovo valore.
SQL> alter system reset max_idle_time scope=both;
SQL> show parameter max_idle_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_idle_time integer 0
SQL> alter system set max_idle_time=3 scope=both;
SQL> show parameter max_idle_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_idle_time integer 3
Se si apre il file spfileorcl.ora compare il nuovo parametro
*.max_idle_time=3
**************************************************************************
OPEN_CURSORS specifica il massimo numero di open cursors (es. una sql statement) che una sessione può aprire contemporaneamente. Usa questo parametro per impedire ad una sessione di aprire un numero eccessivo di cursori.
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,con_id
from V$PARAMETER
where name='open_cursors';
VALUE= 300 vuol dire che ogni sessione può aprire al massimo 300 cursori.
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
VALUE= 300 vuol dire che ogni nuova sessione può aprire al massimo 300 cursori.
SQL> alter system set open_cursors=301;
Il cambiamento avviene in memorie ed spfile.
Se apriamo il file spfileorcl.ora è presente il nuovo parametro
*.open_cursors=301
Le modifiche dei parametri entrando nel contanier db è il seguente
SQL> alter system set <parameter>=<value> container=CURRENT | ALL;
Se sono nel root container e uso il valore CURRENT le modifiche verranno fatte solo a livello del root container, invece con ALL le modifiche verranno applicate anche ai PDB.
Se invece siamo in un pdb e container=CURRENT allora le modifiche del parametro sono applicate solo a livello di pdb.
Se per un parametro da modificare la colonna ISPDB_MODIFIABLE della tabella v$parameter è true vuol dire che un pdb può sovrascrivere i parametri ereditati dal container root e verrà aggiunta una nuova riga in tabella.
Nel caso di "open_cursor" il campo ISPDB_MODIFIABLE = TRUE e quindi eredita il valore dal root container ma può essere modificato.
SQL> alter system set open_cursors=400 container=current;
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
----- --------- ----- --------- ---------------------------------------------------------
400 FALSE IMMEDIATE TRUE FALSE 0
Accediamo al pluggable.
SQL> alter session set container=orclpdb;
Se ripeto la query vedo che il parametro modificato al valore 400.
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
----- --------- ----- --------- ---------------------------------------------------------
400 FALSE IMMEDIATE TRUE FALSE 3
SQL> alter system set open_cursors=500 container=current;
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
----- --------- ----- --------- ---------------------------------------------------------
500 FALSE IMMEDIATE TRUE FALSE 3
Se accedo al container root e rifaccio la query abbiamo due righe.
SQL> alter session set container=cdb$root;
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
----- --------- ----- --------- ---------------------------------------------------------
400 FALSE IMMEDIATE TRUE FALSE 0
500 FALSE IMMEDIATE TRUE FALSE 3
Se mi collego al container root e modifico il parametro, il valore indicato nel pdb non verrà modificato.
SQL> alter system set open_cursors=410 container=current;
Modificato sistema.
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors'; 2 3
VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
----- --------- ----- --------- ---------------------------------------------------------
410 FALSE IMMEDIATE TRUE FALSE 0
500 FALSE IMMEDIATE TRUE FALSE 3
Se uso l'opzione ALL le modifiche saranno apportate anche ai pdb. Infatti la query restituisce un solo record con con_id=0.
SQL> alter system set open_cursors=430 container=ALL;
SQL> select value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
----- --------- ----- --------- ---------------------------------------------------------
430 FALSE IMMEDIATE TRUE FALSE 0
**************************************************************************
V$SPPARAMETER visualizza le informazioni del server parameter file. Se il server parameter file non è usato per avviare l'istanza allora ogni riga della vista conterrà la il valore FALSE nella colonna ISSPECIFIED.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
NAME VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
--------------- ---------- ----- --------- ----- --------- ----------------------------------------------------
open_cursors 300 FALSE IMMEDIATE TRUE FALSE 0
Poichè ISSES=False e ISSY=Immediate la modifica si può fare a livello di sistema ed è immediata.
SQL> alter system set open_cursors=310 container=all scope=memory;
Utilizzo il comando "container=all" così da applicare la modifica anche ai pdb
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors'
NAME VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
--------------- ---------- ----- --------- ----- --------- ----------------------------------------------------
open_cursors 310 FALSE IMMEDIATE TRUE FALSE 0
SQL> alter session set container=orclpdb;
SQL> select name,value,isses_modifiable , issys_modifiable , ispdb_modifiable ,ISDEFAULT,con_id
from V$system_PARAMETER
where name='open_cursors';
NAME VALUE ISSES ISSYS_MOD ISPDB ISDEFAULT CON_ID
--------------- ---------- ----- --------- ----- --------- ----------------------------------------------------
open_cursors 310 FALSE IMMEDIATE TRUE FALSE 0
La modifica è fatta però solo a livello di memoria "scope=memory" infatti se interrogo la tabella seguente ottengo il vecchio valore:
SQL> select value , con_id ,ISSPECIFIED
from V$SPPARAMETER
where name='open_cursors';
VALUE CON_ID ISSPEC
-------------------- --------------------
300 1 TRUE