Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 15 de setembro de 2008

Solucionando o erro ORA-01187 em arquivos de dados temporários ...

Por Eduardo Legatti

Olá,


Recentemente um amigo meu teve um problema ao realizar uma exportação completa (full export) em um banco de dados Oracle 10g release 2 (10.2.0.1.0) instalado em um Suse Linux 9.2. Bem, tudo começou quando um técnico foi substituir um disco defeituoso no servidor de produção configurando em RAID 5. Apenas para recapitular, nesta configuração as informações de paridade são distribuídas entre os discos do array. O RAID 5 é muito semelhante ao nível 4, exceto pelo fato de que a paridade não fica destinada a um único disco, mas à toda matriz, fazendo com que a gravação de dados seja mais rápida, pelo fato de não ser necessário acessar um disco de paridade em cada gravação. Bom, voltando ao assunto original, o problema do meu amigo se iniciou quando o técnico resolveu dar um rebuild no array, ou seja, reconstruir o array. O problema é que após o procedimento, todos os dados tinham sido apagados ... Em resumo, como era início da manhã e os usuários estavam começando a chegar para trabalhar, meu amigo resolveu restaurar um backup frio da noite anterior em um servidor Oracle temporário que estava preparado para uso em caso de emergências. Ao restaurar o backup e abrir o banco de dados, ele tentou realizar uma exportação completa antes de liberar o acesso para os usuários, mas logo no início da exportação, e para surpresa dele, o erro ORA-01187 foi emitido dizendo que não era possível ler a partir de um arquivo pertencente ao tablespace temporário porque o mesmo havia falhado nos testes de verificação. Ao tentarmos ler informações da view DBA_TEMP_FILES, o mesmo erro era emitido, e após algumas análises, concluí que o backup frio utilizado para restaurar os dados não estava consistente, pelo menos parecia que o arquivo de dados pertencente ao tablespace temporário era de outra encarnação ou de um outro banco de dados.

Em resumo, neste artigo irei simular o mesmo problema ocorrido e demonstrar o que fazer para resolvê-lo.

Para simular o problema, eu copiei o arquivo de dados (tempfile) de um banco dados Oracle 10g Enterprise Edition instalado em um Linux para outro banco de dados Oracle XE instalado em um Windows, antes de abrir o banco de dados (Oracle XE).

-- Tentando gerar uma exportação full
C:\>exp system/password file=fullexport.dmp full=y

Export: Release 10.2.0.1.0 - Production on Seg Set 15 10:30:29 2008

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Conectado a: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Exportação executada no conjunto de caracteres de WE8PC850 e no conjunto de
caracteres de AL16UTF16 NCHAR o servidor usa WE8MSWIN1252 conjunto de caracteres
(conversão de conjunto de caracteres possível)

Sobre exportar o banco de dados inteiro ...
. exportando definições de tablespace
EXP-00008: Erro Oracle: 1187 encontrado
ORA-01187: não é possível ler a partir do arquivo 201, porque houve falha nos testes
de verificação ORA-01110: 201 do arquivo de dados: 'C:\ORACLEXE\ORADATA\XE\TEMP.DBF'
EXP-00000: Exportação encerrada sem êxito

-- Verificando o status da instância
SYS> select status from v$instance;

STATUS
------------
OPEN

-- Tentando obter informações da view dba_temp_files
SYS> select * from dba_temp_files;
select * from dba_temp_files
*
ERRO na linha 1:
ORA-01187: não é possível ler a partir do arquivo 201, porque houve falha nos testes
de verificação ORA-01110: 201 do arquivo de dados: 'C:\ORACLEXE\ORADATA\XE\TEMP.DBF'
De acordo com o manual da Oracle:

ORA-01187: cannot read from file string because it failed verification tests
Cause: The data file did not pass the checks to insure it is part of the database. Reads are not allowed until it is verified.
Action: Make the correct file available to the database. Then, either open the database, or execute ALTER SYSTEM CHECK DATAFILES.

