Redgate Hub

dla wielu osób pracujących z bazą danych Oracle SCN (System Change Number) jest tematem, który bardzo ich interesuje – ale mimo to jest to fascynujący temat, jest również mylący. W tym artykule dowiemy się, co to jest SCN, gdzie jest używany i jak działa.

warto wspomnieć, że nie jest to i nie może być pełne pokrycie każdego szczegółu o SCN. Zacznijmy od tego.

SCN-po co nam to?

Jesteś w grupie płac i, z odpowiednim autorytetem, wydałeś zapytanie, aby pobrać obecnie naliczanie wynagrodzeń wszystkich pracowników. Liczby płyną po ekranie, wszystko idzie świetnie.

Załóżmy, że podczas gdy patrzysz na wynik, kolega rozpoczyna nowy przebieg wypłaty, a to zadanie wsadowe usuwa bieżące podsumowanie obliczeń. Rzeczy z pewnością stałoby się mylące, gdyby twoje wyjście nagle pokazało ’ 0 ’ dla nowych wierszy wychodzących.

rzeczywiście, w tym scenariuszu prawdopodobnie spodziewałbyś się, że wynik będzie odzwierciedlał ” stan bazy danych – – zawartość każdego wiersza-sposób, w jaki istniał w momencie wysłania zapytania.

jedną z gwarancji bazy danych Oracle jest to, że”nie ma brudnych odczytów danych użytkownika”. Jeśli to konieczne, Oracle przebuduje każdy wiersz do stabilnego stanu w momencie wydania zapytania.

Oracle robi to ładnie i bardzo dokładnie poprzez własny „timer”, znany jako numer zmiany systemu, znany jako SCN.

omówimy te aspekty SCN:

  • sam numer
  • generator liczb
  • miejsca, w których numer jest zapisany

Zacznijmy więc!

elementy składowe do zrozumienia SCN

aby zbadać SCN, należy zrozumieć kilka terminów. Chociaż te definicje są dobrze udokumentowane, warto je powtórzyć tutaj:

transakcja

z Przewodnika po koncepcjach Oracle Online Documentation:

„transakcja jest logiczną, atomową jednostką pracy, która zawiera jedno lub więcej poleceń SQL. Transakcja grupuje instrukcje SQL tak, że są one albo wszystkie zatwierdzone, co oznacza, że są stosowane do bazy danych, albo wszystkie wycofane, co oznacza, że są cofane z bazy danych. Oracle Database przypisuje każdej transakcji unikalny identyfikator zwany ID transakcji”.

mówiąc prościej: kiedy rozpoczynamy transakcję, inicjujemy zestaw zmian. Muszą one być uzupełnione w całości lub w ogóle nie mogą być uzupełnione. Ponieważ transakcje występują w bazie danych, użytkownicy czytający dowolny obszar, który się zmienił, nie mogą mieć wpływu na żadne skutki uboczne, które mogą zmienić ich wyniki.

aby transakcje działały poprawnie w dowolnej bazie danych, baza danych musi przestrzegać czterech reguł ACID. Są to:

  • Atomiczność;
  • konsystencja;
  • Izolacja;
  • trwałość.

więc gdzie SCN pasuje do tego wszystkiego? Odpowiedź na to pytanie jest taka, że tylko przy użyciu SCN Oracle zachowuje spójność danych. Odbywa się to w celu zapewnienia, że w dowolnym momencie, nie ma rozbieżności w wynikach, które są wyświetlane innym, gdy jeden użytkownik zmienia coś i odwrotnie.

podsumowując, w Oracle zasada” czytelnicy nie czekają na pisarzy, a pisarze nie potrzebują czytelników ” jest całkowicie i prawdziwie przestrzegana. W tym celu niezwykle ważne jest, aby dane, które obecnie podlegają jakiejkolwiek zmianie, nie mogły być dostępne dla nikogo, z wyjątkiem osoby, która dokonuje tych zmian. W przypadku transakcji jest to wymagane do zachowania integralności danych. Mogą wystąpić trzy rzeczy, które mogą zakłócić tę integralność-brudny odczyt, rozmyty Odczyt i fantomowy odczyt. Aby upewnić się, że nie będzie żadnych problemów z integralnością w tych transakcjach, dostępne są różne poziomy izolacji. Są to:

  • Read Uncommitted
  • Read Committed
  • read Repeatable
  • Serializable

poziomy izolacji transakcji

