Vous êtes sur la page 1sur 7

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

Forums Tutoriels Magazine FAQs Blogs Projets Chat Newsletter tudes Emploi Club Contacts

Accueil ALM Java .NET Dv. Web EDI Langages SGBD Oce Solutions d'entreprise Applications Mobiles Systmes
SGBD 4D Access DB2 Firebird InterBase MySQL NoSQL Oracle PostgreSQL SQL-Server
QUIZ

Sybase

FORUM ORACLE

F.A.Q ORACLE

TUTORIELS ORACLE

TUTORIELS SQL

SCRIPTS SQL

LIVRES ORACLE

SCN : System Change Number


Date de publication : le 26 Septembre 2005 Par Mohammed Bouayoun Ce tutoriel prsente la notion du SCN : l'horloge d'Oracle (Oracle 8i 10g) 1. SCN System Change Number 2. SCN courant 3. SCN et consistance de la base 4. Le pseudo colonne ORA_ROWSCN 5. La table SMON_SCN_TIME 6. SCN Wrap et SCN Bas 7. SCN Haut et Bas 8. SCN hors-ligne normal 9. Stop SCN et Start SCN 10. Unrecoverable SCN

1. SCN System Change Number


SCN est un nombre qui peut dnir une version enregistre (commit) de la base dans un temps bien prcis. Quand il y a un commit sur une transaction, oracle lui assigne un nombre unique SCN qui identiera cette transaction. SCN est une sorte d'horloge logique d'oracle et il ne faut pas le confondre avec l'horloge systme, il est unique et s'accrot dans le temps mais pas squentiellement et il ne prend jamais la valeur 0 tant que la base n'est pas recre. Oracle eectue une restauration uniquement par rapport au SCN. Par contre vous pouvez choisir l'une des mthodes suivantes : par SCN, par HORDATE, ou par chier de contrle. Voir article : Sauvegarde et restauration de donnes Pour un commit de 16 transactions par seconde, il faudrait 500 ans pour dpasser le SCN autoris dans oracle. SCN dsigne bien "SYSTEM CHANGE NUMBER" et non "SYSTEM COMMIT NUMBER", il sut de voir dans les vues V$ on utilise la colonne CHANGE# pour dsigner le SCN.

2. SCN courant
Pour trouver le SCN courant dans une base 10g, on utilise le package DBMS_FLASHBACK :
SQL> select dbms_flashback.get_system_change_number() from dual; DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER() ----------------------------------------2542736 SQL>

3. SCN et consistance de la base

1 sur 7

18/10/2012 12:08

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

SCN joue un rle important sur la consistance de la base. Au dmarrage de la base, le processus SMON vrie le SCN dans toutes les enttes des chiers de donnes. Tout se passe bien si les SCN sont les mmes que celui du chier de contrle. Le SCN joue encore un rle important pendant la lecture des blocs Oracle. Au dbut, un SCN est attribu la requte (SCN1), aprs elle lit le SCN de la dernire modication dans le bloc (SCN2), si SCN2 est suprieur SCN1, cela signie que le bloc t modi aprs le dmarrage de la requte. Dans ce cas, Oracle cherche une ancienne version du bloc dans le roll back segment.

4. Le pseudo colonne ORA_ROWSCN


Oracle 10g fournit un nouveau pseudo colonne ORA_ROWSCN, qui consiste en un timestamp comit ou en un SCN qui fournit aux applications et aux utilisateurs la capacit d'appliquer ecacement des verrous optimistes. Dans les versions antcdentes, quand on envoiyait des mises jours la base, les applications devaient lire les valeurs de toutes les colonnes ou d'un indicateur de colonne spci par l'utilisateur, et les comparer avec ceux prcdemment rapports. Avec ce nouveau dispositif, seule la ligne SCN est exige d'tre compare pour vrier qu'une ligne n'a pas t modie depuis le select jusqu'aux mises jour. Le pseudo colonne renvoie, pour chaque version de chaque ligne, le SCN de la ligne. On ne peut pas l'utiliser pour les vues. Toutefois, vous pouvez l'utiliser pour se rfrer aux tables sous-jacentes pendant la cration des vues. Et vous pouvez aussi l'utiliser dans la clause WHERE dans l'instruction UPDATE ou DELETE. Par exemple :
SQL> SELECT ora_rowscn FROM tab_test; ORA_ROWSCN ---------351744 351744 351744 351744 351744 351744 6 rows selected.

