abr 022015
 

A tablespace temporária encheu, você aumentou o tempfile para aquela carga e agora não tem mais espaço em disco. O que fazer ?

É muito fácil, e nesse post vamos falar sobre como mover ou diminuir um tempfile.

As opções que temos são as seguintes:

Resize

SQL> Alter database datafile 1 resize 10m;

Essa é uma das opções mais fáceis, mas nem sempre funciona.
Pode ser que você tenha muito segmentos temporários alocados e usados e você receba:

SQL> alter database tempfile 1 resize 10m;
 alter database tempfile 1 resize 10m
 *
 ERROR at line 1:
 ORA-03297: file contains used data beyond requested RESIZE value

Nesse caso você pode aumentar o tamanho do resize até que ele permita a operação.

A seguinte querie pode te ajudar, informando a alocação da tablespace temporária:

SELECT A.tablespace_name tablespace, D.mb_total,
 SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
 D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free, t.file_name
 FROM v$sort_segment A,
 (
 SELECT B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total
 FROM v$tablespace B, v$tempfile C
 WHERE B.ts#= C.ts#
 GROUP BY B.name, C.block_size
 ) D,
 dba_temp_files t
 WHERE A.tablespace_name = D.name and a.tablespace_name = t.tablespace_name
 GROUP by A.tablespace_name, D.mb_total, t.file_name;

Mas nem sempre você tem tempo de ficar aumentando o resize até funcionar, então você pode usar a próxima opção, que eu particularmente prefiro.

Shrink

Essa opção é muito fácil, mas só funciona a partir do 11g.

Você pode usá-la da seguinte forma

SQL> alter tablespace temp shrink space;
Tablespace altered.

Ao usá-la assim, o Oracle vai diminuir a tablespace temporária para o mínimo possível.

Embora você possa usar o shrink dessa maneira, o ideal é manter a tablespace no tamanho médio de utilização dela, não precisa diminuir de 10GB para 10M para ela crescer 5GB em poucos minutos.

É ai que entra a clausula KEEP:

SQL> alter tablespace temp shrink space keep 50m;
Tablespace altered.

O Oracle diminui a tablespace até o tamanho mínimo que você especificou com o KEEP,  no caso 50 megas.

Para investigar o quanto voce precisa de TEMP,  voce pode usar a V$TEMPSEG_USAGE como base.

Mas pode ser que o Shrink não funcione no seu caso, ou não libere o espaço que voce deseje. Nesse caso voce pode seguir para a próxima opção. A próxima opção inclusive é a preferida do Thomas Kyte.

Criar nova Tablespace temporária

Nessa estratégia voce cria uma tablespace nova, defini ela como a default do banco e por fim apaga a tablespace antiga.

Primeiramente criamos a nova tablespace:

SQL> create temporary tablespace temp2
 2 tempfile '/u01/app/oracle/oradata/orcl12c/temp02.dbf' size 10M REUSE
 3 autoextend on next 1M maxsize unlimited
 4 extent management local uniform size 1M;
Tablespace created.

Definimos a nova tablespace como a tablespace temporária padrão do banco:

SQL> alter database default temporary tablespace temp2;
Database altered.

E por fim damos um drop na tablespace antiga:

SQL> drop tablespace temp including contents and datafiles;
Tablespace dropped.

Muito fácil !

Espero que tenham gostado !

Qualquer duvida estou a disposição !!

  2 Responses to “Movendo e diminuindo arquivos temporários no Oracle”

  1. […] Observação -> Não é possível usar o ALTER TABLE MOVE para mover arquivo temporários. Mas você pode usar muitas outras técnicas para fazer isso conforme o artigo […]

  2. […] Observação -> Não é possível usar o ALTER TABLE MOVE para mover arquivo temporários. Mas você pode usar muitas outras técnicas para fazer isso conforme o artigo. […]

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)