z tych poziomów Oracle oferuje Read Committed jako domyślny poziom izolacji, upewniając się, że nie ma możliwości, aby użytkownik widział zmiany wprowadzone przez innego użytkownika, które nie zostały jeszcze zatwierdzone. Nie mogą być odczytywane te dane, które są oznaczone jako „brudne” i musi być wystarczająco silny mechanizm, aby to wszystko możliwe.

aby było to możliwe, SCN odgrywa istotną rolę.

SCN, wprowadzenie

Numer zatwierdzenia systemu może być rozumiany jako reprezentacja czasu przez Oracle. Oracle używa SCN do kontrolowania spójności, wykonywania odzyskiwania i porządkowania wektorów zmian w ponownym wykonaniu.

SCN znajduje się w wielu miejscach – zarówno w pamięci, jak i na dysku. Różne lokalizacje są używane, aby pomóc systemowi bazodanowemu zidentyfikować różne stany bazy danych. Na przykład w niektórych lokalizacjach jest on używany do oznaczania statusu zakończenia transakcji oraz tego, czy jest ona aktywna, czy zaangażowana.

wbrew powszechnemu przekonaniu, nie jest generowany tylko w momencie commit, chociaż sama nazwa sugeruje. SCN jest tam cały czas w bazie danych, reprezentując porcję czasu dla operacji, która dzieje się w tym momencie czasu. Nie jest całkowicie niedokładne stwierdzenie, że SCN nie jest generowany z commitem, ale nie jest to jedyny sposób generowania SCN.

SCN jest dwuczęściowym numerem, który jest generowany na żądanie, w odpowiedzi na zdarzenie. Jest nieco podobny do daty i czasu wywodzącego się z kombinacji kalendarza i zegara; zegar zmienia się szybko i tylko wtedy, gdy przeszedł kompletny cykl 24 – godzinny, zmienia się przepełnienie – kalendarz. Jednak zdarzenie, które zmienia zegar jest „wahadłem” i jest regularne, podczas gdy zdarzenie, które zmienia SCN jest wywołaniem jednej konkretnej funkcji wewnętrznej.

podobnie jak znacznik czasu kalendarza/zegara, wartość może być zapisywana w różnych miejscach, z których każde ma inne zastosowanie.

jednym z rzeczywistych przykładów podobnych do SCN jest zegar Lotniskowy. Dwie osoby wchodzą na lotnisko w tym samym czasie i mogą zanotować czas zegara. Ten moment daje nam „wpis SCN”, który tak się składa, że jest taki sam dla obu osób. Jedna osoba dostaje wózek na bagaż przed odprawą, podczas gdy druga przechodzi bezpośrednio do stanowiska odprawy. Kiedy miejsca są przydzielone, każda osoba może uzyskać inny „check-in SCN”, ponieważ czasy są nieco inne. „SCN wejścia na pokład” może być przypisany do wskazania, kiedy każdy z nich wszedł na pokład, ale oba otrzymują ten sam „SCN startu”.

podobnie jak połączenie kalendarza i zegara, SCN ma gwarancję wzrostu w normalnych warunkach pracy. Nie ma gwarancji, że liczba będzie Sekwencyjna (brakujące liczby).

więc gdzie ta informacja o SCN jest używana w bazie danych Oracle? Prawie wszędzie. Podobnie jak czas kojarzy nam się z każdą naszą aktywnością, SCN jest również powiązany z każdą częścią funkcjonalności bazy danych. Na przykład, gdy próbujesz wybrać dane z tabeli, SCN jest używany do potwierdzenia, czy dane są spójne, czy nie. SCN znajduje się również w nagłówkach transakcji bloku danych. Ten SCN będzie reprezentować czas, w którym transakcja rozpoczęła się i kiedy została popełniona. Podobnie, dla każdej wykonanej zmiany, utrzymywany jest wpis w dzienniku powtórzeń, a dla każdego z tych wpisów, SCN jest używany do reprezentowania czasu wystąpienia transakcji.

spójność odczytu używa SCN, aby zdecydować, jak długo ma zastosować Cofnij nad brudnym buforem, aby można było zakończyć odczytywanie spójnych danych dla sesji. I jak dobrze wiadomo, SCN jest zwiększany z każdą operacją commit.

Format i struktura SCN

SCN to ogromna liczba z dwoma komponentami: SCN Base & SCB Wrap.