Dans cette requte, on remarque que tous les enregistrements de la table TAB_TEST sont comits par la mme transaction. Maintenant, on va modier certaines lignes dans la table :
UPDATE tab_test SET valeur=valeur*1.1 WHERE col_id=1; 3 rows updated. SQL> commit; Commit complete SQL> SELECT ora_rowscn FROM tab_test: ORA_ROWSCN ---------351744 351744 351744 371423 371423 371423 6 rows selected.

Une fonction trs pratique qui nous permet de retrouver la date de la dernire modication d'une ligne, appele : SCN_TO_TIMESTAMP. Par exemple :
SQL> select scn_to_timestamp(ora_rowscn) from tab_test; SCN_TO_TIMESTAMP(ORA_ROWSCN) 27-SEP-05 11.06.08.000000000 PM 27-SEP-05 11.06.08.000000000 PM 27-SEP-05 11.06.08.000000000 PM

2 sur 7

18/10/2012 12:08

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

27-SEP-05 04.33.19.000000000 PM 27-SEP-05 04.33.19.000000000 PM 27-SEP-05 04.33.19.000000000 PM 6 rows selected.

ORA_ROWSCN n'est pas support pour les tables externes. Mais il est trs utilis dans le ashback.

5. La table SMON_SCN_TIME
La table SMON_SCN_TIME est disponible partir d'Oracle 9i. En 9i le processus SMON rempli cette table toutes les 5 minutes avec la date (timestamp) et le SCN courant. Toutefois, il ne garde que 5 jours (1440 lignes = 5*24*12) de lignes.
SQL> select count(*) from smon_scn_time; COUNT(*) ---------1440

On remarque que dans Oracle 9i, le processus SMON se rveille toutes les 5 minutes (presque). Par contre, sous 10g, la table SMON_SCN_TIME est remplie chaque +/- 3 secondes.
SQL> select count(*) from smon_scn_time; COUNT(*) ---------1597

Une minute aprs, on a :


SQL> select count(*) from smon_scn_time; COUNT(*) ---------1595

Ce qui montre que le nombre de lignes dans la table SMON_SCN_TIME n'est pas xe. Dans oracle 9i, la description de la table SMON_SCN_TIME est :
SQL> desc SMON_SCN_TIME Name Null? ----------------------------------------- -------THREAD TIME_MP TIME_DP SCN_WRP SCN_BAS

Type ----------NUMBER NUMBER DATE NUMBER NUMBER

Dans Oracle 10g, on a d'autres lignes en plus :


SQL> desc SMON_SCN_TIME Nom NULL ? Type ----------------------------------------- -------- ---------THREAD TIME_MP TIME_DP SCN_WRP SCN_BAS NUM_MAPPINGS TIM_SCN_MAP SCN ORIG_THREAD NUMBER NUMBER DATE NUMBER NUMBER NUMBER RAW(1200) NUMBER NUMBER

6. SCN Wrap et SCN Bas


Le SCN est constitu de deux parties : YYYY .XXXXXXXX. La partie YYYY s'appelle SCN Wrap (2 bytes) et la partie XXXXXXXX s'appelle SCN Bas (4 bytes). En gnral, on appelle SCN juste la partie SCN Bas.

3 sur 7

18/10/2012 12:08

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

7. SCN Haut et Bas

Chaque chier journal contient un SCN Haut et un SCN Bas. On remarque dans la requte que le SCN haut d'une squence est gal au SCN bas de la squence suivante sauf s'il y a un RESETLOGS (par exemple entre la squence 22 et 1).
SQL> select sequence#,first_change#,next_change#,resetlogs_change# from v$log_history;

SEQUENCE# ---------18 19 20 21 22 1 2 3 4 5

