Ответ 1
О Боже! Посмотрите на размер моего временного табличного пространства! Или... как уменьшить временные табличные пространства в 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
может быть очень полезным при определении причины.
Возможно, вы просто не заботитесь о причине, и вам просто нужно сжать ее. Это ваш третий день на работе. Данные в базе данных составляют только 200MiB если данные и временное табличное пространство 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 (они исправили это) сказали, что вы можете отправить команду, и сообщение об ошибке сообщит вам, что размер, который вы могли бы сжать. К тому времени, когда я начал работать в качестве администратора баз данных, это было не правда. Вам просто нужно было угадать и повторно запустить команду кучу раз и посмотрите, работает ли он.
Хорошо. Это не сработало. Как насчет этого.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
Если вы в 11g (Maybee в 10g тоже), то это он! Если это работает, вы можете захотеть чтобы вернуться к предыдущей команде и дать ей еще несколько попыток.
Но что, если это не удастся. Если временное табличное пространство является временным временным который был настроен, когда была установлена база данных, вам может потребоваться выполнить много больше работы. На этом этапе я обычно переоцениваю, действительно ли мне это нужно пространство назад. Ведь дисковое пространство стоит только $X.XX a GiB. Обычно я не хочу для внесения таких изменений в часы производства. Это означает, что работа в 2AM ЕЩЕ РАЗ! (Не то, чтобы я действительно возражал к работе в 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.
Надеюсь, одна из этих вещей поможет!