Redgate Hub

Per molte persone che lavorano con Oracle database, SCN (System Change Number) è un argomento che li interessa molto, ma nonostante ciò è un argomento affascinante, è anche confuso. In questo articolo impareremo il nocciolo di SCN: cos’è, dove viene utilizzato e come funziona.

Vale la pena ricordare che questo non è e non può essere una copertura completa di ogni dettaglio su SCN. Detto questo, iniziamo.

SCN-Perché ne abbiamo bisogno?

Supponiamo che sia la fine del mese e il suo giorno di paga. Siete nel gruppo del libro paga e, con l’autorità appropriata, hanno emesso una query per tirare il calcolo attualmente stipendio di tutti i dipendenti. I numeri scorrono sullo schermo, tutto sta andando alla grande.

Supponiamo che, mentre si sta guardando l’output, un collega inizi una nuova esecuzione di pagamento e che il lavoro batch cancelli il riepilogo del calcolo corrente. Le cose diventerebbero sicuramente confuse se il tuo output mostrasse improvvisamente ‘0’ per le nuove righe che uscivano.

In effetti, per questo scenario, probabilmente ti aspetteresti che l’output rifletta lo “stato del database” – il contenuto di ogni riga – nel modo in cui esisteva nel momento in cui hai emesso la tua query.

Una delle garanzie del database Oracle è che “non ci sono letture sporche di dati utente”. Se necessario, Oracle ricostruirà ogni riga allo stato stabile all’istante in cui è stata emessa la query.

Oracle lo fa in modo piacevole e molto accurato attraverso un “timer” a sé stante, noto come System Change Number, NOTO ANCHE come SCN.

Discuteremo questi aspetti del SCN:

  • Il numero stesso
  • Il generatore di numeri
  • Luoghi in cui è memorizzato il numero

Quindi iniziamo!

Elementi costitutivi per la comprensione di SCN

Per indagare su SCN, è necessario comprendere diversi termini. Sebbene queste definizioni siano ben documentate, vale la pena ripeterle qui:

Transazione

Dalla Guida ai concetti della documentazione di Oracle online:

“Una transazione è un’unità di lavoro atomica logica che contiene una o più istruzioni SQL. Una transazione raggruppa le istruzioni SQL in modo che siano tutte impegnate, il che significa che vengono applicate al database o tutte ripristinate, il che significa che vengono annullate dal database. Oracle Database assegna a ogni transazione un identificatore univoco chiamato ID transazione”.

Più semplicemente: quando iniziamo una transazione iniziamo una serie di modifiche. Questi devono essere completati in toto o non devono essere completati affatto. Poiché le transazioni si verificano nel database, gli utenti che leggono qualsiasi area che è cambiata non devono essere influenzati da effetti collaterali che possono alterare i loro risultati.

Affinché le transazioni funzionino correttamente in qualsiasi database, il database deve seguire quattro regole ACID. Questi sono:

  • Atomicità;
  • Consistenza;
  • Isolamento;
  • Durata.

Quindi dove si inserisce SCN in tutto questo? E la risposta a questa domanda è che l’utilizzo di SCN solo Oracle mantiene la coerenza dei dati. Questo viene fatto per garantire che qualsiasi punto del tempo, non vi è alcuna discrepanza nei risultati che vengono mostrati agli altri quando un utente sta cambiando qualcosa, e viceversa.

Per riassumere, in Oracle, il principio di “I lettori non aspettano scrittori e gli scrittori non hanno bisogno di lettori” è completamente e veramente seguito. A tal fine, è della massima importanza che i dati, che sono attualmente sottoposti a qualsiasi tipo di modifica, non debbano essere disponibili a nessuno tranne la persona che sta apportando tali modifiche. Per le transazioni, questo è necessario per mantenere l’integrità dei dati. Tre cose possono accadere che possono interrompere questa integrità-Dirty Read, Fuzzy Read e Phantom Read. Per garantire che non ci saranno problemi di integrità in queste transazioni, sono disponibili diversi livelli di isolamento. Questi sono:

  • Read Uncommitted
  • Read Committed
  • Repeatable Read
  • Serializable

livelli di Isolamento delle Transazioni

