publicat la: 10 iulie 2018 autor: Bastiaan Bak Categorie: dezvoltare și operațiuni IT
cu ceva timp în urmă, am avut un avertisment cu privire la creșterea intrinsecă a SCN (numărul de schimbare a sistemului) în fișierul nostru de alertă pentru baza de date Oracle 12.2. Această situație a avut loc de mai multe ori în câteva săptămâni.
„avertisment: rata de creștere intrinsecă SCN a fost în mod constant
mai mare decât implicit sistem 16384 pe sec. pentru ultimele 60 de minute.
rata actuală de creștere intrinsecă SCN este de 25867 pe sec., zas 200fffff!
valoarea SCN curentă este 46747726691, valoarea SCN Compat este 1″
reacția mea inițială a fost că SCN-urile sunt legate de comiteri, deci fie încărcarea bazei de date a fost foarte mare, fie logica aplicației ar trebui schimbată. O altă posibilitate a fost că o comitere a fost făcută după fiecare actualizare, în loc să se utilizeze comiteri batch.
s-a dovedit a fi puțin mai complicat decât mă așteptam. Unde te uiți atunci când doriți să găsiți relația dintre SCNs și comite? Și cât de grav este acest avertisment oricum? Acest blog va fi despre diferitele moduri în care am investigat această problemă și am identificat impactul potențial.
Oracle Support Note
primul loc pentru a căuta informații despre avertismente în fișierul de alertă este site-ul Web Oracle Support. Am găsit mai multe note conexe:
- ORA-19706 și mesaje de jurnal de alertă conexe (Doc ID 1393360.1)
această notă sugerează că mesajul real este specific versiunii bazei de date 12.2, dar în versiunile mai vechi este posibil să avem avertismente similare, cum ar fi „avertisment: spațiul SCN pentru această bază de date este doar NN zile!”
Dacă întâmpinați un mesaj de jurnal de alertă ca oricare dintre aceste intrări, vi se recomandă să urmați instrucțiunile din ID 1388639.1 și să înregistrați o solicitare de serviciu cu Oracle support.
dovezi de colectat atunci când raportați probleme cu „rata SCN ridicată” către Oracle Support (Doc ID 1388639.1) - această notă oferă informații despre informațiile pe care ar trebui să le furnizați atunci când înregistrați o solicitare de serviciu.
- număr schimbare sistem (SCN), spațiu pentru cap, securitate și informații despre corecții (Doc ID 1376995.1)
această notă oferă mai multe informații despre utilizarea SCN. Numărul de modificare a sistemului (SCN) este o marcă de timp internă logică utilizată de baza de date Oracle. SCNs evenimente de ordine care au loc în baza de date. Baza de date utilizează SCN-uri pentru a interoga și urmări modificările. Când o tranzacție se angajează, baza de date înregistrează un SCN pentru această comitere.
există o limită superioară a numărului de SCN – uri pe care le poate utiliza o bază de date Oracle. Limita este în prezent 281 trilioane (2^48) valori SCN.
având în vedere că există o limită superioară, este important ca orice bază de date Oracle dată să nu rămână fără SCN-uri disponibile.
nota explică, de asemenea, când avertismentul este ridicat. Baza de date Oracle calculează o limită” să nu depășească ” pentru numărul de SCN-uri pe care o bază de date le poate utiliza în prezent, pe baza numărului de secunde din 1988 înmulțit cu 16384. Acest lucru asigură că bazele de date Oracle vor raționaliza SCN-urile în timp.
cât de gravă este această avertizare?
avertizarea este ridicată cu o rată de 2^14 = 16384 SCNs pe secundă în ultimele 60 de minute.
SCN maxim este 2^48 = 281.474.976.710.656.
la o rată de 16348 SCNs pe secundă, vom avea 2^(48-14) secunde sau 544 de ani pentru a atinge acest maxim. Acest lucru ar trebui să fie suficient într-o situație normală, dar limita superioară a 2^48 este doar valoarea absolută maximă pe care o poate stoca baza de date.
limita este, de asemenea, legată de numărul de secunde din 1988. Limita de 2^48 este maximă în anul 2532 (1988+544). Dar în 2018 maximul este (2018-1988)*365*24*60*60*2^14 = 1.550.057.472.000.
avertismentul nu trebuie ignorat. Când atingeți limita, veți primi erori ora-600, dar când atingeți limita superioară absolută SCN, baza de date va înceta să funcționeze.
vestea bună este că, în situația noastră, avertismentul a spus că rata de creștere a SCN a fost de 25867 pe secundă în acea oră specifică, așa că în acea oră ne-am apropiat puțin (25867-16384=9483) de limită. Nu ne apropiem de limită în fiecare oră; rata normală de creștere este mai mică decât 16384.
Oracle Support
am sunat la Oracle Support și ne-au spus că Oracle Development lucrează în prezent la această problemă.
suportul Oracle a confirmat că spațiul de trecere SCN arată bine. Pe baza raportului AWR, Oracle Support a observat un număr mare de comiteri și a sugerat să se consulte cu echipa de aplicații pentru a se angaja prin creșterea dimensiunii tranzacției.
investigație cu AWR
avertismentul din fișierul de alertă ne-a spus că rata de creștere intrinsecă SCN a fost în mod constant mai mare decât implicit sistem: 16384 pe secundă pentru ultimele 60 de minute. Dacă ne uităm la un interval de timp de o oră, un raport AWR ar putea fi un loc bun pentru a începe. Avem AWR configurat pentru a face instantanee la fiecare oră.
în raportul AWR, am observat că numărul de comiteri ale utilizatorilor a fost de 210 pe secundă. Da, sunt multe angajamente, dar nu este atât de diferit de încărcarea normală a acestei baze de date. Și dacă o comitere este legată de un SCN, este, de asemenea, mult mai mică decât 16384 pe secundă.
raportul AWR conținea, de asemenea, o constatare ADDM: Waits on event „Log file sync” în timp ce efectua operațiuni de comitere și ROLLBACK consumau un timp semnificativ al bazei de date. Investigați logica aplicației pentru o posibilă reducere a numărului de operațiuni de comitere prin creșterea dimensiunii tranzacțiilor.
această reducere a comiterilor în constatarea ADDM a fost sugerată și de Oracle Support. Din punctul meu de vedere, nu a fost chiar atât de mare.
interval de timp mai scurt
deoarece AWR nu mă ajuta să găsesc cauza, trebuia să investighez un interval de timp mai scurt. Am vrut să știu un interval de timp mai specific pentru a putea crea un raport ASH. Valoarea implicită pentru ASH este de 15 minute.
Deci, următoarea provocare a fost să găsim intervalul de timp de 15 minute în care rata de creștere a SCN a fost cea mai mare.
Doc ID 1388639.1 a sugerat interogarea v$archived_log. Această vizualizare conține informații despre toate comutatoarele de jurnal din Baza de date, inclusiv o marcă de timp și SCN. Deși ați putea mapa marcajele de timp la SCNs, nu este cu adevărat mai bun decât raportul AWR. Suntem încă blocați la marcajele de timp aleatorii; în acest caz, marca de timp a comutatorului de jurnal.
utilizarea funcției timestamp_to_scn
o modalitate mai bună este să utilizați funcția timestamp_to_scn. Această funcție returnează un SCN bazat pe o marcă de timp, cum ar fi marca de timp curentă:
SQL > selectați timestamp_to_scn (sysdate) din dual ; TIMESTAMP_TO_SCN(SYSDATE) ------------------------- 91903104563 SQL>
următorul pas a fost să faceți o listă a marcajelor de timp împreună cu limita superioară SCN potrivită și SCN potrivită, pe baza numărului de secunde din 1988 înmulțit cu 16.384.
aceasta arată marcajele de timp și SCN-urile pentru ultima zi:
selectați sysdate - (rownum/24) datetimestamp , timestamp_to_scn(sysdate - (rownum / 24)) SCN , ((data de sistem - (rownum / 24)) - la_data ('01-01-1988', 'ZZ-LL-AAAA' )) * 24 * 60 * 60 * 16384 upper_lmt de la dual conectează-te prin rownum <= 24 /
DATETIMESTAMP 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 rânduri selectate.
actualul SCN este de aproximativ 0,57% din limita superioară actuală.
găsirea ratei SCN de top
pe baza acestei idei am creat o interogare care îmi dă intervalul de timp de 15 minute cu cea mai mare creștere a SCNs în ultimele 3 zile.
în fiecare minut începe un nou interval de timp și, deoarece avem 1440 de minute într-o zi, avem 4320 de intervale de timp pentru a investiga. Pentru fiecare dintre ele trebuie să calculăm creșterea SCN în acel interval de timp de 15 minute.
vrem doar să afișăm rezultatele de top, în acest caz doar intervalele de timp cu o rată de peste 14000 pe secundă.
ALTER SESSION SET nls_date_format= 'LL/ZZ / AA HH24: MI' ; cu lista de date ca ( selectați sysdate- (rownum / 1440)- (15/1440) starttime -- interval de 15 minute , sysdate - (rownum / 1440) sfârșitul timpului de la dual conectează-te prin rownum <= (3*1440) -- 3 istoria zilelor ) Selectați Ora de începere , endtime , timestamp_to_scn (endtime) - timestamp_to_scn (starttime) scngrowth , round ((timestamp_to_scn (endtime) - timestamp_to_scn(starttime)) / (((24*60*60)*(endtime-starttime)))) scnrate din lista de date unde round ((timestamp_to_scn (endtime) - timestamp_to_scn(starttime)) / (((24*60*60)*(endtime-starttime )))) >= 14000 comandă de 4 DESC /
STARTTIME ENDTIME SCNGROWTH SCNRATE -------------- -------------- -------------------- -------------------- 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
Deci, acum am găsit (uneori suprapuse) intervalele de timp de 15 minute cu cea mai mare rată SCN (creștere SCN pe secundă) pentru ultimele 3 zile. Și chiar și în acele perioade de timp rata SCN este încă sub 16384. Nu există avertismente în fișierul de alertă în această săptămână….
rularea raportului ASH
formatul de dată pe care l-am folosit în interogarea de mai sus este același cu cel utilizat de raportul ASH, astfel încât să puteți copia/lipi ora de începere. Pentru durata introducem 15 minute.
SQL > @@ $ ORACLE_HOME / rdbms/admin / ashrpt.sql eșantioane de cenușă în această schemă de depozitare a volumului de lucru ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cea mai veche probă de cenușă disponibilă: 01-Jul-18 00:00:01 ultima probă de cenușă disponibilă: 09-Jul-18 14:18:58 specificați intervalul de timp pentru generarea raportului ASH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ introduceți ora de începere a raportului: -- formate de intrare valide: -- pentru a specifica ora de începere absolută: -- ] HH24: MI -- Exemple: 02/23/03 14:30:15 -- 02/23 14:30:15 -- 14:30:15 -- 14:30 -- pentru a specifica timpul de începere relativ: (începeți cu semnul' -') -- - MI -- Exemple: -1:15 (SYSDATE - 1 oră 15 minute) -- -25 (SYSDATE - 25 minute) implicit la -15 minute introduceți valoarea pentru begin_time: 07/06/18 18:09 raport începe timp specificat: 07/06/18 18:09 introduceți durata în minute începând de la ora de începere: implicit la SYSDATE-begin_time apăsați Enter pentru a analiza până la ora curentă introduceți valoarea pentru durată: 15 durata raportului specificată: 15 utilizarea 06-Jul-18 18: 09: 00 ca raport începe timp utilizarea 06-Jul-18 18: 24: 00 ca raport timp de încheiere specificați numele raportului ~~~~~~~~~~~~~~~~~~~~~~~ numele implicit al fișierului de raport este ashrpt_1_0706_1824.html. Pentru a utiliza acest nume, apăsați <return > pentru a continua, altfel introduceți o alternativă. introduceți valoarea pentru report_name: folosind numele raportului ashrpt_1_0706_1824.html rezumatul tuturor intrărilor utilizatorului ------------------------- Format: HTML ID DB : 2019395491 Inst num : 1 ora de începere: 06-iul-18 18:09:00 ora de încheiere: 06-iul-18 18:24:00 lățimea slotului: implicit obiectivele raportului : 0 numele raportului : ashrpt_1_0706_1824.html
găsirea SCN în AWR
raportul AWR nu ne-a arătat prea multe informații despre SCN actual, dar are câteva informații despre rata de creștere, dacă știți unde să o găsiți.
sub „statistici de activitate instanță” puteți găsi numărul de „apeluri către kcmga”. În documentația Oracle acest lucru este descris ca”numărul de apeluri către kcmga de rutină pentru a obține un nou SCN”.
valoarea acestor apeluri pe secundă în raportul AWR este foarte apropiată de rata SCN calculată cu funcția timestamp_to_scn.
v$SESSTAT view
Numărul de „apeluri către kcmga” utilizat pentru a crea un nou SCN poate fi găsit și în vizualizările V$SESSTAT și V$SYSSTAT.
putem folosi V$SESSTAT pentru a găsi sesiunile care provoacă o rată SCN ridicată. De asemenea, putem testa impactul asupra numărului SCN de acțiuni specifice.
de exemplu, când fac o selecție pe o masă mare care este folosită și de alte sesiuni, sesiunea mea va face încă 7 apeluri către kcmga. Deci, interogarea mea va provoca un SCN mai mare. Acest lucru este cauzat de consistența de citire a bazei de date, care utilizează, de asemenea, un SCN.
SQL > conectați< utilizator > / <trece >@< serviciu> conectat. SQL> selectați ses.valoare de la v$sesstat ses , v$statname stat unde stat.statistică#=ses.statistici# și ses.SID IN (Selectați sid din v$mystat) și stat.name = 'apeluri către kcmgas' / valoare -------------------- 2 SQL > selectați COUNT (*) din mybigtable ; conte(*) -------------------- 12198814 SQL> selectați ses.valoare de la v$sesstat ses , v$statname stat unde stat.statistică#=ses.statistici# și ses.SID IN (Selectați sid din v$mystat) și stat.name = 'apeluri către kcmgas' / valoare -------------------- 9 SQL>
comparând rata SCN și commit
cu V$SESSTAT putem interoga statisticile pentru toate sesiunile conectate în prezent la baza de date. În acest fel putem găsi sesiuni care sunt responsabile pentru o rată SCN ridicată. Putem compara acest lucru cu rata de comitere pentru acea sesiune.
rezultatele interogării de mai jos ne-au arătat că în Baza noastră de date rata ridicată a SCN a fost cauzată în principal de procesele de fundal. Pentru majoritatea sesiunilor de utilizator există o relație între o rată SCN ridicată și o rată ridicată de comitere, pentru sesiunile de fundal rata de comitere este întotdeauna goală.
selectați ses.sid , decodare(ses.username, null,'background',' user') session_type , (sysdate-logon_time) * 24 * 60 * 60 connect_seconds , sstat1.valoare SCN# , sstat2.valoare comite# , rotund (sstat1.valoare / ((sysdate-logon_time ) * 24 * 60 * 60),2) scn_rate , rotund (sstat2.valoare / ((sysdate-logon_time ) * 24 * 60 * 60),2) commit_rate de la v$sesstat sstat1 , v$sesstat sstat2 , v$statname sn1 , v$statname sn2 , v$sesiune ses în cazul în care sstat1.statistică # = sn1.statistici# și sstat2.statistică # = sn2.statistici# și sn1.name = 'apeluri către kcmgas' și sn2.name = 'utilizator se angajează' și ses.sid = sstat1.sid și ses.sid = sstat2.sid comandă de 6 DESC / SID SESSION_TY CONNECT_SECONDS SCN # COMMIT # SCN_RATE COMMIT_RATE ---------- ---------- --------------- ---------- ---------- ---------- ----------- 8478 context 459572 214506344 0 466.75 0 7551 context 452395 209729934 0 463.6 0 3776 context 290389 133863489 0 460.98 0 8496 context 121201 55685740 0 459.45 0 8729 context 286773 128180386 0 446.98 0 12009 context 290392 128867329 0 443.77 0 13173 context 196775 87268032 0 443.49 0 12004 context 103166 45681480 0 442.8 0 8735 context 275980 121563094 0 440.48 0 3096 context 430810 185436599 0 430.44 0 8027 context 95990 40912187 0 426.21 0 7529 context 193218 81367643 0 421.12 0 2370 context 527978 219521415 0 415.78 0 14604 context 283216 117052382 0 413.3 0 14132 context 113965 46586388 0 408.78 0 7552 context 294009 119775077 0 407.39 0 13172 context 182423 73865595 0 404.91 0 14592 context 74414 29767705 0 400.03 0 3802 context 268804 107486102 0 399.87 0 9910 context 117582 46596720 0 396.29 0 12021 context 49182 19321676 0 392.86 0 974 context 160816 59996495 0 373.08 0 12723 context 74450 25455559 0 341.91 0 3310 context 193215 65915175 0 341.15 0 12963 context 49179 15687084 0 318.98 0 6111 context 3584090 1031139557 0 287.7 0 6829 utilizator 303 1267 1123 4.18 3.71 9665 utilizator 904 1845 1691 2.04 1.87 8022 utilizator 898 1677 1520 1.87 1.69 3323 utilizator 898 1406 1260 1.57 1.4 2839 utilizator 7503 10822 9813 1.44 1.31 11060 utilizator 3892 5334 4781 1.37 1.23 13184 utilizator 1765 2359 2038 1.34 1.15 9199 utilizator 898 1135 935 1.26 1.04 2130 UTILIZATOR 8105 9548 8518 1.18 1.05 11525 UTILIZATOR 898 1054 944 1.17 1.05 6130 UTILIZATOR 3895 4453 4199 1.14 1.08 8012 UTILIZATOR 7503 8576 7774 1.14 1.04 4497 UTILIZATOR 898 962 882 1.07 .98 5201 utilizator 7220 7551 6226 1.05 .86 11317 utilizator 12906 13371 11997 1.04 .93 1979 rânduri selectate.
concluzie
fiți conștienți de faptul că există limite pentru SCN, deci atunci când găsiți avertismente în fișierul de alertă, trebuie să investigați problema. Dacă găsiți o problemă, ar trebui să lucrați cu Oracle Support. Prin încărcarea informațiilor pot verifica dacă există suficient spațiu între SCN curent și maxim.
problemele pot fi cauzate de un bug, cum ar fi 12371955: Hot Backup poate provoca creșterea ratei de creștere SCN care duce la erori ORA-600 (Doc ID 12371955.8).
dacă doriți să găsiți momentul exact există o creștere mare de SCNs aveți nevoie pentru a converti marcajele de timp pentru a SCNs. Obțineți cele mai bune rezultate folosind funcțiile SCN_TO_TIMESTAMP și TIMESTAMP_TO_SCN.
o rată ridicată de comitere este întotdeauna legată de procesele utilizatorului, dar SCN-urile sunt, de asemenea, legate de procesele de fundal. Chiar și sesiunile care nu se angajează pot avea un impact asupra SCN.
DBA cu peste 15 ani de experiență. Experiență în diverse ramuri, cu mai multe module. Inclusiv: Oracle database, Oracle RAC, Oracle EBS și PL/SQL.
mai multe postări de Bastiaan Bak