О Боже мой! Вижте размера на моето временно пространство за таблици! Или... как да свия временните пространства за таблици в Oracle.
Да, изпълних заявка, за да видя колко голямо е моето временно пространство за таблици:
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
Първият въпрос, който трябва да зададете, е защо временното пространство за таблици е толкова голямо. Може да знаете отговора на това отгоре на главата си. Може да се дължи на голяма заявка, че просто изпълнявате сортиране, което е грешка (правих го повече от веднъж.) Може да се дължи на някакво друго изключително обстоятелство. Ако случаят е такъв, всичко, което трябва да направите, за да почистите, е да свиете временното пространство на таблицата и да продължите напред в живота.
Но какво ще стане, ако не знаете? Преди да решите да се свиете, може да се наложи да проучите причините за голямото пространство за таблици. Ако това се случва редовно, тогава е възможно вашата база данни просто да се нуждае от толкова много място.
Изгледът на динамична производителност
V$TEMPSEG_USAGE
може да бъде много полезен при определяне на причината.
Може би просто не ви пука за причината и просто трябва да я намалите. Това е третият ви ден на работа. Данните в базата данни са само 200MiBif данни, а временното пространство за таблици е 13GiB - Просто го свийте и продължете напред. Ако нарасне отново, тогава ще разгледаме причината. Междувременно имам малко място на този дисков том и просто се нуждая от мястото обратно.
Нека да разгледаме свиването му. Това ще зависи малко от това каква версия на Oracle използвате и как е настроено временното пространство за таблици.
Oracle ще направи всичко възможно, за да ви предпази от ужасни грешки, така че просто ще опитаме командите и ако не го направят работа ще свием по нов начин.
Първо нека се опитаме да свием файла с данни. Ако успеем да направим това, тогава ще си върнем пространството и можем да се тревожим защо е нараснало утре.
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
В зависимост от съобщението за грешка, може да искате да опитате това с различни размери, които са по-малки от текущия сайт на файла. Имах ограничен успех с това. Oracle ще свие файла само ако временното пространство за таблици е в началото на файла и ако е по-малко от размера, който сте посочили. Някаква стара документация на Oracle (те коригираха това) казваше, че можете да издадете командата и съобщението за грешка ще ви каже до какъв размер можете да се свиете. По времето, когато започнах да работя като DBA, това не беше вярно. Просто трябваше да отгатнеш и да изпълниш отново командата няколко пъти и да видиш дали работи.
Добре. Това не проработи. Какво ще кажете за това.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
Ако сте в 11g (Може би и в 10g) това е! Ако работи, може да искате да се върнете към предишната команда и да й направите още няколко опита.
Но какво ще стане, ако това се провали. Ако временното пространство за таблици е временното по подразбиране, което е било настроено при инсталиране на базата данни, тогава може да се наложи да свършите много повече работа. В този момент обикновено преценявам дали наистина имам нужда от това пространство обратно. В крайна сметка дисковото пространство струва само $X.XX за GiB. Обикновено не искам да правя такива промени в работното време. Това означава да работиш в 2AMAGAIN! (Не че наистина възразявам да работя в 2 часа сутринта - просто... Ами аз също обичам да спя. А жена ми обича да ме има вкъщи в 2 часа сутринта... а не да обикалям по улиците в центъра в 4 сутринта, опитвайки се да си спомни къде съм паркирал моя кола 3 часа по-рано. Чувал съм за това нещо "отдалечен труд". Просто се притеснявам, че ще измина половината път и след това връзката ми с интернет ще се провали - тогава трябва да бързам в центъра, за да поправя всичко, преди хората да се появят сутринта, за да използвам базата данни.)
Добре... Обратно към сериозните неща... Ако временното пространство за таблици, което искате да свиете, е вашето временно пространство за таблици по подразбиране, първо ще трябва да създадете ново временно пространство за таблици, да го зададете като временно пространство за таблици по подразбиране, след което да махнете старото си временно пространство за таблици по подразбиране и да го създадете отново то. След думи пуснете втората създадена временна таблица.
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.
Надяваме се, че едно от тези неща ще помогне!