Publié le: 10 juillet 2018 Auteur: Bastiaan Bak Catégorie: Développement et opérations informatiques
Il y a quelque temps, nous avions un avertissement sur la croissance intrinsèque du SCN (numéro de changement de système) dans notre fichier d’alerte de base de données Oracle 12.2. Cette situation s’est produite plusieurs fois en quelques semaines.
» Avertissement : Le taux de croissance intrinsèque de SCN a toujours été
supérieur à 16384 par seconde par défaut du système pendant les 60 dernières minutes.
Le taux de croissance intrinsèque actuel de SCN est de 25867 par seconde, zas 200fffff!
La valeur SCN actuelle est 46747726691, la valeur Compat SCN est 1″
Ma réaction initiale était que les SCN sont liés aux commits, donc soit la charge sur la base de données était très élevée, soit la logique de l’application devait être modifiée. Une autre possibilité était qu’un commit soit effectué après chaque mise à jour, au lieu d’utiliser des commits par lots.
Cela s’est avéré un peu plus compliqué que prévu. Où regardez-vous lorsque vous voulez trouver la relation entre SCN et commits ? Et à quel point cet avertissement est-il sérieux de toute façon? Ce blog va parler des différentes façons dont j’ai étudié ce problème et identifié l’impact potentiel.
Notes de support Oracle
Le premier endroit pour rechercher des informations sur les avertissements dans le fichier d’alerte est le site Web de support Oracle. J’ai trouvé plusieurs notes connexes:
- ORA-19706 et les messages de journal d’alerte Associés (ID Doc 1393360.1)
Cette note suggère que le message réel est spécifique à la version 12.2 de la base de données, mais dans les anciennes versions, nous pourrions avoir des avertissements similaires, comme « Avertissement: La marge de sécurité SCN pour cette base de données n’est que de NN jours! »
Si vous rencontrez un message de journal d’alerte comme l’une de ces entrées, il est conseillé de suivre les instructions de l’ID 1388639.1 et d’enregistrer une demande de service avec le support Oracle.
Preuves à collecter lorsque vous signalez des problèmes de » taux SCN élevé » au support Oracle (ID Doc 1388639.1) - Cette note donne des informations sur les informations que vous devez fournir lors de la journalisation d’une demande de service.
- Numéro de changement de système (SCN), Espace libre, Informations de sécurité et de correctif (ID Doc 1376995.1)
Cette note donne plus d’informations sur l’utilisation du SCN. Le numéro de changement de système (SCN) est un horodatage interne logique utilisé par la base de données Oracle. Les SCN ordonnent les événements qui se produisent dans la base de données. La base de données utilise SCNs pour interroger et suivre les modifications. Lorsqu’une transaction est validée, la base de données enregistre un SCN pour cette validation.
Il existe une limite supérieure au nombre de SCN qu’une base de données Oracle peut utiliser. La limite est actuellement de 281 billions (2 ^ 48) de valeurs SCN.
Étant donné qu’il existe une limite supérieure, il est important qu’une base de données Oracle donnée ne soit pas à court de SCN disponibles.
La note explique également quand l’avertissement est déclenché. La base de données Oracle calcule une limite » à ne pas dépasser » pour le nombre de SCN qu’une base de données peut actuellement utiliser, en fonction du nombre de secondes depuis 1988 multiplié par 16384. Cela garantit que les bases de données Oracle rationneront les SCN au fil du temps.
Quelle est la gravité de cet avertissement?
L’alerte est déclenchée à un rythme de 2^14 = 16384 SCNs par seconde pendant les 60 dernières minutes.
Le NCS maximum est 2^48 = 281.474.976.710.656.
À raison de 16348 SCN par seconde, nous aurons 2^ (48-14) secondes, soit 544 ans pour atteindre ce maximum. Cela devrait suffire dans une situation normale, mais la limite supérieure de 2 ^ 48 n’est que la valeur absolue maximale que la base de données peut stocker.
La limite est également liée au nombre de secondes depuis 1988. La limite de 2^ 48 est le maximum de l’année 2532 (1988 + 544). Mais en 2018, le maximum est (2018-1988)*365*24*60*60*2^14 = 1.550.057.472.000.
L’avertissement ne doit pas être ignoré. Lorsque vous atteignez la limite, vous obtiendrez des erreurs ora-600, mais lorsque vous atteignez la limite supérieure absolue SCN, la base de données cessera de fonctionner.
La bonne nouvelle est que dans notre situation, l’avertissement indiquait que le taux de croissance du NCS était de 25867 par seconde à cette heure spécifique, nous nous sommes donc un peu rapprochés (25867-16384 = 9483) de la limite. Nous ne nous approchons pas de la limite toutes les heures; le taux de croissance normal est inférieur à 16384.
Support Oracle
Nous avons appelé le support Oracle, et ils nous ont dit qu’Oracle Development travaillait actuellement sur ce problème.
La prise en charge d’Oracle a confirmé que la marge du SCN était bonne. Sur la base du rapport AWR, le support Oracle a remarqué un nombre élevé de validations et a suggéré de vérifier auprès de l’équipe d’application la validation en augmentant la taille de la transaction.
Enquête avec AWR
L’avertissement dans le fichier d’alerte nous a indiqué que le taux de croissance intrinsèque du SCN était constamment supérieur à celui par défaut du système: 16384 par seconde pendant les 60 dernières minutes. Si nous envisageons une période d’une heure, un rapport AWR pourrait être un bon point de départ. Nous avons AWR configuré pour faire des instantanés toutes les heures.
Dans le rapport AWR, j’ai remarqué que le nombre de commits utilisateur était de 210 par seconde. Oui, c’est beaucoup de commits, mais ce n’est pas si différent de la charge normale de cette base de données. Et si un commit est lié à un SCN, il est également bien inférieur à 16384 par seconde.
Le rapport AWR contenait également une constatation ADDM : Les attentes sur l’événement » synchronisation du fichier journal » lors de l’exécution des opérations de VALIDATION et de RESTAURATION prenaient beaucoup de temps dans la base de données. Étudiez la logique de l’application pour une éventuelle réduction du nombre d’opérations de VALIDATION en augmentant la taille des transactions.
Cette réduction des commits dans la conclusion ADDM a également été suggérée par le support Oracle. De mon point de vue, ce n’était pas vraiment si élevé que ça.
Délai plus court
Parce que l’AWR ne m’aidait pas à trouver la cause, j’avais besoin d’enquêter sur un délai plus court. Je voulais connaître un calendrier plus précis pour pouvoir créer un rapport ASH. La valeur par défaut pour ASH est de 15 minutes.
Le prochain défi était donc de trouver la période de 15 minutes pendant laquelle le taux de croissance du NCS était le plus élevé.
ID de document 1388639.1 suggéré d’interroger varcharchived_log. Cette vue contient des informations sur tous les commutateurs de journal de la base de données, y compris un horodatage et le SCN. Bien que vous puissiez mapper les horodatages aux SCN, ce n’est pas vraiment mieux que le rapport AWR. Nous sommes toujours collés à des horodatages aléatoires; dans ce cas, l’horodatage du commutateur de connexion.
Utilisation de la fonction timestamp_to_scn
Une meilleure façon consiste à utiliser la fonction timestamp_to_scn. Cette fonction renvoie un SCN basé sur un horodatage, comme l’horodatage actuel:
SQL > SÉLECTIONNEZ timestamp_to_scn (sysdate) À PARTIR DE dual ; TIMESTAMP_TO_SCN (SYSDATE) ------------------------- 91903104563 SQL>
L’étape suivante consistait à dresser une liste des horodatages avec le SCN correspondant et la limite supérieure du SCN correspondant, basée sur le nombre de secondes depuis 1988 multiplié par 16 384.
Affiche les horodatages et les SCN du dernier jour:
SÉLECTIONNEZ sysdate - (rownum/24) datetimestamp , timestamp_to_scn(sysdate-(rownum/24)) SCN , (( sysdate-(rownum/24)) -to_date('01-01-1988', 'JJ-MM-AAAA' )) * 24 * 60 * 60 * 16384 upper_lmt DE double CONNECTEZ-VOUS PAR rownum <= 24 /
DATE DE L'HORODATAGE SCN UPPER_LMT ------------------- -------------------- -------------------- 09-07-2018-13:23:39 95423916508 15780233527296 09-07-2018-12:23:39 95380086165 15780174544896 09-07-2018-11:23:39 95338871931 15780115562496 09-07-2018-10:23:39 95303437600 15780056580096 09-07-2018-09:23:39 95265573942 15779997597696 09-07-2018-08:23:39 95226645452 15779938615296 09-07-2018-07:23:39 95186822906 15779879632896 09-07-2018-06:23:39 95147382509 15779820650496 09-07-2018-05:23:39 95115474008 15779761668096 09-07-2018-04:23:39 95079712219 15779702685696 09-07-2018-03:23:39 95041469231 15779643703296 09-07-2018-02:23:39 95006499794 15779584720896 09-07-2018-01:23:39 94975060529 15779525738496 09-07-2018-00:23:39 94945771055 15779466756096 08-07-2018-23:23:39 94907451372 15779407773696 08-07-2018-22:23:39 94875158341 15779348791296 08-07-2018-21:23:39 94838756696 15779289808896 08-07-2018-20:23:39 94800190958 15779230826496 08-07-2018-19:23:39 94757984611 15779171844096 08-07-2018-18:23:39 94724548846 15779112861696 08-07-2018-17:23:39 94685506947 15779053879296 08-07-2018-16:23:39 94646644945 15778994896896 08-07-2018-15:23:39 94605003069 15778935914496 08-07-2018-14:23:39 94572205685 15778876932096 24 lignes sélectionnées.
Le SCN actuel est d’environ 0,57% de la limite supérieure actuelle.
Trouver le taux de SCN le plus élevé
Sur la base de cette idée, j’ai créé une requête qui me donne le délai de 15 minutes avec la plus forte croissance des SCN au cours des 3 derniers jours.
Chaque minute, un nouveau délai commence, et comme nous avons 1440 minutes en un jour, nous avons 4320 délais pour enquêter. Pour chacun d’eux, nous devons calculer la croissance du SCN dans ce délai de 15 minutes.
Nous voulons seulement montrer les meilleurs résultats, dans ce cas uniquement les délais avec un taux de plus de 14000 par seconde.
MODIFIER L'ENSEMBLE DE SESSION nls_date_format = 'MM/JJ/AA HH24:MI' ; AVEC datelist COMME ( SÉLECTIONNEZ sysdate - (rownum/1440) - (15/1440) heure de démarrage interval intervalle de 15 minutes , sysdate - (rownum/1440) heure de fin DE double CONNECTEZ-VOUS PAR rownum <= (3*1440) -- 3 historique des jours ) SÉLECTIONNEZ heure de démarrage , heure de fin , timestamp_to_scn(heure de fin) - timestamp_to_scn(heure de début) scngrowth , round((timestamp_to_scn(heure de fin) - timestamp_to_scn(heure de début)) / (((24*60*60)*( heure de fin - heure de début )))) scnrate DE la liste de données OÙ round((timestamp_to_scn(heure de fin) - timestamp_to_scn(heure de début)) / (((24*60*60)*( heure de fin - heure de début )))) >= 14000 COMMANDER PAR 4 DESC /
HEURE DE DÉBUT HEURE DE FIN TAUX DE CROISSANCE TAUX DE CROISSANCE -------------- -------------- -------------------- -------------------- 07/06/18 18:09 07/06/18 18:24 12761928 14180 07/07/18 05:20 07/07/18 05:35 12742537 14158 07/09/18 13:59 07/09/18 14:14 12705077 14117 07/09/18 12:57 07/09/18 13:12 12672507 14081 07/09/18 07:06 07/09/18 07:21 12654287 14060
Nous avons donc maintenant trouvé les intervalles de temps de 15 minutes (qui se chevauchent parfois) avec le taux de SCN le plus élevé (croissance de SCN par seconde) au cours des 3 derniers jours. Et même dans ces délais, le taux de NCS est toujours inférieur à 16384. Aucun avertissement dans le fichier d’alerte cette semaine ….
Exécution du rapport ASH
Le format de date que j’ai utilisé dans la requête ci-dessus est le même que celui utilisé par le rapport ASH, vous pouvez donc simplement copier / coller l’heure de début. Pour la durée, nous entrons 15 minutes.
SQL > @@ORORACLE_HOME/SGBDR/admin/ashrpt.sql Exemples de CENDRES DANS ce schéma de référentiel de charge de travail ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Échantillon de CENDRES le plus ancien disponible: 01-Juil-18 00:00:01 Dernier échantillon de CENDRES disponible: 09-Juil-18 14:18:58 Spécifiez le délai de génération du rapport ASH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Entrez L'HEURE DE DÉBUT DU rapport: -- Formats d'entrée valides: -- Pour spécifier l'heure de début absolue: -- ] HH24: MI -- Exemples: 02/23/03 14:30:15 -- 02/23 14:30:15 -- 14:30:15 -- 14:30 -- Pour spécifier l'heure de début relative: (commencez par le signe '-') -- - MI -- Exemples : -1:15 (SYSDATE - 1 Heure 15 Minutes) -- -25 ( DATE DU SYSTÈME - 25 Minutes) Par défaut À -15 minutes Entrez LA VALEUR POUR begin_time: 07/06/18 18:09 HEURE de DÉBUT du rapport spécifiée: 07/06/18 18:09 Entrez la durée EN minutes à PARTIR DE L'HEURE DE DÉBUT: Par défaut, SYSDATE-begin_time Appuyez Sur Entrée POUR analyser jusqu'à L'HEURE ACTUELLE Entrez LA VALEUR DE la durée: 15 Durée du rapport spécifiée: 15 UTILISER 06-Jul-18 18:09:00 COMME HEURE DE DÉBUT DU rapport UTILISER 06-Jul-18 18:24:00 COMME HEURE DE FIN DU rapport Spécifiez le nom du rapport ~~~~~~~~~~~~~~~~~~~~~~~ Le nom de fichier de rapport PAR DÉFAUT EST ashrpt_1_0706_1824.HTML. POUR UTILISER ce nom, appuyez sur < return > POUR continuer, sinon entrez une alternative. Entrez LA VALEUR POUR nom_apport: EN utilisant le nom du rapport ashrpt_1_0706_1824.html Résumé DE TOUTES LES ENTRÉES DE L'UTILISATEUR ------------------------- Format : HTML Id DB : 2019395491 Inst num : 1 HEURE DE DÉBUT: 06 - Juil-18 18:09:00 HEURE DE FIN: 06 - Juil-18 18:24:00 Largeur de fente : PAR DÉFAUT Objectifs du rapport : 0 Nom du rapport : ashrpt_1_0706_1824.html
Trouver le NCS dans AWR
Le rapport de l’AWR ne nous a pas montré beaucoup d’informations sur le NCS actuel, mais il contient des informations sur le taux de croissance, si vous savez où le trouver.
Sous « Statistiques d’activité de l’instance », vous pouvez trouver le nombre d' » appels à kcmgas ». Dans la documentation Oracle, cela est décrit comme le « nombre d’appels à kcmgas de routine pour obtenir un nouveau SCN ».
La valeur de ces appels par seconde dans le rapport AWR est très proche du taux SCN calculé avec la fonction timestamp_to_scn.
Vue V$SESSTAT
Le nombre d' » appels à kcmgas » utilisés pour créer un nouveau SCN peut également être trouvé dans les vues V VSESSTAT et V VSYSSTAT.
Nous pouvons utiliser V$SESSTAT pour trouver les sessions qui provoquent un taux de SCN élevé. Nous pouvons également tester l’impact sur le nombre de SCN d’actions spécifiques.
Par exemple, lorsque je fais une sélection sur une grande table qui est également utilisée par d’autres sessions, ma session fera 7 autres appels à kcmgas. Ainsi, ma requête entraînera un SCN plus élevé. Cela est dû à la cohérence en lecture de la base de données, qui utilise également un SCN.
SQL > CONNECTER < utilisateur > / < passer > @ < service> Connecté. SQL > SÉLECTIONNEZ ses.valeur DE v$sesstat ses , v$nom d'état stat OÙ stat.statistique # = ses.statistiques# ET ses.sid IN (SÉLECTIONNEZ sid DANS vmystmystat) ET stat.name = ' appels à kcmgas' / VALEUR -------------------- 2 SQL > SÉLECTIONNEZ COUNT(*) DANS mybigtable ; COMPTER(*) -------------------- 12198814 SQL > SÉLECTIONNEZ ses.valeur DE v$sesstat ses , v$nom d'état stat OÙ stat.statistique # = ses.statistiques# ET ses.sid IN (SÉLECTIONNEZ sid DANS vmystmystat) ET stat.name = ' appels à kcmgas' / VALEUR -------------------- 9 SQL>
En comparant le SCN et le taux de validation
Avec VSESSESSTAT, nous pouvons interroger les statistiques de toutes les sessions actuellement connectées à la base de données. De cette façon, nous pouvons trouver des sessions responsables d’un taux de NCS élevé. Nous pouvons comparer cela au taux de validation de cette session.
Les résultats de la requête ci-dessous nous ont montré que dans notre base de données, le taux élevé de NCS était principalement causé par des processus d’arrière-plan. Pour la plupart des sessions utilisateur, il existe une relation entre un taux SCN élevé et un taux de validation élevé, pour les sessions en arrière-plan, le taux de validation est toujours vide.
SÉLECTIONNEZ ses.sid , décoder (ses.nom d'utilisateur, NULL, 'background', 'user') session_type , ( date d'ouverture de session) * 24 * 60 * 60 connect_secondes , sstat1.valeur SCN# , sstat2.COMMIT DE Valeur# , rond (sstat1.valeur /((sysdate-heure de connexion ) * 24 * 60 * 60),2) _rate de scn , rond (sstat2.valeur /((sysdate-heure de connexion ) * 24 * 60 * 60),2) commit_rate DE v$sesstat sstat1 , v$sesstat sstat2 , v snnom d'état sn1 , v snnom d'état sn2 , vsessionsession ses OÙ sstat1.statistique # = sn1.statistiques# ET sstat2.statistique # = sn2.statistiques# ET sn1.name = ' appels à kcmgas' ET sn2.name = 'commits utilisateur' ET ses.sid=sstat1.sid ET ses.sid= sstat2.sid ORDRE PAR 6 DESC / SID SESSION_TY CONNECT_SECONDS SCN #COMMIT #SCN_RATE COMMIT_RATE ---------- ---------- --------------- ---------- ---------- ---------- ----------- 8478 contexte 459572 214506344 0 466.75 0 7551 contexte 452395 209729934 0 463.6 0 3776 contexte 290389 133863489 0 460.98 0 8496 contexte 121201 55685740 0 459.45 0 8729 contexte 286773 128180386 0 446.98 0 12009 contexte 290392 128867329 0 443.77 0 13173 contexte 196775 87268032 0 443.49 0 12004 contexte 103166 45681480 0 442.8 0 8735 contexte 275980 121563094 0 440.48 0 3096 contexte 430810 185436599 0 430.44 0 8027 contexte 95990 40912187 0 426.21 0 7529 contexte 193218 81367643 0 421.12 0 2370 contexte 527978 219521415 0 415.78 0 14604 contexte 283216 117052382 0 413.3 0 14132 contexte 113965 46586388 0 408.78 0 7552 contexte 294009 119775077 0 407.39 0 13172 contexte 182423 73865595 0 404.91 0 14592 contexte 74414 29767705 0 400.03 0 3802 contexte 268804 107486102 0 399.87 0 9910 contexte 117582 46596720 0 396.29 0 12021 contexte 49182 19321676 0 392.86 0 974 contexte 160816 59996495 0 373.08 0 12723 contexte 74450 25455559 0 341.91 0 3310 contexte 193215 65915175 0 341.15 0 12963 contexte 49179 15687084 0 318.98 0 6111 contexte 3584090 1031139557 0 287.7 0 6829 UTILISATEUR 303 1267 1123 4.18 3.71 9665 UTILISATEUR 904 1845 1691 2.04 1.87 8022 UTILISATEUR 898 1677 1520 1.87 1.69 3323 UTILISATEUR 898 1406 1260 1.57 1.4 2839 UTILISATEUR 7503 10822 9813 1.44 1.31 11060 UTILISATEUR 3892 5334 4781 1.37 1.23 13184 UTILISATEUR 1765 2359 2038 1.34 1.15 9199 UTILISATEUR 898 1135 935 1.26 1.04 2130 UTILISATEUR 8105 9548 8518 1.18 1.05 11525 UTILISATEUR 898 1054 944 1.17 1.05 6130 UTILISATEUR 3895 4453 4199 1.14 1.08 8012 UTILISATEUR 7503 8576 7774 1.14 1.04 4497 UTILISATEUR 898 962 882 1.07.98 5201 UTILISATEUR 7220 7551 6226 1.05.86 11317 UTILISATEUR 12906 13371 11997 1.04.93 1979 LIGNES sélectionnées.
Conclusion
Sachez qu’il y a des limites au SCN, donc lorsque vous trouvez des avertissements dans le fichier d’alertes, vous devez enquêter sur le problème. Si vous trouvez un problème, vous devriez travailler avec le support Oracle. En téléchargeant des informations, ils peuvent vérifier s’il y a suffisamment de place entre le SCN actuel et le SCN maximal.
Les problèmes peuvent être causés par un bogue, comme 12371955: La sauvegarde à chaud peut entraîner une augmentation du taux de croissance SCN entraînant des erreurs ORA-600 (ID Doc 12371955.8).
Si vous voulez trouver le moment exact où il y a une forte croissance de SCN, vous devez convertir les horodatages en SCN. Vous obtenez les meilleurs résultats en utilisant les fonctions SCN_TO_TIMESTAMP et TIMESTAMP_TO_SCN.
Un taux de validation élevé est toujours lié aux processus utilisateur, mais les SCN sont également liés aux processus en arrière-plan. Même les sessions qui ne s’engagent pas peuvent avoir un impact sur le SCN.
DBA avec plus de 15 ans d’expérience. Expérience dans différentes branches, avec plusieurs modules. Comprendre: Base de données Oracle, Oracle RAC, Oracle EBS et PL/SQL.
Plus de messages de Bastiaan Bak