System Change Number (SCN), par Jonathan Lewis

Cet article est une traduction du glossaire de Jonathan Lewis publié sur son blog. L’article original en anglais se trouve ici.

SCN est l’abréviation de System Change Number ou de System Commit Number (aucun de ces 2 termes n’est vraiment exact)

Le SCN est utilisé comme une sorte d’horloge interne d’une instance Oracle. Mais il n’avance pas régulièrement. C’est un compteur qui est incrémenté à chaque fois qu’une session fait un commit (ou un rollback).

Il peut changer à d’autres occasions: les instances impliquées dans des transactions ou requêtes distribuées vont synchroniser leur SCN (toujours vers un valeur supérieure) à la fin de chaque dialogue. De la même manière, les instances d’une configuration RAC synchronisent leur SCN très fréquemment.

Il y a aussi une autre raison: chaque modification d’un bloc incrémente un ‘change number‘ dans ce bloc qui est composé du SCN courant et d’un compteur sur un octet. Donc s’il y a plus de 255 modifications dans un bloc dans une période où aucun commit ne se fait, alors le SCN va être incrémenté de 1 et ce compteur est remis à 1 (la valeur zéro étant réservée pour marquer un bloc comme corrompu – logically corrupt – ce qui se retrouve dans l’alert.log sous l’erreur ORA-01578).

Une session prend note du SCN courant à différents moments (le début d’une transaction, le commit d’une transaction, le début d’une requête) et le SCN courant est écrit dans la base à différents endroits (controlfiles, entêtes de datafiles, entête de bloc, entrées ITL).

Une session est constamment en train de comparer le SCN courant, ou un des SCN qu’elle a pre-enregistrés, avec les SCN stockés dans la base de données afin de vérifier qu’elle voit une version sûre, correcte et appropriée des données.

Vous pouvez connaître le SCN courant en appelant la fonction dbms_flashback.get_system_change_number ou en faisant select current_scn from v$database. Par contre, chaque requête sur v$database incrémente le SCN, donc CURRENT_SCN sera incrémenté avant d’être affiché.

11 réflexions au sujet de « System Change Number (SCN), par Jonathan Lewis »

  1. Bonjour,
    1. Le ORA_ROWSCN donne le SCN du commit de la derniére transaction qui a modifié le bloc ou la ligne.
    2. Oui, mais le but de cette colonne est de connaitre le log suivant. Il n’est pas forcément renseigné à chaque écriture dans le redo log.
    3. Le SCN est écrit à différents moments, à différents endroits. Il n’y a pas d’autre relation entre eux. C’est comme si on demandait la relation entre l’heure de départ du train affiché en gare, l’heure sur le billet, l’heure de l’horloge de la gare, l’heure où le billet est composté… Le SCN, c’est la même chose: une horloge interne.
    D’après la doc, CONTROLFILE_CHANGE# n’a de sens que pour un backup contol file:
    Last SCN in backup control file; null if the control file is not a backup
    La bonne solution pour connaitre le SCN courant, c’est dbms_flashback.get_system_change_number

  2. bonjour,
    j’ai une autre question svp :
    j’ai remarqué que quand on fais uen bascul d elog (switch lodfile), la valeur du champs CHECKPOINT_CHANGE# de la vue v$database ne change pas, seul la valeur de CONTROLFILE_CHANGE# (tjrs de la vue v$database) qui change et prend la valeur du champ next_change# de la vue v$log_history. J’ai lu que un chekpoint a lieu au basculement du log donc si le champs CONTROLFILE_CHANGE# correspond bien au dernier point de reprise (c’est ce que j’ai lu) il doit changer ?.
    pour qoui donc au switch des log ce paramètre ne change pas ? j’ai remarqué que cette valeur ne cnahge que lors qu’on force le checkpoint.

    Merci de m’apporter tout éclaircissement à propos de la scn et du processus de la synchronisation.

    Je vous remerci infiniment,

  3. Bonjour,
    J’ai un gros soucis sur la compréhension de scn et je suis embrouillé par la lecture de plusieurs documents (ouvrage, article notamment celui de Mohamed) et je reste à ma faim:
    1- J’ai lus que scn est attribué à chaque transaction : alors si j’insert un enregistrement dans une table (exemple insert into scott values (50, ‘test’, ‘Angers’), est ec que das ce cas le ORA_ROWSCN ora_rowscn est égale à scn de la transaction ?. j’ai vérifié la réponse est non.
    C’est quoi donc la différence entre scn de la transaction et scn d’une ligne ?

    2- J’ai remarqué que la valeur du champ next_change# dans la vue v$log_history ne change que si on fait un switch logfile. Or j’ai lus que ce champ donne la valeur du plus grand numéro scn écrit dans le groupe. Mais on écrit dans le group après chaque commit donc à chaque commit ce scn doit changer , non ?.
    C’est quoi la définition exacte de next_change v$log_history ? quand doit-il changé ?
    A quoi correspond exactement controlfile_change# ? quand doit-il changé ?
    3- Comment visualiser le scn après chaque commit ?.
    En bref je souhaite connaitre la relation entre next_change# de la vue v$log_history
    le champ controlfile_change# de la vue v$database et ora_rowscn d’une table.

    Merci pour votre aide,

  4. Simplement pour soumettre une idée sur l’incrémentation du SCN.
    Puisque le SCN est couplé à une sorte d’horloge interne n’est-il pas normal que celui ci change dans le temps(avec ou sans transactions) ?
    SELECT timestamp_to_scn(to_date(’26/09/2010 15:01′,’DD/MM/YYYY HH24:MI’)) « SCN »
    FROM dual;

    Daniel

  5. Bonjour Mohamed,
    Merci je les ai prises en compte. Sauf ‘dans les blocs de données’ où j’ai laissé ‘base’ parce que celà inclut les controlfiles.
    N’hésite pas à faire la même chose sur les autres articles :)
    Cordialement,
    Franck.

  6. Bonjour,

    Quelques remarques sur la traduction

    ….des transactions ou requêtes distribuées vont synchroniser leur SCN (toujours vers une valeur supérieure) à la fin de chaque dialogue.

    …période où aucun commit ne se fait, alors le SCN va être incrémenté de 1 et le compteur d’octet de ce bloc est auto remis à 1

    …et le SCN courant est écrit dans les blocs de données à différents endroits

    …Une session est constament en train de comparer le SCN courant, ou un des SCNs qu’elle a pre-enregistrés, avec les SCNs stockés dans la base de données afin de vérifier

    Bien Cordialement

    Mohamed Houri

  7. Pomalaix,
    J’ai rajouté le dernier paragraphe qui est aussi dans l’article original, à la suite de votre remarque. Je ne connais pas la raison pour laquelle le SCN est incrémenté à chaque fois que le controlfile est lu au travers de v$database.
    Cordialement,
    Franck.

  8. A la question « comment connaître le SCN courant », le lecteur informé répondra « facile, en V10 il y a la colonne CURRENT_SCN dans V$DATABASE ».
    Certes. Mais avez-vous remarqué que chaque consultation fournit une valeur supérieure ? Même à intervalles très bref, alors qu’on ne modifie rien dans la base ?

    Je laisse les lecteurs imaginer une explication, je proposerai la mienne ensuite.

Laisser un commentaire