Recriar Tablespace Temporária
A tablespace temporária (temporary tablespace) é utilizada para armazenar dados de ordenação ou dados de tabelas temporárias. Essa tablespace tem seu espaço físico reservado por um datafile temporário (temporary datafile ou tempfile).
Os tempfiles são consultados utilizando as views V$TEMPFILE e DBA_TEMP_FILES.
A tablespace temporária não é crítica, seu backup não é possível através das ferramentas do banco de dados (RMAN, export, datapump ou begin backup) e a instância continua ativa quando um problema ocorre com o mesmo; portanto, dependendo da utilização do banco de dados, um problema com o tempfile pode demorar para ser notado pelo DBA.
Os erros reportados por falta de um datafile temporário é sinalizado com um ORA-01116, seguindo de um ORA-01110 e ORA-27041.
Este post simula a remoção de um tempfile (através do sistema operacional) e uma alternativa para solução do problema utilizando exemplos práticos e as mensagens reportadas no alert log.
Conhecendo os tempfiles existentes
Utilizando a V$TEMPFILE:
SQL> select name from v$tempfile;
NAME
----------------------------------
/oracle/oradata/orcl/temp01.dbf
Utilizando a DBA_TEMP_FILES:
SQL> select tablespace_name, file_name from dba_temp_files;
TABLESPACE_NAME FILE_NAME
---------------- ------------------------------------
TEMP /oracle/oradata/orcl/temp01.dbf
Teste de backup de uma tablespace temporária
Utilizando SqlPlus:
SQL> alter tablespace temp begin backup;
alter tablespace temp begin backup
*
ERRO na linha 1:
ORA-03217: opção inválida para alteração de TEMPORARY TABLESPACE
Alert Log…
Tue Jun 15 11:09:47 2010
alter tablespace temp begin backup
ORA-3217 signalled during: alter tablespace temp begin backup...
Utilizando RMAN
RMAN> backup tablespace temp;
Iniciando backup em 25/06/2010 17:39:24
utilizando o canal ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: falha do comando backup em 06/25/2010 17:39:24
RMAN-20202: Tablespace não encontrado no catálogo de recuperação
RMAN-06019: não foi possível traduzir nome do tablespace "TEMP"
Como demonstrado, não há como efetuar backup de uma tablespace temporária utilizando as ferramentas do oracle, pelo fato de não ser uma tablespace crítica.
Excluindo um datafile temporário
Na prática ninguém exclui um arquivo do banco de dados, mas devemos nos preparar para todo tipo de situação. Iremos excluir um datafile temporário para observar o que ocorre com o banco e como solucionar o problema.
Excluindo o datafile:
[oracle@vmoracle ~]$ rm -fv /oracle/oradata/orcl/temp01.dbf
removed `/oracle/oradata/orcl/temp01.dbf'
Após a exclusão do datafile a instância continua no ar, sem causar problemas imediatos para o usuário.
Simulando um erro:
SQL> select a.owner, a.object_type, a.object_name from all_objects a
2 where exists (select 1 from all_objects b
3 where a.owner = b.owner
4 and a.object_type = b.object_type)
5 order by owner, object_type, object_name;
select a.owner, a.object_type, a.object_name from all_objects a where exists (select 1 from all_objects b where a.owner = b.owner and a.object_type = b.object_type) order by owner, object_type, object_name
*
ERRO na linha 1:
ORA-01116: erro ao abrir o arquivo 201 do banco de dados
ORA-01110: 201 do arquivo de dados: '/oracle/oradata/orcl/temp01.dbf'
ORA-27041: não é possível abrir arquivo
Linux Error: 2: No such file or directory
Additional information: 3
Esta consulta força a utilização de segmento temporário; como este segmento foi excluído, o erro é retornado.
Solucionando o problema
Como a instância não caiu, o problema é solucionado com o banco ativo, acompanhando os seguintes procedimentos.
- Criar outra tablespace temporária:
SQL> create temporary tablespace newtemp tempfile '/oracle/oradata/orcl/newtemp.dbf' size 10m;
Tablespace criado.
Alert Log…
Tue Jun 15 10:51:02 2010
create temporary tablespace newtemp tempfile '/oracle/oradata/orcl/newtemp.dbf' size 10m
Completed: create temporary tablespace newtemp tempfile '/oracle/oradata/orcl/newtemp.dbf' size 10m
- Alterar a tablespace temporária padrão do banco de dados:
SQL> alter database default temporary tablespace newtemp;
Banco de dados alterado.
Alert Log…
Tue Jun 15 10:52:26 2010
alter database default temporary tablespace newtemp
Completed: alter database default temporary tablespace newtemp
- Eliminar a tablespace antiga:
SQL> drop tablespace temp including contents and datafiles;
Tablespace eliminado.
Alert Log…
Tue Jun 15 10:54:17 2010
drop tablespace temp including contents and datafiles
Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2201.trc:
ORA-01122: o arquivo 201 do banco de dados falhou na análise da verificação
ORA-01110: 201 do arquivo de dados: '/oracle/oradata/orcl/temp01.dbf'
ORA-01565: erro ao identificar o arquivo '/oracle/oradata/orcl/temp01.dbf'
ORA-27037: não é possível obter status do arquivo
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2201.trc:
ORA-01258: não foi possível deletar o arquivo temporário /oracle/oradata/orcl/temp01.dbf
Completed: drop tablespace temp including contents and datafiles
Quando a tablespace é eliminada, no SqlPlus não é retornado erro, porém, observando o alert log o erro de que o datafile não existe é reportado.
- Alterar o nome da nova tablespace para o nome antigo:
SQL> alter tablespace newtemp rename to temp;
Tablespace alterado.
Alert Log…
Tue Jun 15 10:55:30 2010
alter tablespace newtemp rename to temp
Tablespace 'NEWTEMP' is renamed to 'TEMP'.
Completed: alter tablespace newtemp rename to temp
Esse procedimento evita problemas com qualquer script externo que utilizem o nome da tablespace temporária.
Solução aplicada, os erros param de ocorrer.
Muito bom Braga, realmente a tablespace temporária é uma tablespace que pode causar um problema que as vezes fica meio dificil do Dba perceber, como você disse acima.
Já problemas acontecerem, quando o Dba esquece de criar essa tablespace ao fazer restore do banco de dados em outro servidor usando o rman.
Abraço!
Obrigado pelas informações. Realmente, no meu caso, a sequência de erros ORA-01116, ORA-01110 e ORA-27041 ocorreram nessa ordem.
Post muito didático. Parabéns.