opublikowano: 10 lipca 2018 Autor: Bastiaan Bak Kategoria: rozwój i operacje IT
jakiś czas temu mieliśmy ostrzeżenie o wewnętrznym wzroście SCN (numer zmiany systemu) w naszym pliku Oracle 12.2 database alert file. Sytuacja ta miała miejsce kilka razy w ciągu kilku tygodni.
„Uwaga: tempo wzrostu SCN jest konsekwentnie
wyższe niż domyślne 16384 na SEK. przez ostatnie 60 minut.
obecne tempo wzrostu SCN wynosi 25867 na SEK., zas 200fffff!
aktualna wartość SCN to 46747726691, wartość SCN Compat to 1″
Moja początkowa reakcja polegała na tym, że SCN są powiązane z commitami, więc albo obciążenie bazy danych było bardzo wysokie, albo logika aplikacji powinna zostać zmieniona. Inną możliwością było to, że commit był wykonywany po każdej aktualizacji, zamiast używać commitów wsadowych.
okazało się to nieco bardziej skomplikowane niż się spodziewałem. Gdzie szukać relacji między SCN a commitami? Jak poważne jest to Ostrzeżenie? Ten blog będzie o różnych sposobach, w jakie badałem ten problem i zidentyfikowałem potencjalny wpływ.
uwagi pomocy technicznej Oracle
pierwsze miejsce do wyszukiwania informacji o ostrzeżeniach w pliku alertów to Witryna pomocy technicznej Oracle. Znalazłem kilka powiązanych notatek:
- ORA-19706 i powiązane komunikaty dziennika alarmów (Doc ID 1393360.1)
ta notatka sugeruje, że rzeczywisty komunikat jest specyficzny dla wersji bazy danych 12.2, ale w starszych wersjach możemy mieć podobne ostrzeżenia, takie jak ” Warning: The SCN headroom for this database is only NN days!”
Jeśli pojawi się komunikat dziennika alertów, taki jak którykolwiek z tych wpisów, zaleca się postępować zgodnie z instrukcjami podanymi w ID 1388639.1 i zarejestrować zgłoszenie serwisowe z Pomocą techniczną Oracle.
dowody do zebrania podczas zgłaszania problemów z wysokim współczynnikiem SCN do pomocy technicznej Oracle (Doc ID 1388639.1) - ta notatka zawiera informacje o tym, jakie informacje należy dostarczyć podczas rejestrowania zgłoszenia serwisowego.
- System Change Number (SCN), Headroom, Security and Patch Information (Doc ID 1376995.1)
ta notatka zawiera więcej informacji na temat użycia SCN. System change number (SCN) jest logicznym, wewnętrznym znacznikiem czasu używanym przez bazę danych Oracle. SCN porządkuje zdarzenia występujące w bazie danych. Baza danych używa SCN do odpytywania i śledzenia zmian. Gdy transakcja commita, baza danych rejestruje SCN dla tego commita.
istnieje górny limit liczby SCN, z których może korzystać baza danych Oracle. Limit wynosi obecnie 281 bilionów (2^48) wartości SCN.
biorąc pod uwagę, że istnieje górny limit, ważne jest, aby w danej bazie danych Oracle nie zabrakło dostępnych SCN.
notka wyjaśnia również, kiedy ostrzeżenie jest podniesione. Baza danych Oracle oblicza limit” nie przekraczać ” liczby SCN, z których baza danych może obecnie korzystać, na podstawie liczby sekund od 1988 r. pomnożonej przez 16384. Dzięki temu bazy danych Oracle będą z czasem przetwarzać SCN.
jak poważne jest to Ostrzeżenie?
ostrzeżenie jest podnoszone z szybkością 2^14 = 16384 SCNs na sekundę przez ostatnie 60 minut.
maksymalny SCN wynosi 2^48 = 281.474.976.710.656.
przy tempie 16348 SCNs na sekundę będziemy mieli 2^(48-14) sekund, czyli 544 lata, aby osiągnąć to maksimum. To powinno wystarczyć w normalnej sytuacji, ale górna granica 2^48 to tylko maksymalna wartość bezwzględna, którą baza danych może przechowywać.
limit jest również związany z liczbą sekund od 1988 roku. Limit 2^48 to maksimum w roku 2532 (1988+544). Ale w 2018 roku maksimum wynosi (2018-1988)*365*24*60*60*2^14 = 1.550.057.472.000.
ostrzeżenie nie powinno być ignorowane. Po osiągnięciu limitu pojawią się błędy ora-600, ale po osiągnięciu bezwzględnego górnego limitu SCN baza danych po prostu przestanie działać.
dobra wiadomość jest taka, że w naszej sytuacji Ostrzeżenie mówi, że tempo wzrostu SCN wynosi 25867 na sekundę w tej konkretnej godzinie, więc w tej godzinie zbliżyliśmy się nieco (25867-16384=9483) do granicy. Nie zbliżamy się do granicy co godzinę; normalna stopa wzrostu jest niższa niż 16384.
Oracle Support
zadzwoniliśmy do Oracle Support i powiedziano nam, że Oracle Development pracuje obecnie nad tym problemem.
wsparcie Oracle potwierdziło, że głowica SCN wygląda dobrze. Opierając się na raporcie AWR, Oracle Support zauważyło dużą liczbę zatwierdzeń i zasugerowało, aby skonsultować się z zespołem aplikacji w celu zatwierdzenia, zwiększając rozmiar transakcji.
dochodzenie z AWR
ostrzeżenie w pliku alertu mówi nam, że szybkość wzrostu SCN jest konsekwentnie wyższa niż domyślna wartość systemu: 16384 na sekundę przez ostatnie 60 minut. Jeśli patrzymy na ramy czasowe godziny, raport AWR może być dobrym miejscem na początek. Mamy AWR skonfigurowany do robienia migawek co godzinę.
w raporcie AWR zauważyłem, że liczba commitów użytkownika wynosiła 210 na sekundę. Tak, to dużo commitów, ale nie różni się to tak bardzo od normalnego obciążenia tej bazy danych. A jeśli commit jest powiązany z SCN, jest również znacznie niższy niż 16384 na sekundę.
raport AWR zawierał również informację ADDM: oczekiwanie na zdarzenie „log file sync” podczas wykonywania operacji COMMIT i ROLLBACK pochłaniało znaczny czas bazy danych. Zbadaj logikę aplikacji pod kątem możliwego zmniejszenia liczby operacji zatwierdzania przez zwiększenie rozmiaru Transakcji.
ta redukcja zmian w znalezisku ADDM została również zasugerowana przez Oracle Support. Z mojego punktu widzenia, nie było tak wysoko.
krótszy czas
ponieważ AWR nie pomagał mi znaleźć przyczyny, musiałem zbadać krótszy czas. Chciałem poznać bardziej konkretne ramy czasowe, żebym mógł stworzyć raport ASH. Wartość domyślna dla ASH wynosi 15 minut.
więc kolejnym wyzwaniem było znalezienie 15-minutowego przedziału czasowego, w którym tempo wzrostu SCN było najwyższe.
Doc ID 1388639.1 suggested to query v$archived_log. Ten widok zawiera informacje o wszystkich przełącznikach dziennika w bazie danych, w tym o znaczniku czasu i SCN. Chociaż można mapować znaczniki czasu do SCN, nie jest to tak naprawdę lepsze niż raport AWR. Nadal tkwimy w losowych znacznikach czasu; w tym przypadku znacznik czasu logswitch.
Korzystanie z funkcji timestamp_to_scn
lepszym sposobem jest użycie funkcji timestamp_to_scn. Ta funkcja zwraca SCN oparty na znaczniku czasu, takim jak bieżący znacznik czasu:
SQL> SELECT timestamp_to_scn (sysdate) FROM dual ; TIMESTAMP_TO_SCN(SYSDATE) ------------------------- 91903104563 SQL>
następnym krokiem było stworzenie listy znaczników czasu wraz z pasującym SCN i pasującym górnym limitem SCN, na podstawie liczby sekund od 1988 pomnożonej przez 16,384.
to pokazuje znaczniki czasu i SCN dla ostatniego dnia:
wybierz sysdate - (rownum/24) datetimestamp , timestamp_to_scn (sysdate - (rownum/24)) SCN , ((sysdate - (rownum/24)) - to_date ('01-01-1988', 'DD-MM-YYYY' )) * 24 * 60 * 60 * 16384 upper_lmt od dual CONNECT by 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 zaznaczone wiersze.
obecny SCN wynosi około 0,57% aktualnej górnej granicy.
znalezienie najwyższego wskaźnika SCN
na podstawie tego pomysłu stworzyłem zapytanie, które daje mi 15 minutowy przedział czasowy z najwyższym wzrostem SCN w ciągu ostatnich 3 dni.
co minutę rozpoczyna się nowy przedział czasowy, a ponieważ mamy 1440 minut w ciągu dnia, mamy 4320 przedziałów czasowych do zbadania. Dla każdego z nich musimy obliczyć wzrost SCN w tym 15-minutowym przedziale czasowym.
chcemy pokazać tylko najlepsze wyniki, w tym przypadku tylko ramy czasowe z szybkością ponad 14000 na sekundę.
ALTER SESSION SET nls_date_format= 'MM / DD / YY HH24: MI' ; z datelist jako ( wybierz sysdate - (rownum/1440) - (15/1440) starttime -- 15 minut interval , sysdate - (rownum/1440) od dual CONNECT by rownum <= (3*1440) -- 3 Historia dni ) wybierz starttime , endtime , timestamp_to_scn(endtime) - timestamp_to_scn (starttime) , round ((timestamp_to_scn (endtime)) - timestamp_to_scn (starttime)) / (((24*60*60)*(endtime-starttime))) scnrate z datelist WHERE round ((timestamp_to_scn (endtime) - timestamp_to_scn (starttime)) / (((24*60*60)*(endtime-starttime )))) >= 14000 Zamów przez 4 DESC /
STARTTIME ENDTIME SCNGROZWÓJ 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
tak więc, teraz znaleźliśmy (czasami nakładające się) 15 minutowe ramy czasowe z najwyższą szybkością SCN (wzrost SCN na sekundę) w ciągu ostatnich 3 dni. I nawet w tych ramach czasowych wskaźnik SCN jest nadal poniżej 16384. Brak ostrzeżeń w pliku alarmowym w tym tygodniu….
Uruchamianie raportu ASH
format daty, którego użyłem w powyższym zapytaniu, jest taki sam, jak używany przez raport ASH, więc możesz po prostu skopiować/wkleić czas rozpoczęcia. Na czas trwania wchodzimy 15 minut.
SQL> @ @ $ORACLE_HOME / RDBMS / admin / ashrpt.sql próbki popiołu w tym schemacie repozytorium obciążeń ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ najstarsza dostępna próbka popiołu: 01-lipiec-18 00:00:01 najnowsza dostępna próbka popiołu: 09-lipiec-18 14:18:58 Określ ramy czasowe generowania raportu ASH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ podaj czas rozpoczęcia raportu: -- prawidłowe formaty wejściowe: -- aby określić bezwzględny czas rozpoczęcia: -- ] HH24: MI -- przykłady: 02/23/03 14:30:15 -- 02/23 14:30:15 -- 14:30:15 -- 14:30 -- aby określić względny czas rozpoczęcia: (zacznij od znaku' -') -- - MI -- przykłady: -1:15 (SYSDATE-1 godz. 15 min.) -- -25 ( SYSDATE - 25 min) domyślnie -15 min Wprowadź wartość dla begin_time: 07/06/18 18:09 podany czas rozpoczęcia raportu: 07/06/18 18:09 wprowadź Czas trwania w minutach począwszy od czasu rozpoczęcia: domyślnie SYSDATE-begin_time naciśnij Enter, aby analizować do bieżącego czasu Wprowadź wartość dla czasu trwania: 15 określony czas trwania raportu: 15 używanie 06-Jul-18 18:09:00 jako czasu rozpoczęcia raportu używanie 06-Jul-18 18:24:00 jako czasu zakończenia raportu podaj nazwę raportu ~~~~~~~~~~~~~~~~~~~~~~~ domyślna nazwa pliku raportu to ashrpt_1_0706_1824.html. Aby użyć tej nazwy, naciśnij < return>, aby kontynuować, w przeciwnym razie wprowadź alternatywę. Wprowadź wartość dla nazwa_ raportu: używając nazwy raportu ashrpt_1_0706_1824.html podsumowanie wszystkich wpisów użytkownika ------------------------- Format: HTML DB Id : 2019395491 Inst num : 1 czas rozpoczęcia: 06-lipiec-18 18:09:00 koniec: 06-lipiec-18 18:24:00 Szerokość szczeliny: domyślnie zgłoś cele : 0 Nazwa raportu : ashrpt_1_0706_1824html
znalezienie SCN w AWR
raport AWR nie pokazał nam zbyt wielu informacji na temat obecnego SCN, ale ma pewne informacje na temat tempa wzrostu, jeśli wiesz, gdzie go znaleźć.
w sekcji „Statystyki aktywności instancji” możesz znaleźć liczbę „wywołań do kcmgas”. W dokumentacji Oracle jest to opisane jako”liczba wywołań rutynowych kcmgas, aby uzyskać nowy SCN”.
wartość tych wywołań na sekundę w raporcie AWR jest bardzo zbliżona do szybkości SCN obliczonej za pomocą funkcji timestamp_to_scn.
V$SESSTAT view
liczba „wywołań do kcmgas” użytych do utworzenia nowego SCN można również znaleźć w widokach V$SESSTAT i V$SYSSTAT.
możemy użyć V$SESSTAT, aby znaleźć sesje, które powodują wysoki współczynnik SCN. Możemy również przetestować wpływ na liczbę SCN konkretnych działań.
na przykład, gdy wykonam select na dużym stole, który jest również używany przez inne sesje, moja sesja wykona kolejne 7 wywołań do kcmgas. Tak więc moje zapytanie spowoduje wyższy SCN. Jest to spowodowane spójnością odczytu bazy danych, która również używa SCN.
SQL> CONNECT < user> / <pass>@<service> połączone. SQL> wybierz ses.wartość od v$sesstat ses , v$statname stat gdzie?statystyka#=ses.statystyka# i ses.Sid IN (SELECT Sid FROM v$mystat) i natychmiast.name = "wywołania do kcmgas' / wartość -------------------- 2 SQL> SELECT COUNT ( * ) FROM mybigtable ; liczyć(*) -------------------- 12198814 SQL> wybierz ses.wartość od v$sesstat ses , v$statname stat gdzie?statystyka#=ses.statystyka# i ses.Sid IN (SELECT Sid FROM v$mystat) i natychmiast.name = "wywołania do kcmgas' / wartość -------------------- 9 SQL>
porównując SCN i commit rate
z V$SESSTAT możemy odpytywać statystyki dla wszystkich sesji aktualnie podłączonych do bazy danych. W ten sposób możemy znaleźć sesje, które są odpowiedzialne za wysoki wskaźnik SCN. Możemy to porównać ze współczynnikiem commit dla danej sesji.
wyniki poniższego zapytania pokazały nam, że w naszej bazie danych wysoki wskaźnik SCN był spowodowany głównie procesami w tle. Dla większości sesji użytkownika istnieje zależność pomiędzy wysokim współczynnikiem SCN A wysokim współczynnikiem commit, dla sesji w tle współczynnik commit jest zawsze pusty.
wybierz ses.sid , decode(ses.username, NULL, 'background', 'user') session_type , (sysdate-logon_time) * 24 * 60 * 60 connect_seconds , sstat1wartość SCN# , sstat2.value COMMIT# , runda (sstat1.value / ((sysdate-logon_time ) * 24 * 60 * 60),2) scn_rate , runda (sstat2.value / ((sysdate-logon_time ) * 24 * 60 * 60),2) commit_rate FROM v$sesstat sstat1 , v$sesstat sstat2 , v$statname sn1 , v$statname sn2 , v$session ses gdzie sstat1.statystyka# = sn1.statystyka# i sstat2.statystyka# = sn2.statystyka# i sn1.name = "wywołania do kcmgas' oraz sn2.name = 'user commits' i ses.sid = sstat1.sid i ses.sid = sstat2.sid Zamów przez 6 DESC / SID SESSION_TY CONNECT_SECONDS SCN# COMMIT # SCN_RATE COMMIT_RATE ---------- ---------- --------------- ---------- ---------- ---------- ----------- 8478 459572 214506344 0 466.75 0 7551 Informacje ogólne 452395 209729934 0 463.6 0 3776 Informacje ogólne 290389 133863489 0 460.98 0 8496 Informacje ogólne 121201 55685740 0 459.45 0 8729 Informacje ogólne 286773 128180386 0 446.98 0 12009 Informacje ogólne 290392 128867329 0 443.77 0 13173 Informacje ogólne 196775 87268032 0 443.49 0 12004 Informacje ogólne 103166 45681480 0 442.8 0 8735 275980 121563094 0 440.48 0 3096 Informacje ogólne 430810 185436599 0 430.44 0 8027 Informacje ogólne 95990 40912187 0 426.21 0 7529 Informacje ogólne 193218 81367643 0 421.12 0 2370 Informacje ogólne 527978 219521415 0 415.78 0 14604 Informacje ogólne 283216 117052382 0 413.3 0 14132 Informacje ogólne 113965 46586388 0 408.78 0 7552 Informacje ogólne 294009 119775077 0 407.39 0 13172 182423 73865595 0 404.91 0 14592 Informacje ogólne 74414 29767705 0 400.03 0 3802 Informacje ogólne 268804 107486102 0 399.87 0 9910 Informacje ogólne 117582 46596720 0 396.29 0 12021 Informacje ogólne 49182 19321676 0 392.86 0 974 Informacje ogólne 160816 59996495 0 373.08 0 12723 Informacje ogólne 74450 25455559 0 341.91 0 3310 Informacje ogólne 193215 65915175 0 341.15 0 12963 / background 49179 / / 15687084 / / 0 / / 31898 0 6111 Informacje ogólne 3584090 1031139557 0 287.7 0 6829 użytkownik 303 1267 1123 4.18 3.71 9665 użytkownik 904 1845 1691 2.04 1.87 8022 użytkownik 898 1677 1520 1.87 1.69 3323 użytkownik 898 1406 1260 1.57 1.4 2839 użytkownik 7503 10822 9813 1.44 1.31 11060 użytkownik 3892 5334 4781 1.37 1.23 13184 użytkownik 1765 2359 2038 1.34 1.15 9199 użytkownik 898 1135 935 1.26 1.04 2130 UŻYTKOWNIK 8105 9548 8518 1.18 1.05 11525 UŻYTKOWNIK 898 1054 944 1.17 1.05 6130 UŻYTKOWNIK 3895 4453 4199 1.14 1.08 8012 UŻYTKOWNIK 7503 8576 7774 1.14 1.04 4497 UŻYTKOWNIK 898 962 882 1.07 .98 5201 użytkownik 7220 7551 6226 1.05 .86 11317 użytkownik 12906 13371 11997 1.04 .93 1979 zaznaczone wiersze.
wniosek
pamiętaj, że istnieją ograniczenia dla SCN, więc kiedy znajdziesz ostrzeżenia w pliku alertów, musisz zbadać problem. Jeśli znajdziesz problem, powinieneś współpracować z Oracle Support. Przesyłając informacje, mogą sprawdzić, czy jest wystarczająco dużo miejsca między aktualnym a maksymalnym SCN.
problemy mogą być spowodowane przez błąd, taki jak 12371955: Gorąca Kopia zapasowa może powodować zwiększone tempo wzrostu SCN, co prowadzi do błędów ORA-600 (Doc ID 12371955.8).
jeśli chcesz znaleźć dokładny moment, w którym występuje wysoki wzrost SCN, musisz przekonwertować znaczniki czasu na SCN. Najlepsze wyniki uzyskujesz korzystając z funkcji SCN_TO_TIMESTAMP i TIMESTAMP_TO_SCN.
wysoki współczynnik commitów jest zawsze związany z procesami użytkownika, ale SCN są również związane z procesami w tle. Nawet sesje, które nie zatwierdzają, mogą mieć wpływ na SCN.
dba z ponad 15-letnim doświadczeniem. Doświadczenie w różnych branżach, z kilkoma modułami. W tym: Oracle database, Oracle RAC, Oracle EBS i PL/SQL.
więcej postów napisanych przez Bastiaan Bak