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.
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