Pour de nombreuses personnes travaillant avec Oracle database, le SCN (Numéro de changement de système) est un sujet qui les intéresse grandement – mais malgré cela, c’est un sujet fascinant, il est également déroutant. Dans cet article, nous allons apprendre le contenu du SCN: ce que c’est, où il est utilisé et comment il fonctionne.
Il convient de mentionner que ce n’est pas et ne peut pas être une couverture complète de tous les détails sur SCN. Cela dit, commençons.
- SCN – Pourquoi en avons-nous besoin?
- Blocs de construction pour comprendre SCN
- Transaction
- Niveaux d’isolation des transactions
- SCN, une introduction
- Format et structure SCN
- Table SMON_SCN_TIME
- Comment pouvons-nous mapper SCN avec l’horodatage dans les versions antérieures à 10g?
- SCN Augmente à l’aide d’une séquence ?
- Conclusion
SCN – Pourquoi en avons-nous besoin?
Supposons que c’est la fin du mois et son jour de paie. Vous faites partie du groupe de paie et, avec l’autorité appropriée, vous avez émis une requête pour extraire le calcul actuel du salaire de tous les employés. Les chiffres circulent sur l’écran, tout se passe bien.
Supposons que, pendant que vous regardez la sortie, un collègue démarre une nouvelle exécution de paiement et que ce travail par lots efface le résumé de calcul actuel. Les choses deviendraient certainement déroutantes si votre sortie affichait soudainement ‘0’ pour les nouvelles lignes qui sortent.
En effet, pour ce scénario, vous vous attendriez probablement à ce que la sortie reflète « l’état de la base de données » – le contenu de chaque ligne – tel qu’il existait au moment où vous avez émis votre requête.
L’une des garanties de la base de données Oracle est qu ‘ »il n’y a pas de lectures sales des données utilisateur ». Si nécessaire, Oracle reconstruira chaque ligne à l’état stable à l’instant où la requête a été émise.
Oracle le fait bien et très précisément grâce à un « timer » propre, connu sous le nom de System Change Number, ALIAS SCN.
Nous discuterons de ces aspects du SCN:
- Le nombre lui-même
- Le générateur de nombres
- Endroits où le nombre est stocké
Alors commençons!
Blocs de construction pour comprendre SCN
Afin d’étudier SCN, plusieurs termes doivent être compris. Bien que ces définitions soient bien documentées, il convient de les répéter ici:
Transaction
Du guide des concepts de la Documentation en ligne Oracle:
» Une transaction est une unité de travail atomique logique qui contient une ou plusieurs instructions SQL. Une transaction regroupe les instructions SQL de sorte qu’elles soient toutes validées, ce qui signifie qu’elles sont appliquées à la base de données, ou toutes annulées, ce qui signifie qu’elles sont annulées de la base de données. Oracle Database attribue à chaque transaction un identifiant unique appelé ID de transaction « .
Plus simplement: lorsque nous démarrons une transaction, nous initions un ensemble de modifications. Celles-ci doivent être complétées dans leur totalité ou ne doivent pas l’être du tout. Comme les transactions se produisent dans la base de données, les utilisateurs lisant une zone qui a changé ne doivent pas être affectés par des effets secondaires pouvant modifier leurs résultats.
Pour que les transactions fonctionnent correctement dans n’importe quelle base de données, quatre règles ACID doivent être suivies par la base de données. Ce sont:
- Atomicité;
- Consistance;
- Isolation;
- Durabilité.
Alors, où le SCN s’intègre-t-il dans tout cela? Et la réponse à cette question est que l’utilisation de SCN uniquement Oracle maintient la cohérence des données. Ceci est fait pour s’assurer qu’à tout moment, il n’y a pas de divergence dans les résultats qui sont montrés aux autres lorsqu’un utilisateur change quelque chose, et vice-versa.
Pour résumer, dans Oracle, le principe « Les lecteurs n’attendent pas les écrivains et les écrivains n’ont pas besoin de lecteurs » est complètement et vraiment suivi. Pour ce faire, il est de la plus haute importance que les données, qui sont actuellement en cours de modification, ne soient accessibles à personne, sauf à la personne qui effectue ces modifications. Pour les transactions, cela est nécessaire pour maintenir l’intégrité des données. Trois choses peuvent se produire qui peuvent perturber cette intégrité: Lecture sale– Lecture Floue et Lecture fantôme. Pour s’assurer qu’il n’y aura aucun problème d’intégrité dans ces transactions, différents niveaux d’isolations sont disponibles. Ce sont:
- Lecture non validée
- Lecture validée
- Lecture répétable
- Sérialisable
Niveaux d’isolation des transactions
À partir de ceux-ci, Oracle propose Read Committed comme niveau d’isolation par défaut, en s’assurant qu’il n’y a aucune possibilité pour un utilisateur de voir les modifications apportées par un autre utilisateur qui ne sont pas encore validées. Il ne doit pas y avoir de lecture sur ces données qui sont marquées comme « sales » et il doit y avoir un mécanisme suffisamment robuste pour rendre tout cela possible.
Pour rendre cela possible, le SCN joue un rôle essentiel.
SCN, une introduction
Le numéro de validation système peut être compris comme la représentation du temps d’Oracle. Oracle utilise SCN pour contrôler la cohérence, effectuer la récupération et ordonner les vecteurs de changement dans la restauration.
Le SCN se trouve à de nombreux endroits – à la fois en mémoire et sur le disque. Différents emplacements sont utilisés pour aider le système de base de données à identifier divers états de la base de données. Par exemple, dans certains endroits, il est utilisé pour indiquer le statut d’achèvement de la transaction et si elle est active ou validée.
Contrairement à la croyance populaire, il n’est pas généré uniquement au moment de la validation, bien que c’est ce que le nom lui-même suggère. SCN est là tout le temps dans la base de données, représentant une partie temporelle de l’opération qui se passe à cet instant. Il n’est pas complètement inexact de dire que SCN n’est pas généré avec un commit, mais ce n’est pas la seule façon dont SCN est généré.
Le SCN est un numéro en deux parties qui est généré sur demande, en réponse à un événement. C’est un peu comme la date et l’heure dérivées d’une combinaison de calendrier et d’horloge; l’horloge change rapidement et ce n’est que lorsqu’elle a traversé le cycle complet de 24 heures que le débordement – le calendrier – change. Cependant, l’événement qui change l’horloge est le « pendule » et est régulier, tandis que l’événement qui change le SCN est un appel à une fonction interne spécifique.
Semblable à un horodatage de calendrier / horloge, la valeur peut être enregistrée à différents endroits, chacun pour une utilisation différente.
Un exemple réel similaire à un SCN est une horloge d’aéroport. Deux personnes entrent dans un aéroport en même temps et peuvent noter l’heure de l’horloge. Ce moment nous donne « un SCN d’entrée » qui se trouve être le même pour les deux personnes. Une personne reçoit un chariot pour les bagages avant l’enregistrement, tandis que l’autre se rend directement au comptoir d’enregistrement. Lorsque les sièges sont attribués, chaque personne peut obtenir un « check-in SCN » différent car les horaires sont légèrement différents. Un » SCN d’embarquement » peut être attribué pour indiquer quand chacun est monté à bord, mais les deux reçoivent le même « SCN de décollage ».
Comme la combinaison du calendrier et de l’horloge, le SCN est garanti pour augmenter en fonctionnement normal. Il n’y a aucune garantie que le nombre sera séquentiel (numéros manquants).
Alors, où ces informations sur SCN sont-elles utilisées dans la base de données Oracle? Eh bien, presque partout. Tout comme nous associons le Temps à chaque activité, SCN est également associé à chaque partie des fonctionnalités de la base de données. Par exemple, lorsque vous essayez de sélectionner des données dans une table, SCN est utilisé pour confirmer que ces données sont cohérentes ou non. SCN se trouve également dans les en-têtes de transaction du bloc de données. Ce SCN représenterait le moment où la transaction a commencé et quand elle a été validée. De même, pour chaque modification effectuée, une entrée dans le journal de reprise est conservée et pour chacune de ces entrées, SCN est utilisé pour représenter le moment de l’occurrence de la transaction.
La cohérence de lecture utilise SCN pour décider de la durée pendant laquelle il doit appliquer Undo sur le tampon sale afin que la demande de données cohérentes en lecture pour une session puisse être terminée. Et comme on le sait, SCN est incrémenté à chaque opération de commit.
Format et structure SCN
SCN est un nombre énorme avec deux composants: Base SCN & Enveloppe SCB.
SCN est un nombre de 6 octets (48 bits). Sur ces 48 bits, SCN_WRAP est un nombre de 16 bits (2 octets) et SCN_BASE est un nombre de 32 bits (4 octets). Les deux ENVELOPPEMENTS BASE & sont utilisés pour contrôler l’incrément du SCN et pour s’assurer que la base de données ne sera pas épuisée. SCN_WRAP est incrémenté de 1 lorsque SCN_BASE atteint la valeur de 4 milliards et SCN_BASE devient 0.
À partir de la version 12c d’Oracle, le numéro SCN est un nombre de 8 octets.
Alors, comment voyons-nous la valeur SCN actuelle? Le moyen le plus simple consiste à interroger la BASE de DONNÉES view V$. Jetez un coup d’oeil:
1
2
3
4
5
|
Le code SQL > sélectionnez current_scn à partir de la base de données V$;
CURRENT_SCN
———–
1123790
|
Comme nous pouvons le voir, ce SCN est affiché sous la forme d’un nombre. C’est bien parce que cela facilite l’utilisation de SCN pour nous dans nos déclarations effectuant une récupération, un flashback, etc. Si nous le voulons, nous pouvons également convertir SCN en une valeur hexadécimale:
1
2
3
4
5
|
Le code SQL > sélectionnez to_char(‘1123790’, ‘xxxxxxxx’) scn_hex à partir de dual;
SCN_HEX
———
1125ce
|
Voici un exemple de la sortie de la même vue consultée plusieurs fois:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL > sélectionnez current_scn dans la base de données Vdatabase;
ACTUEL
———–
1178883
SQL> /
ACTUELLE_SCN
———–
1178885
SQL> /
ACTUELLE_SCN
———–
1178886
|
Fait intéressant, cette augmentation de la valeur du SCN montre un aspect important du SCN. Nous pouvons voir qu’à chaque exécution, il y a une augmentation du nombre de SCN. En interrogeant la BASE de DONNÉES view V$, nous provoquons en fait le saut dans le numéro SCN.
Table SMON_SCN_TIME
Le moyen le plus simple de voir ces deux valeurs provient d’une table interne appartenant à l’utilisateur SYS – SMON_SCN_TIME. Ce qui suit est une sortie de la même (11204).
1
2
3
4
5
6
|
SQL > sélectionnez SCN_wrp, SCN_bas, SCN à partir de smon_SCN_time où rownum <3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406
|
Ce tableau contient les entrées des SCN générés. Il stocke les données par incréments d’environ 5 minutes et contient 5 jours de données. Cela signifie que le tableau contient environ 1440 enregistrements. Le nombre exact d’enregistrements variera légèrement puisque l’incrément de stockage n’est pas exactement de 5 minutes.
1
2
3
4
5
|
SQL > sélectionnez count(*) à partir de SMON_SCN_TIME;
COUNT(*)
———-
1494
|
Dans les versions d’Oracle antérieures à 10g, le mappage temporel de SCN avec le temps était de +/-5 minutes, mais à partir de 10g, cela devient +/-3 secondes. Comme il s’agit de magasins dans une table interne, Oracle n’autorise pas directement l’accès aux informations de cette table. Pour y accéder, des API sont fournies. Une de ces API provient du paquet DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, qui peut être utilisé pour accéder au numéro de séquence à partir de cette table. Un exemple de ceci est donné ci-dessous (merci à Tom Kyte pour la requête):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
Le code SQL > l
sélectionnez SCN_to_timestamp(SCN) ts, min(SCN), max(SCN)
à partir de (
sélectionnez dbms_flashback.get_system_change_number() – niveau SCN
à partir du double
connexion par niveau <= 100
)
groupe par SCN_to_timestamp(SCN)
* ordre par SCN_to_timestamp(SCN)
SQL> /
TS MIN (SCN) MAX (SCN)
————————————————————————— ———- ———-
06- MAI – 16 22.05.04.000000000 PM 1245323 1245323
06- MAI – 16 22.05.07.000000000 PM 1245324 1245324
06- MAI – 16 05.22.10.000000000 PM 1245325 1245325
06- MAI – 16 22.05.13.000000000 PM 1245326 1245326
06- MAI – 16 22.05.16.000000000 PM 1245327 1245327
06- MAI – 16 22.05.19.000000000 PM 1245328 1245328
06- MAI – 16 05.22.22.000000000 PM 1245329 1245329
06- MAI – 16 22.05.25.000000000 PM 1245330 1245330
06- MAI – 16 22.05.28.000000000 PM 1245331 1245331
06- MAI – 16 05.22.31.000000000 PM 1245332 1245332
06- MAI – 16 05.22.34.000000000 PM 1245333 1245333
06- MAI – 16 05.22.37.000000000 PM 1245334 1245334
06- MAI – 16 05.22.40.000000000 PM 1245335 1245335
06- MAI – 16 05.22.43.000000000 PM 1245336 1245336
06- MAI – 16 05.22.46.000000000 PM 1245337 1245337
06- MAI – 16 05.22.49.000000000 PM 1245338 1245338
06- MAI – 16 05.22.52.000000000 PM 1245339 1245339
|
Comment pouvons-nous mapper SCN avec l’horodatage dans les versions antérieures à 10g?
Il est important de se rappeler que ce tableau ne montre pas pourquoi il y aurait une augmentation du taux d’augmentation des nombres de SCN. Avec un peu de formatage, il est possible d’avoir une idée des nombres SCN générés mais la source de leur croissance ne sera pas évidente dans ce tableau.
Une autre façon de vérifier cela est à partir de la vue V VLOG_HISTORY. La vue contient le SCN sous la forme des colonnes FIRST_CHANGE # et NEXT_CHANGE # et nous pouvons voir à travers ces deux colonnes la quantité de SCN générée dans la base de données sur une période de temps. Le « first_change # est le SCN le plus bas qui apparaît dans le fichier journal archivé à un numéro de séquence donné de ce thread. Le « next_change # » est le SCN le plus bas qui apparaît dans le fichier journal archivé suivant.
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL > sélectionnez thread #, first_change #, next_change # dans Vloglog_history;
THREAD #FIRST_CHANGE #NEXT_CHANGE#
———- ————- ————
1 925702 958823
1 958823 959634
1 959634 972579
1 972579 993714
1 993714 1020785
1 1020785 1023738
1 1023738 1023873
1 1023873 1023995
|
Comme avec SMON_SCN_TABLE, il n’est pas possible de trouver la source de l’augmentation de la génération des numéros SCN à partir de cette vue de table. Néanmoins, vous pouvez utiliser cette vue dans l’instance unique ainsi que dans un environnement RAC.
SCN Augmente à l’aide d’une séquence ?
Maintenant, il devrait être assez évident que SCN semble être un nombre qui augmente constamment. Fait intéressant, même s’il s’agit d’un nombre, Oracle n’utilise aucune séquence pour l’augmenter mais utilise des fonctions internes à la place. Par exemple, pour augmenter la SCN_BASE, la fonction utilisée en interne est KCMGAS (Get et Advance SCN). Cette fonction est appelée chaque fois qu’un nouveau SCN est demandé et que l’appel pour cette fonction est augmenté. De la même manière que cette fonction, KCMGCS (Get Current SCN) est utilisé pour obtenir le SCN actuel et l’appel utilisé pour celui-ci. Ces appels de fonction peuvent être vus depuis la vue Vsysysstat. On trouvera une description de ces statistiques dans le guide de référence 12.1.
Voyons comment ces appels sont liés à la génération SCN. Nous utilisons deux sessions ici – l’une pour voir les appels dans la vue view VSYSYSSTAT, et l’autre session pour extraire le SCN.
1
2
3
4
5
6
7
8
9
10
|
Session -1
SQL > l
1 * sélectionnez current_SCN dans la base de données V
SQL> /
ACTUELLE_SCN
———–
698815
SQL>
|
Pour ce SCN, ce sont les valeurs de Vsysysstat:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL > l
1 sélectionnez le nom, la valeur de Vsysysstat
2 * où le nom comme ‘%calls to%’
SQL> /
NOM VALEUR
—————————————————————- ———-
appels à kcmgcs 427
appels à kcmgrs 0
appels à kcmgas 7272
appels pour obtenir un instantané SCN : kcmgss 159790
SQL>
|
Émettons une requête pour voir le SCN actuel dans la session 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SQL> l
1* select current_SCN from V$database
SQL> /
CURRENT_SCN
———–
698815
SQL> /
CURRENT_SCN
———–
698889
SQL>
|
And voici le résultat de la deuxième session 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL> /
NOM VALEUR
—————————————————————- ———-
appels à kcmgcs 427
appels à kcmgrs 0
appels à kcmgas 7272
appels pour obtenir un instantané SCN: kcmgss 159790
SQL> /
NOM VALEUR
—————————————————————- ———-
appels à kcmgcs 427
appels à kcmgrs 0
appels à kcmgas 7278
appels pour obtenir un instantané SCN : kcmgss 159905
SQL>
|
Nous pouvons voir que les appels au KCMGAS ont augmenté à 7278 de la dernière valeur, 7272. Comme Oracle n’utilise pas de séquence pour augmenter le nombre, il n’y a aucune garantie que le numéro SCN sera toujours augmenté dans le même ordre.
Conclusion
Dans cet article, nous avons examiné ce qu’est le SCN, comment le visualiser et quelles en sont les exigences. Dans le prochain article, nous verrons quels sont les différents types de SCN disponibles et comment ils sont utilisés dans la base de données. Restez à l’écoute !