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.

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

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;

ISDEFAULT è TRUE se il parametro è settato al valore di default mentre FALSE se il valore è specificato nel parameter file (spfile or pfile).

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


**************************************************************************

MAX_IDLE_TIME specifica il massimo numero di minuti che una sessione può essere in idle. Dopodiché  la sessione è automaticamente terminata.

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è ISDEFAULT è FALSE vuol dire che il valore è specificato nel parameter file (spfile or pfile).
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



Post popolari in questo blog

Create e Drop Pluggable Database

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