Find the Datafile Checkpoint SCN in Linux

Português/English

Today I was asked how to find the datafile checkpoint SCN in Linux, reading the datafile directly. Of course, you have other ways to do it easier if you can use Oracle tools, either using RMAN ou querying V$ views. But, if you just have the datafile and for whatever reason you can’t use Oracle tools, here is a shell script to find the SCN:

SQL> select CHECKPOINT_CHANGE# from v$datafile_header where file#=1;

CHECKPOINT_CHANGE#
------------------
           2502608

1 row selected.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

$ file="system01.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
2502608

I tested it against 11g and 12c datafiles. I have no idea if it works also in older versions, or will work in newer ones. It depends on Oracle not changing the absolute position of the SCN in the datafile header.

I also had no opportunity to test it in a Big Endian platform, like AIX. I guess you should just switch $a and $b variables in the code for this to work.

If you can test it please let me know the results, especially in a Big Endian platform.

Regards.


Encontre o Checkpoint SCN de um Datafile no Linux

Português/English

Hoje me perguntaram como encontrar o SCN do último checkpoint de um datafile no Linux, lendo o arquivo diretamente. Claro que há maneiras mais fáceis se você puder usar ferramentas Oracle, como o RMAN ou consultando as visões V$. Mas, se você só tem o datafile e por qualquer razão não pode usar as ferramentas Oracle no momento, aqui está um shell script para encontrar o SCN:

SQL> select CHECKPOINT_CHANGE# from v$datafile_header where file#=1;

CHECKPOINT_CHANGE#
------------------
           2502608

1 row selected.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

$ file="system01.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
2502608

Eu testei em datafiles 11g e 12c. Não tenho ideia se funciona em versões mais antigas, ou se vai continuar funcionando nas mais novas. Depende de a Oracle não mudar a posição absoluta do SCN no cabeçalho do datafile.

Eu também não tive a oportunidade de testar em um ambiente Big Endian como AIX. Eu acredito que basta inverter os valores das variáveis $a e $b para funcionar.

Se você puder testar em seu banco por favor me diga se funcionou, especialmente em plataforma Big Endian.

Abraços.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s