SCN

In qualche caso puo' essere utile conoscere l'SCN di un datafile di un control file di Oracle senza montare il database.
In questa pagina vediamo un modo per ottenerlo con un semplice comando shell.

Il contenuto di questa pagina ed i riferimenti sono adatti solo ad un pubblico adulto... [NdA ovviamente per adulto intendo DBA Senior].

Ho fretta!

SCN, chi era costui?

In realta' se siete dei DBA Oracle dell'SCN ne avete sicuramente sentito parlare!
L'SCN, ovvero il System Change Number, e' l'orologio interno del database Oracle che scandisce ogni transazione. E' un numero di 6 byte (48 bit) e per ragioni storiche (i processori di allora non gestivano l'aritmetica a 64 bit) e' costituito da un numero di 32 bit e con 16 bit di offset. In pratica il valore massimo e' 281,474,976,710,656 (2^48) ed ovviamente non si deve mai raggiungere.

Ora il nostro problema e' piu' semplice: vogliamo conoscere l'SCN dei file di un database Oracle ospitato su un sistema Unix/Linux. Basta un semplice comando:

cd /oradata/ORCL/datafile od -x -N 10000 o1_mf_system_kn08jl47_.dbf | grep ^0020740 | awk '{ printf("%d\n", strtonum("0x" $5 $4 )) }' 58369963

L'SCN del file controllato, che e' il datafile del tablespace system, e' 58369963, facile vero?

SCN

Il System Change Number e' fondamentale per garantire le proprieta' ACID delle transazioni. Una sessione non puo' vedere dati che hanno un SCN superiore a quello di partenza e deve eventualmente accedere ai segmenti di UNDO. Se gli SCN dei datafile non corrispondono Oracle richiede il recovery della base dati... insomma e' un numero davvero importante.

Per controllarne il valore sul DB:

select CHECKPOINT_CHANGE#, CURRENT_SCN
  from V$DATABASE;

Con una semplice query, appena piu' elaborata, e' possibile verificare l'SCN di ogni datafile su un database (anche solo in stato di mount, quindi anche durante le fasi recovery o su uno standby database):

set pages 120
set lines 256
column name format a70
column CHECKPOINT_CHANGE# format 9999999999999999

select file#, TABLESPACE_NAME, CHECKPOINT_CHANGE#, name
  from v$datafile_header
 order by file#;

     FILE# TABLESPACE_NAME		  CHECKPOINT_CHANGE# NAME
---------- ------------------------------ ------------------ -------------------------------------------------------
	 1 SYSTEM				    58369963 /oradata/ORCL/datafile/o1_mf_system_kn08jl47_.dbf
	 2 MYDB_ADT_DATI			    58369963 /oradata/ORCL/datafile/o1_mf_mydb_adt_kn08jlcp_.dbf
	 3 SYSAUX				    58369963 /oradata/ORCL/datafile/o1_mf_sysaux_kn08jsq8_.dbf
	 4 UNDOTBS1				    58369963 /oradata/ORCL/datafile/o1_mf_undotbs1_kn08l6w0_.dbf
	 5 UNDOTBS2				    58369963 /oradata/ORCL/datafile/o1_mf_undotbs2_kn08lbx4_.dbf
	 7 USERS				    58369963 /oradata/ORCL/datafile/o1_mf_users_kn08lfvx_.dbf
	 8 MYDB_BC_DATI 			    58369963 /oradata/ORCL/datafile/o1_mf_mydb_bc__kn08lk59_.dbf
...

Se controlliamo il contenuto del file con od -x:

*
0020740 0000 0000 a7ab 037a 0000 0000 96e2 42b4
0020760 0002 0000 0313 0000 5a2c 0001 0010 c9a0
0021000 0006 0000 0000 0000 0000 0000 0000 0000
0021020 0000 0000 0000 0000 0000 0000 0000 0000

E' evidente come opera lo script: cerca la nella corretta posizione l'SCN e lo converte dalla rappresentazione ottale. Se il vostro awk non conosce la funzione strtonum() potete utilizzare il gawk oppure l'equivalente in Bourne shell:

file="/oradata/ORCL/datafile/o1_mf_system_kn08jl47_.dbf"
a=`od -x -N 10000 $file | grep ^0020740 | tr -s " " | cut -f5 -d" "`
b=`od -x -N 10000 $file | grep ^0020740 | tr -s " " | cut -f4 -d" "` 
printf "%d\n" 0x$a$b
58369963

La stessa cosa si puo' fare sui control file. E' solo differente l'offset:

file="/oradata/ORCL/control1.ctl"
a=`od -x -N 20000 $file | grep ^0040140 | tr -s " " | cut -f7 -d" "`
b=`od -x -N 20000 $file | grep ^0040140 | tr -s " " | cut -f6 -d" "` 
printf "%d\n" 0x$a$b

Ma la posizione e' sempre la stessa?
In generale si, dalla 11g alla 21c non e' cambiata!

Note

Glider Life is DUL without need of it.
BBed is the best place for thinking... or doing nothing.

Altri documenti di questo tipo su questa pagina Hack


Titolo: SCN
Livello: Hack (5/5)
Data: 14 Febbraio 2022
Versione: 1.0.0 - 14 Febbraio 2022
Autore: mail [AT] meo.bogliolo.name