sid='*' vs sid='&SID'

Si vous utilisez RAC (Et si vous n’utilisez pas RAC !!!), soyez attentif que les 2 syntaxes de la clause « sid= » des commandes ALTER SYSTEM SET/RESET sont complémentaires mais que sid=’*’ ne remplace pas sid=’&SID ». Si vous n’êtes pas attentif, ça peut vous amener à vous frapper la tête par terre. Voici pourquoi !

Nota Bene :
Ne pensez pas que ce problème n’est pas pour vous, parce que vous n’utilisez pas RAC ; les tests qui suivent sont réalisés avec 11.1.0.6 sous Linux et SANS RAC ; il est toujours possible que ce que je dis dépende de la version utilisée.

Prenons un paramètre qui n’est pas positionné par défaut dans le SPFILE de votre instance (Par exemple query_rewrite_enabled) et affichons la valeur courante pour commencer, dans le SPFILE, avec SQL*Plus :

SQL> show spparameters query_rewrite_enabled

SID NAME TYPE VALUE
-------- ----------------------------- ----------- -----
* query_rewrite_enabled string

Affichez ensuite la valeur en cours d’utilisation

SQL> show parameter query_rewrite_enabled

NAME TYPE VALUE
------------------------------------ ----------- -----
query_rewrite_enabled string TRUE

Vous pourriez interroger les « fixed views » gv$spparameter, gv$parameter et gv$parameter2 pour obtenir le même résultat, mais la commande show de SQL*Plus est bien assez précise pour cette démonstration.

Vous pouvez positionnez une valeur différente pour l’instance comme ci-dessous (On supposera que votre instance s’appelle REDX :

SQL> alter system
set query_rewrite_enabled=TRUE
scope=spfile
sid='REDX';

System altered.

SQL> show spparameters query_rewrite_enabled

SID NAME TYPE VALUE
-------- ----------------------------- ----------- -----
REDX query_rewrite_enabled string TRUE
* query_rewrite_enabled string TRUE

Vous remarquez que le paramètre est en fait positionné 2 fois et comme vous pouvez vous en douter, si vous arrêtez, redémarrez votre instance, le paramètre est TRUE en mémoire (C’est à dire celui avec le nom d’instance comme préfixe) :

SQL> shutdown abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 418484224 bytes
Fixed Size 1300324 bytes
Variable Size 310380700 bytes
Database Buffers 100663296 bytes
Redo Buffers 6139904 bytes
Database mounted.
Database opened.

SQL> show parameter query_rewrite_enabled

NAME TYPE VALUE
------------------------------------ ----------- -----
query_rewrite_enabled string TRUE

Si maintenant vous positionnez le paramètre à FALSE pour ‘*’ comme ci-dessous, en fait, ce que vous faites, c’est changez la valeur pour toutes les instances sauf celles pour lesquelles le paramètre a été explicitement positionné auparavant :

SQL> alter system
set query_rewrite_enabled=FALSE
scope=spfile
sid='*';

SQL> show spparameters query_rewrite_enabled

SID NAME TYPE VALUE
-------- ----------------------------- ----------- -----
* query_rewrite_enabled string FALSE
REDX query_rewrite_enabled string TRUE

Pour vous en persuader, arrêtez, redémarrez l’instance et vous verrez que la valeur du paramètre courant n’a pas changée, bien que vous l’ayez modifiée dans le SPFILE :

SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 418484224 bytes
Fixed Size 1300324 bytes
Variable Size 310380700 bytes
Database Buffers 100663296 bytes
Redo Buffers 6139904 bytes
Database mounted.
Database opened.
SQL> show parameter query_rewrite_enabled

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled string TRUE

1er piège.

Imaginons que pour une raison quelconque, vous ayez une telle configuration et soyons grand seigneur avec la même valeur et que vous ne vous souciez pas de la clause ‘sid=’

SQL> alter system
set query_rewrite_enabled=TRUE
scope=spfile
sid='*';

SQL> alter system
set query_rewrite_enabled=TRUE
scope=spfile
sid='REDX';

SQL> show spparameters query_rewrite_enabled;

SID NAME TYPE VALUE
-------- ----------------------------- ----------- -----
* query_rewrite_enabled string TRUE
REDX query_rewrite_enabled string TRUE

Si vous exécutez la commande ALTER SYSTEM SET sans la clause sid=, voici ce qu’il va ce passer :

SQL> alter system
set query_rewrite_enabled=FALSE
scope=spfile;

SQL> show spparameters query_rewrite_enabled;

SID NAME TYPE VALUE
-------- ----------------------------- ----------- ------
* query_rewrite_enabled string FALSE
REDX query_rewrite_enabled string TRUE

SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 418484224 bytes
Fixed Size 1300324 bytes
Variable Size 310380700 bytes
Database Buffers 100663296 bytes
Redo Buffers 6139904 bytes
Database mounted.
Database opened.
SQL> show parameter query_rewrite_enabled

NAME TYPE VALUE
------------------------------------ ----------- -----
query_rewrite_enabled string TRUE

Votre DBA a redémarré l’instance pour rien… Mais il y a pire !

2eme piège.

Poussons maintenant le vice avec un paramètre modifiable dynamiquement. Par exemple log_archive_dest_state_2. Modifions une première fois ce paramètre en précisant sid=’REDX’ comme ci-dessous :

SQL> alter system
set log_archive_dest_state_2=defer
sid='REDX';

System altered.

SQL> show parameter log_archive_dest_state_2;

NAME TYPE VALUE
------------------------------------ ----------- -----
log_archive_dest_state_2 string DEFER

Si la deuxième fois, on modifie le paramètre en omettant la clause sid= , comme ci-dessous :

SQL> alter system
set log_archive_dest_state_2=enable;

System altered.

SQL> show parameter log_archive_dest_state_2;

NAME TYPE VALUE
------------------------------------ ----------- ------
log_archive_dest_state_2 string ENABLE

mais si vous arrêtez et redémarrez l’instance, le paramètre reprend la valeur DEFER

SQL> shutdown abort;

ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 418484224 bytes
Fixed Size 1300324 bytes
Variable Size 318769308 bytes
Database Buffers 92274688 bytes
Redo Buffers 6139904 bytes
Database mounted.
Database opened.

SQL> show parameter log_archive_dest_state_2;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_state_2 string DEFER

La raison est évidemment que le SPFILE a été modifie mais pour ‘* » et pas ‘REDX’, comme vous pouvez le voir ci-dessous :

SQL>  show spparameters log_archive_dest_state_2;

SID NAME TYPE VALUE
-------- ----------------------------- ----------- ------
REDX log_archive_dest_state_2 string DEFER
* log_archive_dest_state_2 string ENABLE

Conclusion…

En ce début d’année, nous retiendrons ce qu’il y a de positif dans cet exemple ; évitez de laisser traîner des préfixes dans le fichier SPFILE, sauf si vous le faites exprès. Voici les 2 commandes qui seront vos amies désormais (RAC ou pas, vous l’avez compris !) :

SQL> alter system
reset query_rewrite_enabled
scope=spfile sid='REDX';

SQL> show spparameters query_rewrite_enabled

SID NAME TYPE VALUE
-------- ----------------------------- ----------- -----
* query_rewrite_enabled string TRUE

Et n’oubliez pas que, même si vous faites confiance à Oracle, le plus souvent, vérifier ce que vous venez de faire permet simplement d’éviter se frapper la tête contre les murs quelques jours ou semaines après ! Ça aurait pu être un proverbe chinois, non ?