На версии Oracle 11g:
После Google не могу найти простой способ вернуть свободное место после удаления таблицы.
Я нашел много объяснений, рассказывающих, как файл данных становится фрагментированным, большой стек скучных запросов, которые вам нужно выполнить, чтобы переместить «пустое пространство» в конец файла данных (таблица за таблицей ... даже когда вы есть 200 столов!?).
Затем вам нужно уменьшить размер файла данных, «угадав», насколько вы можете его уменьшить, или вы должны точно знать, каков ваш «размер блока» ... И, наконец, вы не должны забывать «перестраивать индексы».
См. Например: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:54178027703899
и http://www.oracle-base.com/articles/misc/ReclaimingUnusedSpace.php
Существует ли простая процедура PL / SQL, которая, учитывая имя табличного пространства или имя файла данных, будет выполнять эту работу? Или любой подобный инструмент Oracle?
источник
Ответы:
Краткий ответ - нет . К сожалению, способ сделать это в Oracle требует «большого количества скучных запросов». Статьи, на которые вы ссылаетесь, являются одними из лучших на эту тему. Файл данных действительно фрагментируется, поэтому даже если свободное пространство находится ниже самого высокого сегмента, Oracle не будет автоматически консолидировать его, когда
RESIZE
будет выполнено a .Чтобы «дефрагментировать» табличное пространство, вам нужно переместить эти сегменты в начало файла данных, а не в конец. Для таблиц это автономный процесс, то есть таблица будет недоступна во время перемещения. Индексы можно перемещать либо в автономном режиме, либо с помощью Enterprise Edition их можно перемещать в режиме онлайн. Поскольку у вас есть окно отключения, я рекомендую вам выполнить следующие шаги.
A. Сжатие файлов данных со свободным пространством за отметкой максимальной воды. Это можно сделать следующим образом (запрос аналогичен процедуре Frosty Z):
Б. После того, как вы сузили положение выше верхней отметки, выясните, какие табличные пространства все еще выиграют от перемещения сегментов.
C. Для каждого из этих табличных пространств определите, какие сегменты необходимо переместить. (Замените USERS именем вашего табличного пространства или присоедините его к предыдущему запросу)
D. Переместите каждую таблицу и перестройте индексы и статистику.
E. повторите шаг A.
Я только что построил большинство этих запросов, так что вы захотите тщательно протестировать их перед использованием. Я полагаю, вы могли бы создать процедуру, которая использовалась бы
EXECUTE IMMEDIATE
для создания фактических операторов для динамического выполнения, но поскольку запросы будут получать ORA-08103: объект больше не существует, пока выполняется перемещение, я думаю, что лучше контролировать этот процесс вручную, даже если если это действительно означает немного больше времени / усилий.источник
Частичное решение, вдохновленное этой страницей :
Он не реорганизует свободное пространство, но автоматически обнаруживает доступное свободное пространство в конце файлов данных и печатает правильные команды «ИЗМЕНИТЬ».
источник
Прежде чем пытаться вообще сжимать файлы данных, спросите себя: собираетесь ли вы снова создавать новые сегменты внутри связанного табличного пространства, когда-нибудь в ближайшем будущем? Если да, то нет смысла сокращаться. Пространство просто будет повторно использовано для ваших новых сегментов, и вы сэкономите себе и системе много сил, оставив все как есть.
источник
После нескольких дней серфинга в Google я нашел самый простой и понятный пример восстановления свободного пространства в табличном пространстве после удаления. надеюсь, это поможет
Ссылка: http://www.dbforums.com/oracle/976248-how-reduce-tablespaces-used-space-after-delete-records-2.html
решение:
Давайте создадим таблицу с 9999 строками, каждая размером около 1 КБ:
Для таблицы выделено 29 экстентов, в общей сложности 14,6M:
Давайте удалим ВСЕ строки:
Теперь - «сюрприз» - таблица все еще использует те же экстенты:
Почему ? Потому что даже если вы удалите все строки таблицы, High Water Mark не будет уменьшен - он никогда не будет уменьшен, чтобы обеспечить максимальный параллелизм (Oracle абсолютно серьезно относится к максимизации параллелизма, то есть производительности и масштабируемости; это главная причина его успеха в корпоративных приложениях).
Распределение неиспользуемого пространства (= пространство над HWM) мало помогает (так как над HWM не так много неиспользуемого пространства):
Теперь давайте переместим таблицу, что по сути означает клонировать таблицу (включая триггеры, ограничения и т. Д.), Перенести строки, удалить «старую» таблицу и переименовать новую - все сделано ядром, так что это супер-безопасно даже в случае отказа машины / сервера:
Теперь у нас есть только начальный экстент:
Предупреждение: обычно случается, что многие / все индексы в таблице НЕПРАВИЛЬНЫ после перемещения (не в этом случае, но я использую 9.2.0.4, последний выпуск, который, вероятно, оптимизировал процесс в случае полностью пустых таблиц ):
Если STATUS не VALID, вы можете просто перестроить вручную индекс (ы):
Или вы можете автоматизировать весь процесс:
В качестве примера давайте вручную установим индекс на UNUSABLE:
HTH Альберто
источник
Как было сказано ранее, вам придется переместить все 200+ таблиц в этом табличном пространстве, чтобы освободить место в вашем файле данных, а затем изменить размер, чтобы освободить пространство. Но вместо выполнения всех этих запросов 12c Enterprise manager выполняет эту задачу. Вам нужно будет перейти к базе данных Home> Storage> Tablespace. Выберите табличное пространство, над которым вы хотите работать, и нажмите «Реорганизовать». Это даст возможность просмотреть операторы SQL, которые должны быть выполнены. Вы можете либо взять их копию и запустить ее самостоятельно, либо запланировать работу в EM.
Он фактически создает другое табличное пространство, перемещает все объекты в новое табличное пространство, перестраивает индексы и удаляет объекты из старого табличного пространства.
Есть несколько недостатков, о которых я могу подумать. Это должно быть сделано в непиковые часы, иначе произойдет ошибка, сообщающая, что ресурс занят. К файлу данных (а не к табличному пространству) к его имени будет добавлен «reorg» ближе к концу.
источник