SELECT sem usar o Banco
É possível, nas plataformas Unix / Linux, recuperar dados dos DATAFILEs mesmo com a Instância Oracle parada, diretamente pelo Shell, sem usar SQL*Plus.
Sabendo-se qual o DATAFILE e bloco onde o dado está, basta usar o comando dd
como abaixo.
Não é exatamente um SELECT
, e para recuperar os dados, é necessário saber em que DATAFILE e bloco ele está. Mas nada impede que você, adaptando esta técnica, recupere todos os dados de um DATAFILE, e com a Instância parada !
Para saber qual bloco estão os dados de uma coluna, use este SELECT
:
SQL> SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK FROM CUSTOMER WHERE CUSTOMER_NAME = 'Portilho';
BLOCK
_ _ _ _
134
De posse do número do Bloco, retornado pro este SELECT
, basta executar no shell:
dd if=/u02/oradata/ORCL/users.dbf ibs=8192 skip=142 count=1 | strings
1+0 records in
142+0 records out
Ricardo Portilho Proni
Sendo que…
ibs é o tamanho do BLOCK_SIZE de seu Banco de Dados. No 10g, o padrão é 8192 bytes.
skip é o número do bloco recuperado no SELECT anterior, mais 8, que é a quantidade de blocos que compõe o HEADER do DATAFILE. Como os dados que eu quero estão no bloco 134, irei procura-los no bloco 142 (134 + 8).