Da questi, Oracle offre una Lettura Impegnata, come il livello di isolamento predefinito, assicurandosi che non vi è alcuna possibilità di un utente di vedere le modifiche apportate da un altro utente che non sono ancora impegnati. Non ci deve essere alcuna lettura su quei dati che sono contrassegnati come” sporchi ” e ci deve essere un meccanismo abbastanza robusto da rendere possibile tutto questo.

Per rendere questo possibile, SCN svolge un ruolo vitale.

SCN, un’introduzione

Il numero di commit del sistema può essere inteso come rappresentazione del tempo di Oracle. Oracle utilizza SCN per controllare la coerenza, per eseguire il ripristino e per ordinare i vettori di modifica nella ripetizione.

SCN si trova in molte posizioni, sia in memoria che sul disco. Diverse posizioni vengono utilizzate per aiutare il sistema di database a identificare i vari stati del database. Ad esempio, in alcune posizioni viene utilizzato per indicare lo stato di completamento della transazione e se è attivo o impegnato.

Contrariamente alla credenza popolare, non viene generato solo al momento del commit, anche se questo è ciò che suggerisce il nome stesso. SCN è lì tutto il tempo nel database, che rappresenta una porzione di tempo per l’operazione che sta accadendo in quell’istante di tempo. Non è completamente impreciso dire che SCN non viene generato con un commit, lo fa – ma non è l’unico modo in cui viene generato SCN.

SCN è un numero in due parti generato su richiesta, in risposta a un evento. È un po ‘ come la data e l’ora derivata da una combinazione di calendario e orologio; l’orologio cambia rapidamente e solo quando ha attraversato il ciclo completo di 24 ore è cambiato l’overflow – il calendario. Tuttavia, l’evento che cambia l’orologio è il “pendolo” ed è regolare, mentre l’evento che cambia l’SCN è una chiamata a una specifica funzione interna.

Simile a un calendario / orologio timestamp, il valore può essere registrato in una varietà di luoghi diversi, ciascuno per un uso diverso.

Un esempio reale simile a un SCN è un orologio dell’aeroporto. Due persone entrano in un aeroporto allo stesso tempo e possono notare l’ora dell’orologio. Quel momento ci dà ‘una voce SCN’ che sembra essere la stessa per entrambe le persone. Una persona riceve un carrello per il bagaglio prima del check-in, mentre l’altra procede direttamente al banco del check-in. Quando i posti sono assegnati, ogni persona può ottenere un diverso ‘check-in SCN’ poiché gli orari sono leggermente diversi. Un ‘SCN imbarco’ può essere assegnato per indicare quando ciascuno è salito a bordo, ma entrambi ottenere lo stesso ‘SCN decollo’.

Come la combinazione di calendario e orologio, il SCN è garantito per essere in aumento sotto il normale funzionamento. Non vi è alcuna garanzia che il numero sarà sequenziale (numeri mancanti).

Allora, dove sono queste informazioni su SCN utilizzate nel database Oracle? Beh, quasi ovunque. Proprio come associamo il Tempo ad ogni nostra attività, SCN è anche associato ad ogni parte della funzionalità del database. Ad esempio, quando si tenta di selezionare i dati da una tabella, SCN viene utilizzato per confermare se i dati sono coerenti o meno. SCN si trova anche nelle intestazioni delle transazioni del blocco dati. Questo SCN rappresenterebbe il momento in cui la transazione è iniziata e quando è stata commessa. Allo stesso modo, per ogni modifica eseguita, viene mantenuta una voce nel registro Ripeti e per ciascuna di queste voci, SCN viene utilizzato per rappresentare l’ora dell’occorrenza della transazione.

Read consistency utilizza SCN per decidere per quanto tempo deve applicare Undo sul buffer sporco in modo che la richiesta di dati coerenti letti per una sessione possa essere completata. E come è noto, SCN viene incrementato con ogni operazione di commit.

Formato e struttura SCN

SCN è un numero enorme con due componenti: SCN Base & SCB Wrap.

SCN è un numero di 6 byte (48 bit). Di questi 48 bit, SCN_WRAP è un numero di 16 bit (2 byte) e SCN_BASE è un numero di 32 bit (4 byte). Entrambi BASE & WRAP vengono utilizzati per controllare l’incremento di SCN e per garantire che il database non si esaurisca. SCN_WRAP viene incrementato di 1 quando SCN_BASE raggiunge il valore di 4 miliardi e SCN_BASE diventa 0.