SCN to 6-bajtowa (48-bitowa) liczba. Z tych 48 bitów, SCN_WRAP jest liczbą 16 bitów (2 bajty), a SCN_BASE jest liczbą 32 bitów (4 bajty). Obie bazy & są używane do kontrolowania przyrostu SCN i zapewnienia, że baza danych nie wyczerpie się. SCN_WRAP jest zwiększany o 1, gdy SCN_BASE osiągnie wartość 4 miliardów, a SCN_BASE stanie się 0.

w wersji Oracle 12c liczba SCN jest liczbą 8-bajtową.

więc jak widzimy bieżącą wartość SCN? Najprostszym sposobem jest zapytanie do view V$DATABASE. Zobacz też:

1
2
3
4
5

SQL> select current_scn from v$database;
CURRENT_SCN
———–
1123790

jak widzimy, że SCN jest wyświetlany jako liczba. Jest to dobre, ponieważ sprawia, że korzystanie z SCN jest łatwe dla nas w naszych wypowiedziach wykonujących odzyskiwanie, retrospekcję itp. Jeśli chcemy, możemy przekonwertować SCN na wartość szesnastkową:

1
2
3
4
5

SQL> select to_char(’1123790′,’xxxxxxxx’) scn_hex from dual;
SCN_HEX
———
1125ce

oto przykład wyjścia z tego samego widoku, do którego uzyskano dostęp kilka razy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

SQL> wybierz current_scn z V$database;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886

co ciekawe, ten wzrost wartości SCN pokazuje ważny aspekt SCN. Widzimy, że z każdym wykonaniem następuje wzrost liczby SCN. Odpytywając bazę danych view V$, faktycznie powodujemy skok w numerze SCN.

tabela SMON_SCN_TIME

najłatwiej zobaczyć obie te wartości z wewnętrznej tabeli należącej do użytkownika SYS – SMON_SCN_TIME. (11203) poniżej przedstawiono wyniki tego samego (11204)

1
2
3
4
5
6

SQL> select SCN_wrp, SCN_bas, SCN from smon_SCN_time where rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406

Ta tabela zawiera wpisy wygenerowanych SCN. Przechowuje dane w odstępach co około 5 minut i przechowuje dane przez 5 dni. Oznacza to, że tabela zawiera około 1440 rekordów. Dokładna liczba rekordów będzie się nieznacznie różnić, ponieważ przyrost pamięci nie jest dokładnie 5 minut.

1
2
3
4
5

SQL> select count ( * ) from SMON_SCN_TIME;
COUNT(*)
———-
1494

w wersjach Oracle przed 10g, mapowanie czasu SCN z czasem wynosiło + / – 5 minut, ale od 10g jest to zmieniane na + / – 3 sekundy. Ponieważ jest on przechowywany w wewnętrznej tabeli, Oracle nie zezwala na bezpośredni dostęp do informacji z tej tabeli. Aby uzyskać do niego dostęp, dostępne są interfejsy API. Jednym z takich API jest pakiet DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, który może być użyty do uzyskania dostępu do numeru sekwencji z tej tabeli. Przykład tego znajduje się poniżej (podziękowania dla Toma Kyte za zapytanie):

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

SQL> l
wybierz SCN_to_timestamp (SCN) ts, min(SCN), max (SCN)
z (
wybierz dbms_flashback.get_system_change_number () – level SCN
from dual
connect by level <= 100
)
group by SCN_to_timestamp(SCN)
* order by SCN_to_timestamp(SCN)
SQL> /
TS MIN (SCN) MAX (SCN)
————————————————————————— ———- ———-
06-Maj-16 05.22.04 000000000 1245323 1245323
06-Maj-16 05.22.07 000000000 1245324 1245324
06-Maj-16 05.22.10.000000000 1245325 1245325
06-MAJ-16 05.22.13 000000000 1245326 1245326
06-MAJ-16 05.22.16 000000000 1245327 1245327
06-MAJ-16 05.22.19. 000000000 1245328 1245328
06-MAJ-16 05.22.22 000000000 1245329 1245329
06-MAJ-16 05.22.25 000000000 1245330 1245330
06-MAJ-16 05.22.28 000000000 1245331 1245331
06-MAJ-16 05.22.31 000000000 1245332 1245332
06-MAJ-16 05.22.34 000000000 1245333 1245333
06-MAJ-16 05.22.37.000000000 1245334 1245334
06-Maj-16 05.22.40 000000000 1245335 1245335
06-Maj-16 05.22.43 000000000 1245336 1245336
06-Maj-16 05.22.46 000000000 1245337 1245337
06-Maj-16 05.22.49 000000000 1245338 1245338
06-Maj-16 05.22.52 000000000 1245339 1245339

