Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment réduire l'espace de table temporaire dans Oracle?

Oh mon Dieu! Regardez la taille de mon espace de table temporaire ! Ou... comment réduire les espaces de table temporaires dans Oracle.

Oui, j'ai exécuté une requête pour voir la taille de mon tablespace temporaire :

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

La première question que vous devez vous poser est de savoir pourquoi l'espace de table temporaire est si grand. Vous connaissez peut-être la réponse par cœur. Cela peut être dû à une grande requête que vous venez d'exécuter avec un tri qui était une erreur (je l'ai fait plus d'une fois). Cela peut être dû à une autre circonstance exceptionnelle. Si tel est le cas, tout ce que vous avez à faire pour nettoyer est de réduire l'espace de table temporaire et de passer à autre chose.

Mais que faire si vous ne savez pas? Avant de décider de rétrécir, vous devrez peut-être faire des recherches sur les causes du grand tablespace. Si cela se produit régulièrement, il est possible que votre base de données ait besoin d'autant d'espace.

La vue dynamique des performances

V$TEMPSEG_USAGE

peut être très utile pour déterminer la cause.

Peut-être que vous ne vous souciez pas de la cause et que vous avez juste besoin de la réduire. C'est votre troisième jour de travail. Les données de la base de données ne sont que de 200 MiBif et l'espace de table temporaire est de 13 Gio. Il suffit de le réduire et de passer à autre chose. S'il grossit à nouveau, nous en examinerons la cause. En attendant, je manque d'espace sur ce volume de disque et j'ai juste besoin de récupérer de l'espace.

Jetons un coup d'œil à sa réduction. Cela dépendra un peu de la version d'Oracle que vous utilisez et de la façon dont l'espace de table temporaire a été configuré.
Oracle fera de son mieux pour vous empêcher de faire des erreurs horribles, nous allons donc simplement essayer les commandes et si ce n'est pas le cas travail, nous allons rétrécir d'une nouvelle manière.

Essayons d'abord de réduire le fichier de données. Si nous pouvons faire cela, nous récupérons l'espace et nous pouvons nous demander pourquoi il a grandi demain.

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

Selon le message d'erreur, vous voudrez peut-être essayer avec des tailles différentes qui sont plus petites que le site actuel du fichier. J'ai eu un succès limité avec cela. Oracle ne réduira le fichier que si l'espace de table temporaire se trouve en tête du fichier et s'il est plus petit que la taille que vous spécifiez. Une ancienne documentation Oracle (ils ont corrigé cela) indiquait que vous pouviez émettre la commande et que le message d'erreur vous indiquerait à quelle taille vous pourriez réduire. Au moment où j'ai commencé à travailler en tant que DBA, ce n'était pas vrai. Il vous suffisait de deviner et de relancer la commande plusieurs fois pour voir si cela fonctionnait.

Très bien. Cela n'a pas fonctionné. Que diriez-vous de ça.

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;

Si vous êtes en 11g (Peut-être en 10g aussi) c'est ça ! Si cela fonctionne, vous voudrez peut-être revenir à la commande précédente et lui donner quelques essais supplémentaires.

Mais que se passe-t-il si cela échoue. Si le tablespace temporaire est le temporaire par défaut qui a été configuré lors de l'installation de la base de données, vous devrez peut-être effectuer beaucoup plus de travail. À ce stade, je réévalue généralement si j'ai vraiment besoin de cet espace. Après tout, l'espace disque ne coûte que X,XX $ par Gio. Habituellement, je ne veux pas faire de tels changements pendant les heures de production. Cela signifie travailler chez 2AMAGAIN ! (Ce n'est pas que je m'oppose vraiment à travailler à 2h du matin - c'est juste que... Eh bien, j'aime dormir aussi. Et ma femme aime que je sois à la maison à 2h du matin... ne pas errer dans les rues du centre-ville à 4h du matin en essayant de me rappeler où j'ai garé mon voiture 3 heures plus tôt. J'ai entendu parler de ce truc de "télétravail". Je crains juste que je n'arrive à mi-chemin et que ma connectivité Internet échoue - alors je dois me précipiter au centre-ville pour tout réparer avant que les gens ne se présentent le matin pour utiliser la base de données.)

Ok... Revenons aux choses sérieuses... Si l'espace de table temporaire que vous voulez réduire est votre espace de table temporaire par défaut, vous devrez d'abord créer un nouvel espace de table temporaire, le définir comme espace de table temporaire par défaut, puis supprimer votre ancien espace de table temporaire par défaut et recréer ce. Afterwordsdrop la deuxième table temporaire créée.

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.

Espérons que l'une de ces choses vous aidera !