Da Oracle Versione 12c, il numero SCN è un numero di 8 byte.

Quindi, come vediamo il valore SCN corrente? Il modo più semplice è interrogare il DATABASE view V DATABASE. Dai un’occhiata:

1
2
3
4
5

SQL> selezionare current_scn da V$database;
CURRENT_SCN
———–
1123790

Come possiamo vedere, che il SCN è visualizzato come un numero. Questo è un bene perché rende l’uso di SCN facile per noi nelle nostre dichiarazioni esecuzione di recupero, flashback, ecc. Se vogliamo, possiamo convertire anche SCN in un valore esadecimale:

1
2
3
4
5

SQL> selezionare to_char(‘1123790′,’xxxxxxxx’) scn_hex da doppio;
SCN_HEX
———
1125ce

Qui è un esempio di uscita dalla stessa vista accessibili paio di volte:

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

SQL> selezionare current_scn da V$database;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886

è Interessante notare che questo aumento del SCN valore mostra un aspetto importante del SCN. Possiamo vedere che con ogni esecuzione, c’è un aumento del conteggio del SCN. Interrogando il DATABASE view V DATABASE, stiamo effettivamente causando il salto nel numero SCN.

Tabella SMON_SCN_TIME

Il modo più semplice per vedere entrambi questi valori è da una tabella interna di proprietà di SYS user – SMON_SCN_TIME. Quanto segue è un output dello stesso (11204).

1
2
3
4
5
6

SQL> selezionare SCN_wrp, SCN_bas, SCN da smon_SCN_time dove rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406

Questa tabella contiene le voci di modifica dello stato generato. Memorizza i dati in incrementi di circa 5 minuti e contiene 5 giorni di dati. Ciò significa che la tabella contiene circa 1440 record. Il numero esatto di record varierà leggermente poiché l’incremento di archiviazione non è esattamente di 5 minuti.

1
2
3
4
5

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

Nelle versioni di Oracle prima 10g, la mappatura in tempo di SCN con il tempo è stata del +/- 5 minuti, ma da 10g in poi, questo è cambiato a +/- 3 secondi. Poiché si tratta di negozi in una tabella interna, Oracle non consente l’accesso alle informazioni direttamente da questa tabella. Per accedervi, vengono fornite le API. Una di queste API proviene dal pacchetto DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, che può essere utilizzato per accedere al numero di sequenza da questa tabella. Un esempio di questo è dato di seguito (grazie a Tom Kyte per la query):

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
selezionare SCN_to_timestamp (SCN) ts, min(SCN), max (SCN)
da (
selezionare dbms_flashback.get_system_change_number () a livello di SCN
doppia
connettersi livello <= 100
)
gruppo da SCN_to_timestamp(SCN)
* ordine SCN_to_timestamp(SCN)
SQL> /
TS MIN(SCN) MAX(SCN)
————————————————————————— ———- ———-
06-MAGGIO-16 05.22.04.000000000 PM 1245323 1245323
06-MAGGIO-16 05.22.07.000000000 PM 1245324 1245324
06-MAGGIO-16 05.22.10.000000000 PM 1245325 1245325
06-MAGGIO-16 05.22.13.000000000 PM 1245326 1245326
06-MAGGIO-16 05.22.16.000000000 PM 1245327 1245327
06-MAGGIO-16 05.22.19.000000000 PM 1245328 1245328
06-MAGGIO-16 05.22.22.000000000 PM 1245329 1245329
06-MAGGIO-16 05.22.25.000000000 PM 1245330 1245330
06-MAGGIO-16 05.22.28.000000000 PM 1245331 1245331
06-MAGGIO-16 05.22.31.000000000 PM 1245332 1245332
06-MAGGIO-16 05.22.34.000000000 PM 1245333 1245333
06-MAGGIO-16 05.22.37.000000000 PM 1245334 1245334
06-MAGGIO-16 05.22.40.000000000 PM 1245335 1245335
06-MAGGIO-16 05.22.43.000000000 PM 1245336 1245336
06-MAGGIO-16 05.22.46.000000000 PM 1245337 1245337
06-MAGGIO-16 05.22.49.000000000 PM 1245338 1245338
06-MAGGIO-16 05.22.52.000000000 PM 1245339 1245339

