Jeetje! Kijk naar de grootte van mijn tijdelijke tabelruimte! Of... hoe tijdelijke tabelruimten in Oracle te verkleinen.
Ja, ik heb een query uitgevoerd om te zien hoe groot mijn tijdelijke tablespace is:
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
De eerste vraag die je moet stellen is waarom de tijdelijke tablespace zo groot is. Misschien weet je het antwoord hierop uit je hoofd. Het kan te wijten zijn aan een grote query die u zojuist hebt uitgevoerd met een sortering die een fout was (ik heb dat meer dan eens gedaan.) Het kan te wijten zijn aan een andere uitzonderlijke omstandigheid. Als dat het geval is, hoef je alleen maar de tijdelijke tafelruimte te verkleinen en verder te gaan in het leven.
Maar wat als je het niet weet? Voordat je besluit te verkleinen, moet je misschien wat onderzoek doen naar de oorzaken van de grote tabelruimte. Als dit regelmatig gebeurt, kan het zijn dat uw database net zoveel ruimte nodig heeft.
De dynamische prestatieweergave
V$TEMPSEG_USAGE
kan zeer nuttig zijn bij het vaststellen van de oorzaak.
Misschien geef je gewoon niet om de oorzaak en moet je hem gewoon kleiner maken. Dit is je derde werkdag. De gegevens in de database zijn slechts 200MiBif-gegevens en de tijdelijke tabelruimte is 13GiB - Verklein het en ga verder. Als het weer groeit, zullen we de oorzaak onderzoeken. Ondertussen heb ik geen ruimte meer op dat schijfvolume en ik heb gewoon de ruimte terug nodig.
Laten we eens kijken naar het verkleinen ervan. Het hangt een beetje af van welke versie van Oracle u gebruikt en hoe de tijdelijke tabelruimte is ingesteld.
Oracle zal zijn best doen om te voorkomen dat u verschrikkelijke fouten maakt, dus we zullen gewoon de commando's proberen en als ze dat niet doen werk zullen we op een nieuwe manier krimpen.
Laten we eerst proberen het gegevensbestand te verkleinen. Als we dat kunnen doen, krijgen we de ruimte terug en kunnen we ons zorgen maken over waarom het morgen groeide.
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
Afhankelijk van de foutmelding wil je dit misschien proberen met verschillende formaten die kleiner zijn dan de huidige site van het bestand. Ik heb hier beperkt succes mee gehad. Oracle zal het bestand alleen verkleinen als de tijdelijke tabelruimte aan de kop van het bestand staat en als het kleiner is dan de grootte die u opgeeft. Sommige oude Oracle-documentatie (ze hebben dit gecorrigeerd) zeiden dat je de opdracht kon geven en de foutmelding zou je vertellen tot welke grootte je zou kunnen krimpen. Tegen de tijd dat ik als DBA begon te werken, was dit niet waar. Je moest het commando gewoon een paar keer raden en opnieuw uitvoeren om te kijken of het werkte.
Akkoord. Dat werkte niet. Wat dacht je hiervan.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
Als je in 11g zit (misschien ook in 10g), dan is dit het! Als het werkt, wil je misschien teruggaan naar het vorige commando en het nog een paar keer proberen.
Maar wat als dat niet lukt. Als de tijdelijke tabelruimte de standaard tijdelijke ruimte is die is ingesteld toen de database werd geïnstalleerd, moet u mogelijk veel meer werk doen. Op dit punt evalueer ik meestal opnieuw of ik die ruimte echt nodig heb. Schijfruimte kost immers maar $X.XX per GiB. Normaal gesproken wil ik dit soort wijzigingen niet aanbrengen tijdens productie-uren. Dat betekent werken bij 2AMAGAIN! (Niet dat ik er echt bezwaar tegen heb om om 2 uur 's nachts te werken - het is gewoon dat... Nou, ik hou ook van slapen. En mijn vrouw heeft me graag thuis om 2 uur 's nachts... niet door de straten van het centrum te dwalen om 4 uur 's nachts om te proberen te onthouden waar ik mijn auto 3 uur eerder. Ik heb gehoord van dat "telewerken"-ding. Ik ben gewoon bang dat ik halverwege zal zijn en dan zal mijn internetverbinding wegvallen - dan moet ik naar het centrum rennen om het allemaal te repareren voordat mensen 's ochtends opdagen om te gebruiken de database.)
Ok... Terug naar de serieuze dingen... Als de tijdelijke tabelruimte die u wilt verkleinen uw standaard tijdelijke tabelruimte is, moet u eerst een nieuwe tijdelijke tabelruimte maken, deze instellen als de standaard tijdelijke tabelruimte en vervolgens uw oude standaard tijdelijke tabelruimte laten vallen en opnieuw maken het. Afterwordsdrop de tweede tijdelijke tabel gemaakt.
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.
Hopelijk helpt een van deze dingen!