Como a ação sugerida acima é bem genérica, vamos ver se executando o comando ALTER SYSTEM CHECK DATAFILES conseguimos alguma informação adicional.

SYS> alter system check datafiles;

Sistema alterado.

-- Lendo o conteúdo do log de alerta
Mon Sep 15 10:45:26 2008
Errors in file c:\oraclexe\app\oracle\admin\xe\bdump\xe_dbw0_3548.trc:
ORA-01186: file 201 failed verification tests
ORA-01122: database file 201 failed verification check
ORA-01110: data file 201: 'C:\ORACLEXE\ORADATA\XE\TEMP.DBF'
ORA-01203: wrong incarnation of this file - wrong creation SCN

Mon Sep 15 10:45:26 2008
File 201 not verified due to error ORA-01122

De acordo com o log de alerta, podemos perceber que o arquivo 201 não está consistente com as informações do dicionário de dados. Neste caso, mesmo criando um novo tablespace (TEMP2) e definindo ele como padrão, não conseguiríamos remover o tablespace TEMP pelo fato de o mesmo conter um arquivo de dados inconsistente. Como estamos tratando de um arquivo de dados pertencente ao tablespace temporário, ou seja, não é um arquivo crítico que precisaria de recuperação, então para ser mais direto, teremos apenas que remover este arquivo "defeituoso" e adicionar um novo:

SYS> alter database tempfile 'c:\oraclexe\oradata\xe\temp.dbf' drop including datafiles;

Banco de dados alterado.

-- Adicionando um novo arquivo (tempfile)
SYS> alter tablespace temp add tempfile 'c:\oraclexe\oradata\xe\temp.dbf' size 30m;
alter tablespace temp add tempfile 'c:\oraclexe\oradata\xe\temp.dbf' size 30m
*
ERRO na linha 1:
ORA-01119: erro ao criar o arquivo 'c:\oraclexe\oradata\xe\temp.dbf' de banco de dados
ORA-27038: arquivo criado já existe
OSD-04010: opção especificada, arquivo existente

Como eu esperava que o arquivo temp.dbf fosse deletado do sistema operacional, pelo fato de eu ter utilizado a cláusula INCLUDING DATAFILES no comando anterior, podemos perceber que isto não aconteceu como aconteceria em outras plataformas (Unix/Linux). Portanto, nas plataformas Windows, será necessário deletarmos o arquivo manualmente antes de adicionar o arquivo temporário, ou como segunda alternativa, adicionarmos a cláusula REUSE no comando de criação:

SYS> alter tablespace temp add tempfile 'c:\oraclexe\oradata\xe\temp.dbf'
2 reuse autoextend off;

Tablespace alterado.

SYS> select file_name,status from dba_temp_files;

FILE_NAME STATUS
------------------------------------------------ ---------
C:\ORACLEXE\ORADATA\XE\TEMP.DBF AVAILABLE

Após criado o arquivo, o mesmo poderá ser utilizado pelo tablespace TEMP sem maiores problemas ...



4 comentários:

Anônimo disse...

Eduardo já faz um tempo que eu acompanho o seu blog, as matérias são ótimas. Gostaria de tirar uma duvida com você sobre export será que é possível você passar o seu e-mail?
Obrigado desde já.
Meu e-mail gustavo@lazilha.eti.br

Eduardo Legatti disse...

Olá Gustavo,

Realmente não sou muito fã de disponibilizar meu(s) email(s) de forma pública (não tive boas experiências com isso), a não ser que seja dentro de uma comunidade como a Oracle Community, ou Linkedin, etc... No mais, constantemente participo do OTN Forums para responder dúvidas dos membros. Outra coisa é, porque não postar sua dúvida aqui mesmo? :-) É possível que a sua dúvida também seja a de muitas outras pessoas! Então vamos compartilhá-la ;-)

Até mais ...

Anônimo disse...

Ótima dica! Você salvou a minha vida. Obrigado.

Renata Costa disse...

Super obrigada! Está perfeito o artigo, e me ajudou bastante!

Postagens populares