sql >> Databasteknik >  >> RDS >> Oracle

Hur krymper man temporärt bordsutrymme i Oracle?

Åh herre gud! Titta på storleken på mitt tillfälliga bordsutrymme! Eller... hur man förminskar tillfälliga bordsutrymmen i Oracle.

Ja, jag körde en fråga för att se hur stor mitt tillfälliga tabellutrymme är:

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

Den första frågan du måste ställa är varför det tillfälliga bordsutrymmet är så stort. Du kanske vet svaret på detta överhuvudtaget. Det kan bero på en stor fråga som du bara kör med en sorts som var ett misstag (jag har gjort det mer än en gång.) Det kan bero på någon annan exceptionell omständighet. Om så är fallet behöver du bara göra rent att krympa det tillfälliga bordsutrymmet och gå vidare i livet.

Men vad händer om du inte vet? Innan du bestämmer dig för att krympa kan du behöva göra en undersökning av orsakerna till det stora bordsutrymmet. Om detta händer regelbundet är det möjligt att din databas bara behöver så mycket utrymme.

Den dynamiska prestandavyn

V$TEMPSEG_USAGE

kan vara mycket användbar för att fastställa orsaken.

Kanske bryr du dig helt enkelt inte om orsaken och du behöver bara krympa den. Det här är din tredje dag på jobbet. Datan i databasen är bara 200MiBif-data och det tillfälliga tabellutrymmet är 13GiB - Det är bara att krympa det och gå vidare. Om det växer igen kommer vi att undersöka orsaken. Under tiden har jag ont om utrymme på den diskvolymen och jag behöver bara tillbaka utrymmet.

Låt oss ta en titt på att krympa den. Det beror lite på vilken version av Oracle du kör och hur det tillfälliga tabellutrymmet konfigurerades.
Oracle kommer att göra det bästa för att hindra dig från att göra några fruktansvärda misstag så vi kommer bara att prova kommandona och om de inte gör det arbete kommer vi att krympa ett nytt sätt.

Låt oss först försöka krympa datafilen. Om vi ​​kan göra det får vi tillbaka utrymmet och vi kan oroa oss för varför det växte i morgon.

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

Beroende på felmeddelandet kanske du vill prova detta med olika storlekar som är mindre än den aktuella platsen för filen. Jag har haft begränsad framgång med detta. Oracle kommer bara att krympa filen om det temporära tabellutrymmet är i början av filen och om det är mindre än den storlek du anger. En del gammal Oracle-dokumentation (de korrigerade detta) sa att du kunde utfärda kommandot och felmeddelandet skulle berätta vilken storlek du kan krympa till. När jag började arbeta som DBA var detta inte sant. Du var bara tvungen att gissa och köra kommandot igen ett gäng gånger och se om det fungerade.

OK. Det fungerade inte. Vad sägs om det här.

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;

Om du är i 11g (kanske i 10g också) är detta det! Om det fungerar kanske du vill gå tillbaka till föregående kommando och ge det några fler försök.

Men tänk om det misslyckas. Om det temporära tabellutrymmet är standard temporary som ställdes upp när databasen installerades kan du behöva göra mycket mer arbete. Vid det här laget brukar jag utvärdera om jag verkligen behöver det där utrymmet tillbaka. När allt diskutrymme kostar bara $X,XX per GiB. Vanligtvis vill jag inte göra sådana här ändringar under produktionstid. Det innebär att jobba på 2AMAGAIN! (Inte för att jag verkligen motsätter mig att jobba klockan 02.00 - det är bara det... Jag gillar att sova också. Och min fru gillar att ha mig hemma klockan 02.00... inte strövar omkring på gatorna i centrum klockan 04.00 och försöker komma ihåg var jag parkerade min bil 3 timmar tidigare. Jag har hört talas om det där med "distanspendling". Jag är bara orolig för att jag ska komma halvvägs och då kommer min internetuppkoppling att misslyckas - då måste jag rusa ner till stan för att fixa allt innan folk dyker upp på morgonen för att använda databasen.)

Ok... Tillbaka till det seriösa...Om det tillfälliga tabellutrymmet du vill krympa är ditt standardtillfälliga tabellutrymme, måste du först skapa ett nytt temporärt tabellutrymme, ställa in det som det tillfälliga tabellutrymmet som standard och sedan släppa din gamla förinställda tillfälliga tabellyta och återskapa Det. Släpp sedan den andra temporära tabellen som skapats.

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.

Förhoppningsvis kommer en av dessa saker att hjälpa!



  1. Flytta data från SQL Server till Oracle upprepade gånger

  2. Allt du behöver veta om databasnormalisering

  3. PreparedStatement och setTimestamp i oracle jdbc

  4. PARSE() vs TRY_PARSE() i SQL Server:Vad är skillnaden?