Åh min Gud! Se på størrelsen af min midlertidige tablespace! Eller... hvordan man formindsker midlertidige tablespaces i Oracle.
Ja, jeg kørte en forespørgsel for at se, hvor stor mit midlertidige tablespace er:
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
Det første spørgsmål, du skal stille, er, hvorfor den midlertidige tablespace er så stor. Du kender måske svaret på dette fra hovedet. Det kan være på grund af en stor forespørgsel, at du bare kører med en sortering, der var en fejl (det har jeg gjort mere end én gang). Det kan skyldes en anden usædvanlig omstændighed. Hvis det er tilfældet, er alt, hvad du skal gøre for at rydde op, at formindske det midlertidige bordrum og komme videre i livet.
Men hvad hvis du ikke ved det? Før du beslutter dig for at skrumpe, skal du muligvis foretage en undersøgelse af årsagerne til den store bordplads. Hvis dette sker med jævne mellemrum, er det muligt, at din database bare har brug for så meget plads.
Den dynamiske ydeevnevisning
V$TEMPSEG_USAGE
kan være meget nyttig til at bestemme årsagen.
Måske er du bare ligeglad med årsagen, og du skal bare formindske den. Dette er din tredje dag på jobbet. Dataene i databasen er kun 200MiBif-data, og det midlertidige tablespace er 13GiB - Bare krymp det og fortsæt. Hvis det vokser igen, vil vi undersøge årsagen. I mellemtiden er jeg løbet tør for plads på diskenheden, og jeg skal bare have pladsen tilbage.
Lad os tage et kig på at formindske det. Det vil afhænge lidt af, hvilken version af Oracle du kører, og hvordan det midlertidige tablespace blev sat op.
Oracle vil gøre det bedste for at forhindre dig i at lave nogen forfærdelige fejl, så vi prøver bare kommandoerne, og hvis de ikke gør det arbejde vil vi krympe en ny måde.
Lad os først prøve at formindske datafilen. Hvis vi kan gøre det, får vi pladsen tilbage, og vi kan bekymre os om, hvorfor den voksede i morgen.
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
Afhængigt af fejlmeddelelsen vil du måske prøve dette med forskellige størrelser, der er mindre end det aktuelle sted for filen. Jeg har haft begrænset succes med dette. Oracle vil kun formindske filen, hvis det midlertidige tablespace er i toppen af filen, og hvis det er mindre end den størrelse, du angiver. Nogle gamle Oracle-dokumentation (de rettede dette) sagde, at du kunne udstede kommandoen, og fejlmeddelelsen ville fortælle dig, hvilken størrelse du kunne skrumpe til. Da jeg begyndte at arbejde som DBA, var dette ikke sandt. Du skulle bare gætte og køre kommandoen igen en masse gange og se, om den virkede.
I orden. Det virkede ikke. Hvad med det her.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
Hvis du er i 11g (måske også i 10g) er dette det! Hvis det virker, vil du måske gå tilbage til den forrige kommando og give den nogle flere forsøg.
Men hvad hvis det mislykkes. Hvis det midlertidige tablespace er standard midlertidigt, der blev sat op, da databasen blev installeret, skal du muligvis gøre meget mere arbejde. På dette tidspunkt revurderer jeg normalt, om jeg virkelig har brug for den plads tilbage. Efter al diskplads koster kun $X,XX en GiB. Normalt vil jeg ikke lave sådanne ændringer i produktionstiden. Det betyder at arbejde hos 2AMAGAIN! (Ikke at jeg egentlig er imod at arbejde kl. 02.00 - det er bare det... Nå, jeg kan også godt lide at sove. Og min kone kan godt lide at have mig hjemme kl. 02.00... ikke at strejfe rundt i centrums gader kl. 04.00 og prøve at huske, hvor jeg parkerede min bil 3 timer tidligere. Jeg har hørt om det der med "fjernarbejde". Jeg er bare bekymret for, at jeg kommer halvvejs igennem, og så vil min internetforbindelse svigte - så må jeg skynde mig i centrum for at ordne det hele, før folk dukker op om morgenen for at bruge databasen.)
Ok... Tilbage til de seriøse ting...Hvis det midlertidige tablespace, du vil formindske, er dit standard midlertidige tablespace, skal du først oprette et nyt midlertidigt tablespace, indstille det som det midlertidige standard tablespace og derefter slippe dit gamle standard midlertidige tablespace og genskabe det. Slip derefter den anden midlertidige tabel oprettet.
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.
Forhåbentlig vil en af disse ting hjælpe!