jak możemy mapować SCN ze znacznikiem czasu w wersjach sprzed 10g?

ważne jest, aby pamiętać, że ta tabela nie pokazuje, dlaczego miałby nastąpić jakikolwiek wzrost tempa wzrostu liczby SCN. Przy odrobinie formatowania można mieć pojęcie o generowanych liczbach SCN, ale źródło ich wzrostu nie będzie widoczne z tej tabeli.

innym sposobem sprawdzenia tego jest widok V$LOG_HISTORY. Widok zawiera SCN w postaci kolumn FIRST_CHANGE# i NEXT_CHANGE # i możemy zobaczyć przez te dwie kolumny ilość SCN wygenerowanych w bazie danych w danym okresie czasu. „First_change# jest najniższym SCN, który pojawia się w zarchiwizowanym pliku dziennika pod danym numerem sekwencji tego wątku. „Next_change#” jest najniższym SCN, który pojawia się w następnym zarchiwizowanym pliku dziennika.

1
2
3
4
5
6
7
8
9
10
11
12

SQL> select thread#, first_change#, next_change# from V$log_history;
wątek # 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

podobnie jak w przypadku SMON_SCN_TABLE nie jest możliwe znalezienie źródła wzrostu generowania liczb SCN z tego widoku tabeli. Widok ten można jednak używać zarówno w pojedynczej instancji, jak i w środowisku RAC.

SCN zwiększa się za pomocą sekwencji?

teraz powinno być całkiem oczywiste, że SCN wydaje się być liczbą, która stale rośnie. Co ciekawe, mimo że jest to liczba, Oracle nie używa żadnej sekwencji, aby ją zwiększyć, ale zamiast tego używa funkcji wewnętrznych. Na przykład, aby zwiększyć SCN_BASE, funkcja używana wewnętrznie to KCMGAS (Get I Advance SCN). Funkcja ta jest wywoływana za każdym razem, gdy żądany jest nowy SCN i wywołanie tej funkcji jest zwiększane. Podobnie do tej funkcji, KCMGCS (Get Current SCN) jest używany do pobrania bieżącego SCN i wywołania dla niego użytego. Te wywołania funkcji można zobaczyć z widoku v$sysstat. Opis tych statystyk można znaleźć w Przewodniku 12.1.

zobaczmy, jak te połączenia łączą się z generacją SCN. Używamy tutaj dwóch sesji – jednej, aby zobaczyć wywołania w widoku V$sysstat, a drugiej sesji, aby wyciągnąć SCN.

1
2
3
4
5
6
7
8
9
10

sesja -1
SQL> l
1 * Wybierz current_SCN z V$database
SQL> /
CURRENT_SCN
———–
698815
SQL>

dla tego SCN były to wartości dla V$sysstat:

1
2
3
4
5
6
7
8
9
10
11
12
13

SQL> l
1 Wybierz nazwę, wartość z V$sysstat
2 * gdzie nazwa jak '% calls to% ’
SQL> /
nazwa wartość
—————————————————————- ———-
połączenia do kcmgcs 427
połączenia do kcmgrs 0
połączenia do kcmgcs 7272
połączenia w celu uzyskania migawki SCN: kcmgss 159790
SQL>

wystawmy zapytanie, aby zobaczyć bieżący SCN w sesji 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 oto wynik drugiej sesji 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

SQL> /
nazwa wartość
—————————————————————- ———-
połączenia do kcmgcs 427
połączenia do KCMGRS 0
połączenia do KCMGCS 7272
połączenia do SCN: kcmgss 159790
SQL> /
nazwa wartość
—————————————————————- ———-
połączenia do kcmgcs 427
połączenia do kcmgrs 0
połączenia do kcmgcs 7278
połączenia do SCN: KCMGSS 159905
SQL>

widzimy, że wywołania do KCMGAS wzrosły do 7278 z ostatniej wartości, 7272. Ponieważ Oracle nie używa sekwencji do zwiększenia liczby, nie ma gwarancji, że liczba SCN będzie zawsze zwiększana w tej samej kolejności.

wniosek

w tym artykule przyjrzeliśmy się, czym jest SCN, jak go wyświetlić i jakie są jego wymagania. W następnym artykule zobaczymy, jakie różne typy SCN są dostępne i jak są one używane w bazie danych. Zostańcie z nami!

Write a Comment

Twój adres e-mail nie zostanie opublikowany.