FIRST_CHANGE# ------------454728 454730 454732 454734 454736 458239 461610 462733 467288 476095

NEXT_CHANGE# -----------454730 454732 454734 454736 454747 461610 462733 467288 476095 496820

RESETLOGS_CHANGE# ----------------318842 318842 318842 318842 318842 458239 458239 458239 458239 458239

Un RESETLOGS initialise le numro de squence 1 mais le SCN continue s'accrotre.

8. SCN hors-ligne normal


Chaque fois qu'un tablespace est mis hors ligne normalement, un SCN hors-ligne normal est mis dans le tablespace TS$. Mme chose quand un tablespace est mis en mode BEGIN BACKUP. Voir l'article : Sauvegarde et restauration
SQL> select name,scnbas,scnwrp from ts$ where ts#=4; NAME SCNBAS SCNWRP ------------------------------ ---------- ---------USERS 0 0 SQL> alter tablespace users offline; SQL> select name,scnbas,scnwrp from ts$ where ts#=4; NAME SCNBAS SCNWRP ------------------------------ ---------- ---------USERS 1067840 0

On convertit la valeur 1067840 en hexadcimal :


SQL> select to_char(1067840,'xxxxxxxx') from dual; TO_CHAR(1 --------104b40

SQL> alter tablespace users online;

Et si on fait un dump du chier de contrle on voit bien :

4 sur 7

18/10/2012 12:08

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

Offline scn: 0x0000.00104b40 prev_range: 0

9. Stop SCN et Start SCN


Aprs un checkpoint complet, Oracle stocke le SCN individuellement dans le chier de contrle pour chaque chier de donnes. On l'appelle Checkpoint SCN ou Start SCN. Voir Fichier de contrle pour plus de prcisions.
SQL> select name,checkpoint_change# from v$datafile where name like '%US%'; NAME -------------------------------------------------D:\ORACLE\PRODUCT\10.2.0\ORADATA\B10G2\USERS01.DBF CHECKPOINT_CHANGE# -----------------2578898

SQL> alter system checkpoint; Systme modifi. SQL> select name,checkpoint_change# from v$datafile where name like '%US%'; NAME -------------------------------------------------D:\ORACLE\PRODUCT\10.2.0\ORADATA\B10G2\USERS01.DBF CHECKPOINT_CHANGE# -----------------2594034

SQL> select name,checkpoint_change# from v$datafile where name like '%SYST%'; NAME -------------------------------------------------D:\ORACLE\PRODUCT\10.2.0\ORADATA\B10G2\SYSTEM01.DBF CHECKPOINT_CHANGE# -----------------2594034

On voit bien que le SCN a t modi aprs le checkpoint et que tous les chiers de donnes ont le mme SCN. Dans le chier de contrle, il y a un stop SCN pour chacun des chiers de donnes. Quand un chier de donnes est en ligne et que la base est ouverte, le Stop SCN pour ce chier de donnes prend la valeur innie (0xf.). Si un tablespace est mis hors-ligne tous ces chiers de donnes auront un Stop SCN dans le chier de contrle. Il n y'aura aucun redo gnr pour ces chiers de donnes quand le Stop SCN est allou.

Faire un dump du chier de contrle


SQL> alter session set events 'immediate trace name CONTROLF level 12';

Dans USER_DUMP_DEST on a la trace suivante :


DATA FILE #4: (name #4) D:\ORACLE\PRODUCT\10.1.0\ORADATA\AYMAN\USERS01.DBF creation size=0 block size=8192 status=0xe head=4 tail=4 dup=1 tablespace 4, index=4 krfil=4 prev_file=0 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 Checkpoint cnt:318 scn: 0x0000.00103843 03/28/2005 13:00:23 Stop scn: 0xffff.ffffffff 03/28/2005 04:05:01

5 sur 7

18/10/2012 12:08

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

Creation Checkpointed at scn: 0x0000.00002288 03/09/2004 23:58:42 thread:0 rba:(0x0.0.0) enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000 Offline scn: 0x0000.0006fdfe prev_range: 0 Online Checkpointed at scn: 0x0000.0006fdff 03/16/2005 01:00:58

00000000 00000000

Quand le chier de donnes est en ligne, on a le Stop SCN = 0xFFFF.FFFFFFFF et le start SCN = 0x0000.00103843. On peut trouver le mme rsultat en utilisant la vue v$datale, seulement la valeur du SCN est vide.
select name,last_change# from v$datafile where name like '%USER%'; NAME ---------------------------------------------------D:\ORACLE\PRODUCT\10.2.0\ORADATA\B10G2\USERS01.DBF LAST_CHANGE# ------------

Mettre le tablespace USERS hors-ligne


SQL> alter tablespace users offline;

Puis encore une fois un dump du chier de contrle


SQL> alter session set events 'immediate trace name CONTROLF level 12';

On a la trace suivante :
DATA FILE #4: (name #4) D:\ORACLE\PRODUCT\10.1.0\ORADATA\AYMAN\USERS01.DBF creation size=0 block size=8192 status=0x80 head=4 tail=4 dup=1 tablespace 4, index=4 krfil=4 prev_file=0 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 Checkpoint cnt:319 scn: 0x0000.00104207 03/28/2005 14:18:13 Stop scn: 0x0000.00104207 03/28/2005 14:18:13 Creation Checkpointed at scn: 0x0000.00002288 03/09/2004 23:58:42 thread:0 rba:(0x0.0.0) enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000 Offline scn: 0x0000.0006fdfe prev_range: 0 Online Checkpointed at scn: 0x0000.0006fdff 03/16/2005 01:00:58

00000000 00000000

Ou en utilisant la requte suivante :


select name,last_change# from v$datafile where name like '%USER%';

Quand le chier de donnes est hors ligne le Stop SCN = 0x0000.00104207 et le Start SCN = 0x0000.00104207. On remarque que le compteur du checkpoint a t incrment de 1, ce qui signie que mettre un tablespace oine conduira automatiquement un checkpoint pour ces chiers de donnes. La restauration de la base en utilisant le BACKUP du chier de contrle oblige toujours un RESETLOGS pour ouvrir la base. Le chier de contrle (dans le secteur de chier de donnes) a un Start SCN et un Stop SCN dans chaque chier de donnes. Quand vous utilisez le bon chier de contrle (courant) avec les redo logs en cours pour restaurer la base, le processus de restauration vrie le changement du SCN dans les redo logs avec le Stop SCN dans le chier de contrle et arrte la restauration. Dans ce cas, la restauration est complte et vous pouvez ouvrir la base sans utiliser le RESETLOGS. En gnral, le Stop SCN est mis jour dans tous les enttes du chier de donnes et dans le chier de contrle dans la section chier de donnes. Si la base est arrte anormalement (Shutdown Abort ou un crash), le Stop SCN n'est pas mis jour. Il restera 0x.. Si Oracle trouve que le SCN est gal 0x..f pendant le dmarrage, il conclut que la base n'a pas t arrte normalement et lance une restauration.

10. Unrecoverable SCN


Oracle conserve un unrecoverable SCN pour chaque chier de donnes. C'est le SCN de la modication la plus rcente pour ce chier de donnes par l'opration NOLOGGING. Le unrecoverable SCN de chaque chier de donnes est enregistr dans la section chier de donnes du chier de contrle. Il est mis jours chaque fois que le chier de donnes est aect par l'opration NOLOGGING, a moins que l'vnement 10359 t mis. Unrecoverable SCN est utilis par RMAN pour dterminer si le chier de donnes t aect par l'opration NOLOGGING depuis le dernier backup complet ou incrmental du chier de donnes.

6 sur 7

18/10/2012 12:08

Mohammed Bouayoun

http://mbouayoun.developpez.com/scn/

Responsable bnvole de la rubrique Oracle : Idelways - Contacter par email

Developpez.com
Nous contacter Participez Informations lgales

Services
Forum Oracle Blogs Hbergement

Partenaires
Hbergement Web

Copyright 2000-2012 - www.developpez.com

7 sur 7

18/10/2012 12:08