quinta-feira, 15 de setembro de 2011

Como reduzir o datafile da tablespace Temporária (TEMP)


O banco de dados pode executar aplicações que possam fazer operações de classificação enormes; (por exemplo, relatórios de fechamento anual). Essa atividade pode aumentar o tamanho da tablespace TEMP ocupando a maior parte do espaço na file system. No exemplo citado o relatório pode executar uma ou duas vezes por ano e não há necessidade de manter / manter um tempfile enorme.

A tablespace TEMP foi criada com arquivos de dados como AUTOEXTEND ON MAXSIZE UNLIMITED para evitar erro:

ORA-1652 Text: unable to extend temp segment by %s in tablespace %s

Foram realizadas tentativas para reduzir o tempfile da tablespace TEMP, usando o comando “alter database tempifle... resize”  que normalmente falham, apresentando a mensagem de erro abaixo:


Error: ORA 3297 : file contains blocks of data beyond requested RESIZE value

Abaixo é apresentada uma solução para reduzir o “tempfile” da tablespace TEMP para utilizar o espaço em disco para outros fins.


Solução:


      1.Verificar a utilização da tablespace TEMP, utilizar os scripts abaixo:

SELECT COUNT(*) FROM DBA_EXTENTS 
 WHERE SEGMENT_TYPE='TEMPORARY';

select tablespace_name,
       CURRENT_USERS,
       TOTAL_BLOCKS,
       USED_BLOCKS,
       FREE_BLOCKS 
  from v$sort_segment;

select * from dba_tablespaces where tablespace_name = 'TEMP'; 

Caso as querys retornem linhas, executar o comando abaixo.

SQL> alter tablespace TEMP default storage (pctincrease 0);

Após execução do comando acima, deve-se verificar o resultado do comando, executando as queries abaixo.

select owner,
       segment_name,
       segment_type
  from dba_segments
 where tablespace_name = 'TEMP';

SELECT s.username,
       u.tablespace,
       u.contents,
       u.extents,
       u.blocks
   FROM v$session s, v$sort_usage u
   WHERE s.saddr=u.session_addr;

2. Na sequência criar uma nova tablespace temporária com tamanho menor.

SQL> create temporary tablespace TEMP1 tempfile 'c:\temp01.dbf' size 100M extent management local uniform size 128K;

3. Se a tablespace (atual) for uma tablespace temporário para todo o banco de dados, deve-se
    definir a  nova  tablespace (TEMP)  como  a  tablespace  temporária  padrão  para  todos  os  
    usuários no banco de dados, usar o comando abaixo.

SQL> alter database default temporary tablespace TEMP1;

4. Se necessário, altere todos os usuários para a nova tablepace temporária, utilizar o script
    abaixo:

SQL> select 'alter user '||username||' temporary tablespace TEMP;' from 
dba_users;

5.Remova a tablespace antiga:

SQL> drop tablespace temp including contents.

Nota:  Para o Oracle versão 9i, o comando “drop” tem uma variação para a remoção do “tempfile” no sistema operacional, é necessário utilizar o comando abaixo.

DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;



Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com