Come possiamo mappa SCN con Timestamp nelle versioni precedenti a 10g?

È importante ricordare che questa tabella non mostra perché ci sarebbe un aumento del tasso di aumento dei numeri SCN. Con un po ‘ di formattazione, è possibile avere un’idea dei numeri SCN generati ma la fonte della loro crescita non sarà evidente da questa tabella.

Un altro modo per verificare questo è dalla vista V LOG LOG_HISTORY. La vista contiene SCN sotto forma di colonne FIRST_CHANGE# e NEXT_CHANGE# e possiamo vedere attraverso queste due colonne la quantità di SCN generati nel database per un periodo di tempo. Il ” first_change# è il SCN più basso che appare nel file di registro archiviato in un determinato numero di sequenza di questo thread. Il” next_change# ” è il SCN più basso che appare nel prossimo file di registro archiviato.

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

SQL> selezionare il thread#, first_change#,next_change# 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

Come con SMON_SCN_TABLE non è possibile trovare la fonte dell’aumento della generazione di SCN numeri da questa tabella. Tuttavia, è possibile utilizzare questa vista nella singola istanza e in un ambiente RAC.

SCN aumenta usando una sequenza?

Ormai dovrebbe essere abbastanza evidente che SCN sembra essere un numero in costante aumento. È interessante notare che, anche se si tratta di un numero, Oracle non utilizza alcuna sequenza per aumentarlo ma utilizza invece funzioni interne. Ad esempio, per aumentare SCN_BASE, la funzione utilizzata internamente è KCMGAS(Get e Advance SCN). Questa funzione viene chiamata ogni volta che viene richiesto un nuovo SCN e la chiamata per questa funzione viene aumentata. Analogamente a questa funzione, KCMGCS (Get Current SCN) viene utilizzato per ottenere l’SCN corrente e la chiamata utilizzata per esso. Queste chiamate di funzione possono essere viste dalla vista V sy sysstat. Una descrizione di queste statistiche può essere trovata nella guida di riferimento 12.1.

Vediamo come queste chiamate si collegano con la generazione SCN. Stiamo usando due sessioni qui: una per vedere le chiamate nella vista V SY SYSSTAT view e l’altra sessione per estrarre SCN.

1
2
3
4
5
6
7
8
9
10

Sessione -1
SQL> l
1* selezionare current_SCN da V$database
SQL> /
CURRENT_SCN
———–
698815
SQL>

Per questo SCN, questi erano i valori di V$sysstat:

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

SQL> l
1 selezionare nome,valore da$V sysstat
2* where nome like ‘%chiamate a%’
SQL> /
NOME VALORE
—————————————————————- ———-
chiamate per kcmgcs 427
chiamate a kcmgrs 0
chiamate a kcmgas 7272
chiamate per ottenere snapshot SCN: kcmgss 159790
SQL>

Emettiamo una query per vedere l’attuale SCN nella sessione 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 ecco il risultato della seconda sessione 2:

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

SQL> /
NOME VALORE
—————————————————————- ———-
chiamate per kcmgcs 427
chiamate a kcmgrs 0
chiamate a kcmgas 7272
chiamate per ottenere istantanea SCN: kcmgss 159790
SQL> /
NOME VALORE
—————————————————————- ———-
chiamate per kcmgcs 427
chiamate a kcmgrs 0
chiamate a kcmgas 7278
chiamate per ottenere istantanea SCN: kcmgss 159905
SQL>

Possiamo vedere che le chiamate al KCMGAS ha aumentato a 7278 dall’ultimo valore, 7272. Poiché Oracle non utilizza una sequenza per aumentare il numero, non vi è alcuna garanzia che il numero SCN venga sempre aumentato nello stesso ordine.

Conclusione

In questo articolo, abbiamo dato un’occhiata a cos’è SCN, come visualizzarlo e quali sono i requisiti per esso. Nel prossimo articolo, vedremo quali diversi tipi di SCN sono disponibili e come vengono utilizzati nel database. Restate sintonizzati!

Write a Comment

Il tuo indirizzo email non sarà pubblicato.