Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como reduzir o tablespace temporário no oracle?


Ó meu Deus! Veja o tamanho do meu tablespace temporário! Ou... como reduzir os tablespaces temporários no Oracle.

Sim, executei uma consulta para ver o tamanho do meu tablespace temporário:
SQL> SELECT tablespace_name, file_name, bytes
2  FROM dba_temp_files WHERE tablespace_name like 'TEMP%';

TABLESPACE_NAME   FILE_NAME                                 BYTES
----------------- -------------------------------- --------------
TEMP              /the/full/path/to/temp01.dbf     13,917,200,000

A primeira pergunta que você deve fazer é por que o tablespace temporário é tão grande. Você pode saber a resposta de cabeça. Pode ser devido a uma grande consulta que você acabou de executar com uma classificação que foi um erro (eu fiz isso mais de uma vez). Pode ser devido a alguma outra circunstância excepcional. Se for esse o caso, tudo o que você precisa fazer para limpar é reduzir o espaço de tabela temporário e seguir em frente.

Mas e se você não souber? Antes de decidir reduzir, talvez seja necessário fazer alguma investigação sobre as causas do grande espaço de tabela. Se isso acontecer regularmente, é possível que seu banco de dados precise de tanto espaço.

A visão de desempenho dinâmico
V$TEMPSEG_USAGE

pode ser muito útil para determinar a causa.

Talvez você simplesmente não se importe com a causa e precise apenas reduzi-la. Este é seu terceiro dia de trabalho. Os dados no banco de dados são apenas 200MiBif dados e o tablespace temporário é 13GiB - Apenas reduza-o e siga em frente. Se ele crescer novamente, investigaremos a causa. Nesse meio tempo, estou sem espaço nesse volume de disco e só preciso do espaço de volta.

Vamos dar uma olhada em reduzi-lo. Vai depender um pouco de qual versão do Oracle você está executando e como o tablespace temporário foi configurado.
O Oracle fará o melhor para evitar que você cometa erros horrendos, então vamos apenas tentar os comandos e se eles não funcionarem trabalho, vamos encolher de uma nova maneira.

Primeiro vamos tentar reduzir o arquivo de dados. Se pudermos fazer isso, recuperaremos o espaço e poderemos nos preocupar com o motivo pelo qual ele cresceu amanhã.
SQL>
SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M; 
alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M
*   
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

Dependendo da mensagem de erro, você pode tentar isso com tamanhos diferentes que sejam menores que o site atual do arquivo. Eu tive sucesso limitado com isso. O Oracle só reduzirá o arquivo se o tablespace temporário estiver no início do arquivo e for menor que o tamanho especificado. Alguma documentação antiga da Oracle (eles corrigiram isso) dizia que você poderia emitir o comando e a mensagem de erro informaria para qual tamanho você poderia reduzir. Quando comecei a trabalhar como DBA, isso não era verdade. Você só tinha que adivinhar e reexecutar o comando várias vezes e ver se funcionava.

Tudo bem. Isso não funcionou. Que tal agora.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;

Se você está em 11g (Talvez em 10g também) é isso! Se funcionar, você pode querer voltar ao comando anterior e tentar mais algumas vezes.

Mas e se isso falhar. Se o tablespace temporário for o temporário padrão que foi configurado quando o banco de dados foi instalado, talvez você precise fazer muito mais trabalho. Nesse ponto, costumo reavaliar se realmente preciso desse espaço de volta. Afinal, o espaço em disco custa apenas $X.XX por GiB. Normalmente eu não quero fazer mudanças como esta durante o horário de produção. Isso significa trabalhar na 2AMAGAIN! (Não que eu realmente me oponha a trabalhar às 2 da manhã - é só que... Bem, eu também gosto de dormir. E minha esposa gosta de me ter em casa às 2 da manhã... não perambulando pelas ruas do centro às 4 da manhã tentando lembrar onde estacionei meu carro. carro 3 horas antes. Ouvi falar dessa coisa de "teletrabalho". Eu só me preocupo se chegar na metade do caminho e minha conectividade com a Internet falhar - então eu tenho que correr para o centro da cidade para consertar tudo antes que as pessoas apareçam de manhã para usar o banco de dados.)

Ok... Voltando ao assunto sério... Se o tablespace temporário que você deseja reduzir for o seu tablespace temporário padrão, você terá que primeiro criar um novo tablespace temporário, defini-lo como o tablespace temporário padrão e então descartar seu tablespace temporário padrão antigo e recriar isto. Afterwordsdrop a segunda tabela temporária criada.
SQL> CREATE TEMPORARY TABLESPACE temp2
2  TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE
3  AUTOEXTEND ON NEXT 1M MAXSIZE unlimited
4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;

Database altered.

SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped.


SQL> CREATE TEMPORARY TABLESPACE temp
2  TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE
3  AUTOEXTEND ON NEXT 128M MAXSIZE unlimited
4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;

Database altered.

SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped.

Espero que uma dessas coisas ajude!