monille Oraclen tietokannan parissa työskenteleville SCN (System Change Number) on aihe, joka kiinnostaa heitä suuresti – mutta siitä huolimatta se on kiehtova aihe, se on myös hämmentävä. Tässä artikkelissa opimme SCN: n pikkuseikat: mitä se on, missä sitä käytetään ja miten se toimii.
on syytä mainita, että tämä ei ole eikä voi olla täydellinen selostus SCN: n jokaisesta yksityiskohdasta. Aloitetaan.
SCN-miksi sitä tarvitaan?
Oletetaan, että on kuun loppu ja sen palkkapäivä. Kuulut Palkanlaskentaryhmään ja olet asianmukaisin valtuuksin tehnyt kyselyn kaikkien työntekijöiden tämänhetkisen palkkalaskelman vetämiseksi. Numerot virtaavat ruudun poikki, kaikki sujuu hienosti.
Oletetaan, että työtoveri aloittaa ulostuloa katsellessa uuden palkkajuoksun ja tuo erätyö tyhjentää nykyisen laskelman yhteenvedon. Asiat varmasti tulee sekava, jos tuotos yhtäkkiä näytti ’ 0 ’ uusia rivejä tulossa ulos.
tässä skenaariossa todennäköisesti odottaisit tulosteen kuvastavan ”tietokannan tilaa” – kunkin rivin sisältöä – sellaisena kuin se oli silloin, kun julkaisit kyselysi.
yksi Oraclen tietokannan takeista on, että”käyttäjätietojen likaisia lukemia ei ole”. Tarvittaessa Oracle rakentaa jokaisen rivin uudelleen vakaaseen tilaan välittömästi, kun kysely annettiin.
Oracle tekee sen hienosti ja erittäin tarkasti oman ”ajastimensa” kautta, joka tunnetaan Järjestelmänvaihtolukuna eli SCN: nä.
keskustelemme näistä SCN: n näkökohdista:
- itse luku
- lukugeneraattori
- paikat, joissa Numero on tallennettu
joten aloitetaan!
SCN
SCN: n tutkimiseksi on ymmärrettävä useita termejä. Vaikka nämä määritelmät ovat hyvin dokumentoituja, ne kannattaa toistaa tässä:
Transaction
From the Concepts guide of Oracle online Documentation:
”transaktio on looginen, atominen työn yksikkö, joka sisältää yhden tai useamman SQL-lausekkeen. Transaktio ryhmittelee SQL-lausumat niin, että ne ovat joko kaikki sitoutuneet, mikä tarkoittaa, että niitä sovelletaan tietokantaan, tai kaikki rullataan takaisin, mikä tarkoittaa, että ne poistetaan tietokannasta. Oraclen tietokanta antaa jokaiselle tapahtumalle yksilöllisen tunnisteen, jota kutsutaan tapahtumatunnukseksi”.
yksinkertaisemmin: kun käynnistämme transaktion, käynnistämme joukon muutoksia. Ne on joko täydennettävä kokonaisuudessaan tai niitä ei saa täydentää lainkaan. Koska tapahtumat tapahtuvat tietokannassa, käyttäjät, jotka lukevat mitä tahansa aluetta, joka on muuttunut, eivät saa vaikuttaa sivuvaikutuksiin, jotka voivat muuttaa niiden tuloksia.
jotta tapahtumat toimisivat oikein missä tahansa tietokannassa, tietokannan on noudatettava neljää ACID-sääntöä. Nämä ovat:
- Atomicity;
- Consistency;
- Isolation;
- consistency.
joten mihin SCN sopii tässä kaikessa? Ja vastaus tähän kysymykseen on, että käyttämällä SCN vain Oracle ylläpitää tietojen johdonmukaisuutta. Tämä tehdään sen varmistamiseksi, että missään vaiheessa, ei ole ristiriitaa tuloksia, jotka näytetään muille, kun yksi käyttäjä muuttaa jotain, ja päinvastoin.
tiivistetysti Oraclessa noudatetaan täysin ja aidosti periaatetta ”lukijat eivät odota kirjailijoita eivätkä kirjailijat tarvitse lukijoita”. Tätä varten on äärimmäisen tärkeää, että tiedot, joita parhaillaan muutetaan, eivät saa olla kenenkään muun kuin muutosten tekijän saatavilla. Transaktioiden osalta tämä on tarpeen tietojen eheyden säilyttämiseksi. Kolme asiaa voi tapahtua, jotka voivat häiritä tätä eheyttä-Likainen lukea, sumea lukea ja Phantom lukea. Jotta näissä tapahtumissa ei olisi minkäänlaisia eheysongelmia, käytettävissä on eritasoisia eristyksiä. Nämä ovat:
- Lue Toimittamaton
- Read Committed
- toistettavissa oleva luku
- Sarjoitettavissa
Transaktioerotustasot
näistä Oracle tarjoaa Read Committed-toiminnon oletuserotustasoksi varmistaen, ettei käyttäjä näe toisen käyttäjän tekemiä muutoksia, joita ei ole vielä sidottu. Tietoja, jotka on merkitty ”likaisiksi”, ei saa lukea lainkaan, ja on oltava riittävän vahva mekanismi, jotta kaikki tämä on mahdollista.
tämän mahdollistamiseksi SCN: llä on tärkeä rooli.
SCN, Johdatus
järjestelmän Toimitusluku voidaan ymmärtää Oraclen ajan kuvaukseksi. Oracle käyttää SCN: ää johdonmukaisuuden säätelyyn, palautuksen suorittamiseen ja muutosvektorien järjestämiseen uudelleen.
SCN löytyy monista paikoista-sekä muistista että levykkeeltä. Tietokantajärjestelmää käytetään eri sijaintien avulla tunnistamaan tietokannan eri tiloja. Joissakin paikoissa sitä käytetään esimerkiksi ilmaisemaan transaktion toteutumistilaa ja sitä, onko se aktiivinen vai sitoutunut.
vastoin yleistä luuloa, se ei synny vasta commit-julkaisun yhteydessä, vaikka niin nimikin antaa ymmärtää. SCN on koko ajan tietokannassa, joka edustaa aikaosuutta kyseisellä hetkellä tapahtuvalle toiminnalle. Ei ole täysin epätarkkaa sanoa, että SCN ei synny toimituksella, vaan se syntyy – mutta se ei ole ainoa tapa, jolla SCN syntyy.
SCN on kaksiosainen numero, joka syntyy pyynnöstä, vastauksena johonkin tapahtumaan. Se muistuttaa jonkin verran kalenterin ja kellon yhdistelmästä johdettua päivämäärää ja aikaa; kello vaihtuu nopeasti ja vasta sitten, kun se on käynyt läpi koko 24 tunnin jakson, ylivuoto – kalenteri – muuttuu. Kelloa muuttava tapahtuma on kuitenkin ”heiluri” ja säännöllinen, kun taas SCN: ää muuttava tapahtuma on kutsu yhteen tiettyyn sisäiseen funktioon.
kalenterin/kellon aikaleiman tapaan arvo voidaan tallentaa useassa eri paikassa, kukin eri käyttötarkoitukseen.
yksi SCN: ää muistuttava reaalimaailman esimerkki on lentokenttäkello. Kaksi ihmistä astuu lentokentälle yhtä aikaa ja saattaa huomata kellonajan. Tuo hetki antaa meille ”merkinnän SCN”, joka sattuu olemaan sama molemmille ihmisille. Yksi henkilö saa matkatavaravaunun ennen lähtöselvitystä, kun taas toinen etenee suoraan lähtöselvitystiskille. Kun paikat on jaettu, jokainen voi saada erilaisen LÄHTÖSELVITYSNUMERON, koska ajat ovat hieman erilaiset. Alukselle nousemiseen tarkoitettu SCN-laite voidaan määrätä ilmoittamaan, milloin kumpikin on noussut alukseen, mutta molemmat saavat saman lentoonlähtöön tarkoitetun SCN-merkinnän.
kalenterin ja kellon yhdistelmän tavoin SCN kasvaa taatusti normaalissa käytössä. Ei ole mitään takeita siitä, että Numero on peräkkäinen (puuttuvat numerot).
joten missä tätä tietoa SCN: stä käytetään Oraclen tietokannassa? Melkein kaikkialla. Aivan kuten yhdistämme ajan jokaiseen toimintaamme, SCN liittyy myös jokaiseen osaan tietokannan toiminnallisuutta. Esimerkiksi, kun yrität valita tietoja taulukosta, SCN: ää käytetään vahvistamaan, että ovatko tiedot yhdenmukaisia vai eivät. SCN löytyy myös datalohkon Tapahtumaotsikoista. Tämä SCN edustaisi ajankohtaa, jolloin kauppa alkoi ja milloin se tehtiin. Vastaavasti jokaisesta tehdystä muutoksesta pidetään kirjaa uudelleenjärjestelyn lokiin, ja kunkin merkinnän kohdalla käytetään SCN: ää kuvaamaan tapahtuman toteutumisajankohtaa.
read consistency käyttää SCN: ää päättääkseen, kuinka kauan sen on sovellettava Kumoa likaisen puskurin päällä, jotta istunnon luettu Yhdenmukainen tietopyyntö voidaan täyttää. Ja kuten hyvin tiedetään, SCN kasvaa jokaisella commit-operaatiolla.
SCN muoto ja rakenne
SCN on valtava numero, jossa on kaksi komponenttia: SCN Base & SCB Wrap.
SCN on 6-tavuinen (48 bittiä) luku. Näistä 48 bitistä SCN_WRAP on 16-bittinen (2 tavua) numero ja SCN_BASE on 32-bittinen (4 tavua) numero. Molemmat pohja & WRAP käytetään ohjaamaan SCN: n kasvua ja varmistamaan, että tietokanta ei lopu siitä. SCN_WRAP kasvaa 1: llä, kun SCN_BASE saavuttaa 4 miljardin arvon ja SCN_BASE muuttuu 0: ksi.
Oraclen versiosta 12c SCN-Numero on 8-tavuinen numero.
Joten miten näemme nykyisen SCN-arvon? Helpoin tapa on kysellä view V$ – tietokannasta. Katso.:
1
2
3
4
5
|
SQL> valitse current_scn v$ – tietokannasta;
CURRENT_SCN
———–
1123790
|
kuten voimme nähdä, että SCN näkyy numero. Tämä on hyvä, koska se tekee SCN: n käytöstä helppoa meille lausunnoissamme, jotka suorittavat elpymistä, takaumaa jne. Jos haluamme, voimme muuntaa SCN on heksadesimaaliarvo samoin:
1
2
3
4
5
|
SQL> valitse to_char (”1123790”, ”xxxxxxxx”) scn_hex duaalista;
SCN_HEX
———
1125ce
|
tässä on esimerkki tulosteesta samasta näkymästä, jota käytetään pari kertaa:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL> valitse current_scn v$ – tietokannasta;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886
|
on mielenkiintoista, että tämä SCN-arvon nousu osoittaa SCN: n tärkeän piirteen. Voimme nähdä, että jokaisen teloituksen myötä SCN: n määrä kasvaa. Kyselemällä view V$tietokanta, olemme todella aiheuttaa hypätä SCN numero.
SMON_SCN_TIME Table
helpoin tapa nähdä molemmat arvot on SYS user – SMON_SCN_TIME-yrityksen sisäisestä taulukosta. Seuraavassa on tuotos samasta (11204).
1
2
3
4
5
6
|
SQL> valitse SCN_wrp, SCN_bas, SCN from smon_SCN_time, jossa rivi < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406
|
tämä taulukko sisältää tuotetut SCN-tiedot. Se tallentaa tiedot noin 5 minuutin välein ja säilyttää 5 päivän arvosta tietoja. Tämä tarkoittaa, että taulukossa on noin 1440 tietuetta. Tietueiden tarkka määrä vaihtelee hieman, sillä tallennusajan lisäys ei ole täsmälleen 5 minuuttia.
1
2
3
4
5
|
SQL> select count (*) from SMON_SCN_TIME;
COUNT(*)
———-
1494
|
Oraclen 10g: tä edeltäneissä versioissa SCN: n aikakartoitus ajan kanssa oli +/- 5 minuuttia, mutta 10g: stä eteenpäin tämä vaihtuu +/- 3 sekuntiin. Koska tämä on tallennettu sisäiseen taulukkoon, Oracle ei salli pääsyä tämän taulukon tietoihin suoraan. Sen käyttämiseen käytetään sovellusliittymiä. Yksi tällainen API on paketista DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, jonka avulla voidaan käyttää järjestysnumeroa tästä taulukosta. Esimerkki tästä on alla (kiitos Tom Kyte kyselystä):
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
valitse SCN_to_timestamp (SCN) ts, min (SCN), max (SCN)
from (
valitse dbms_flashback.get_system_change_number () – level SCN
from dual
connect by level <= 100
)
ryhmä SCN_to_timestamp (SCN)
* järjestys SCN_to_timestamp (SCN)
SQL> /
TS MIN(SCN) MAX (SCN))
————————————————————————— ———- ———-
06- touko-16 05.22.04.00000000 PM 1245323 1245323
06-touko-16 05.22.07.00000000 PM 1245324 1245324
06-toukokuuta-16 05.22.10.00000000 PM 1245325 1245325
06-TOUKO-16 05.22.13.00000000 PM 1245326 1245326
06-TOUKO-16 05.22.16.00000000 PM 1245327 1245327
06-TOUKO-16 05.22.19.00000000 PM 1245328 1245328
06-TOUKO-16 05.22.22.00000000 PM 1245329 1245329
06-TOUKO-16 05.22.25.00000000 PM 1245330 1245330
06-TOUKO-16 05.22.28.00000000 PM 1245331 1245331
06-TOUKO-16 05.22.31.00000000 PM 1245332 1245332
06-TOUKO-16 05.22.34.00000000 PM 1245333 1245333
06-TOUKOKUUTA-16 05.22.37.00000000 PM 1245334 1245334
06-touko-16 05.22.40.00000000 PM 1245335 1245335
06-touko-16 05.22.43.00000000 PM 1245336 1245336
06-touko-16 05.22.46.00000000 PM 1245337 1245337
06-touko-16 05.22.49.00000000 PM 1245338 1245338
06-touko-16 05.22.52.00000000 PM 1245339 1245339
|
miten voimme kartoittaa SCN aikaleiman versiot ennen 10g?
on tärkeää muistaa, että tästä taulukosta ei käy ilmi, miksi SCN-lukujen nousuvauhti lisääntyisi. Pienellä muotoilulla on mahdollista saada käsitys SCN-luvuista, mutta niiden kasvun lähde ei käy ilmi tästä taulukosta.
toinen tapa tarkistaa tämä on the view V$LOG_HISTORY. Näkymä sisältää SCN muodossa sarakkeet FIRST_CHANGE# ja NEXT_CHANGE# ja voimme nähdä näiden kahden sarakkeet määrä SCN luotu tietokantaan ajan kuluessa. ”First_change# on alin SCN, joka esiintyy arkistoidussa lokitiedostossa tämän säikeen tietyllä järjestysnumerolla. ”Next_change#” on alin SCN, joka näkyy seuraavassa arkistoidussa lokitiedostossa.
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL> valitse säie#, first_change#, next_change# from v$log_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
|
kuten smon_scn_tablessa, ei ole mahdollista löytää SCN-lukujen sukupolven kasvun lähdettä tästä taulukkonäkymästä. Voit silti käyttää tätä näkymää sekä yksittäisessä tapauksessa että RAC-ympäristössä.
SCN kasvaa käyttäen sekvenssiä?
nyt pitäisi olla melko selvää, että SCN näyttää olevan luku, joka kasvaa jatkuvasti. Mielenkiintoista, vaikka se on numero, Oracle ei käytä mitään sekvenssiä lisätä sitä, vaan käyttää sisäisiä toimintoja sen sijaan. Esimerkiksi scn_basen lisäämiseksi sisäisesti käytetty funktio on KCMGAS (Get and Advance SCN). Tätä toimintoa kutsutaan aina, kun uutta SCN: ää pyydetään, ja tätä toimintoa koskevaa pyyntöä lisätään. Tämän funktion tapaan käytetään kcmgcs: ää (Get Current SCN) nykyisen SCN: n ja siihen käytetyn puhelun saamiseksi. Nämä funktiokutsut näkyvät V$sysstat-näkymästä. Tilaston kuvaus on 12.1 Viiteoppaassa.
katsotaan, miten nämä puhelut liittyvät SCN-sukupolveen. Käytämme kaksi istuntoa täällä-yksi nähdä puhelut view V$SYSSTAT näkymä, ja toinen istunto vetää SCN.
1
2
3
4
5
6
7
8
9
10
|
Session -1
SQL> l
1 * Valitse current_SCN v$ – tietokannasta
SQL> /
CURRENT_SCN
———–
698815
SQL>
|
tämän SCN, nämä olivat arvot v$sysstat:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL> l
1 Valitse nimi, arvo v$sysstat
2 * missä nimi kuten ”% calls to% ”
SQL> /
nimi-arvo
—————————————————————- ———-
puhelut kcmgcs 427
puhelut kcmgrs 0
puhelut kcmgas 7272
kutsuu tilannekuvan SCN: kcmgss 159790
SQL>
|
tehdään kysely nähdäksesi nykyisen SCN: n istunnossa 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 tässä on toisen istunnon tulos 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL> /
nimi-arvo
—————————————————————- ———-
puhelut kcmgcs 427
puhelut kcmgrs 0
puhelut kcmgas 7272
puhelut snapshot SCN: kcmgss 159790
SQL> /
nimi-arvo
—————————————————————- ———-
calls to kcmgcs 427
calls to kcmgrs 0
calls to kcmgas 7278
calls to get snapshot SCN: kcmgss 159905
SQL>
|
voimme nähdä, että puhelut KCMGAS on noussut 7278 edellisestä arvosta, 7272. Koska Oracle ei käytä sekvenssiä luvun kasvattamiseen, ei ole mitään takeita siitä, että SCN-luku kasvaa aina samassa järjestyksessä.
johtopäätös
tässä artikkelissa on käyty läpi, mikä SCN on, miten siihen suhtaudutaan ja mitkä ovat sen vaatimukset. Seuraavassa artikkelissa, näemme, mitä erilaisia SCN ovat saatavilla ja miten niitä käytetään tietokannassa. Pysykää kuulolla!