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].
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:
L'SCN del file controllato, che e' il datafile del tablespace system, e' 58369963, facile vero?
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!
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
Titolo: SCN
Livello: Hack
Data:
14 Febbraio 2022
Versione: 1.0.0 - 14 Febbraio 2022
Autore: mail [AT] meo.bogliolo.name