Oracle освобождает место на диске после каскадного удаления пользователя

Я использую базу данных Oracle 12c. У меня была большая схема, которая занимала более 20 ГБ дискового пространства. Поэтому я удалил его с помощью команды:

 drop user myDB cascade;

Однако файлы табличных пространств продолжают занимать место на диске. На изображении ниже, взятом из EM Express, мы видим, что между данными, которые мне все еще нужны, есть много свободного места.

введите здесь описание изображения

Мой вопрос: как мне реорганизовать свое табличное пространство, чтобы оно было только в одном файле, а затем изменить его размер, чтобы у меня было больше места на диске?

Заранее спасибо.


person José Carlos Ribeiro    schedule 06.07.2017    source источник
comment
Прочтите эту статью на сайте Oracle-Base Тима Холла   -  person APC    schedule 07.07.2017


Ответы (2)


Это можно сделать, сначала создав новое табличное пространство с 1 файлом данных, а затем переместив все сегменты из старого табличного пространства в новое табличное пространство, после того как все данные будут перемещены, вы можете удалить старое табличное пространство и переименовать новое в старое. Таким образом, новое табличное пространство становится компактным, и вы освобождаете неиспользуемое дисковое пространство, доступное для ОС.

Последовательность шагов:

  1. создать новое табличное пространство TBS_B с 1 файлом данных
  2. узнать все сегменты, которые необходимо перенести из TBS_A в TBS_B, используя представление "dba_segments"
  3. перенос сегментов таблицы с помощью команды "alter table ... move tablespace"

    передавать сегменты индекса с помощью команды «изменить индекс ... перестроить табличное пространство»

  4. Удалить старый tablepsace TBS_A
  5. Переименуйте новое табличное пространство TBS_B в TBS_A.
person ivanzg    schedule 06.07.2017

Здесь следует отметить, что удаление пользователя в оракуле не освобождает место в его табличном пространстве. Табличное пространство занимает собственное пространство и действует как виртуальное пространство хранения для пользователей базы данных. Таким образом, удаление пользователя создаст свободное пространство в этом табличном пространстве, которое затем сможет использовать другой пользователь этого табличного пространства.

Чтобы проверить доступное свободное пространство во всех табличных пространствах, используйте этот запрос:

select tot.tablespace_name, tot.file_name, tot.bytes/1024/1024 size_mb, free.free_mb 
from dba_data_files tot, (select file_id, sum(bytes/1024/1024) free_mb FROM dba_free_space free group by file_id) free
where tot.file_id=free.file_id
order by free.free_mb;

Для реорганизации табличного пространства вам придется реорганизовать его содержимое, т. е. таблицы и индексы. При реорганизации потребуется удвоить пространство в вашем табличном пространстве, так как при этом таблицы и индексы будут перемещены в новые блоки, но после реорганизации вы можете вернуть пространство, изменив размер файлов данных табличного пространства.

Чтобы переместить таблицы и индексы, сначала определите, какие объекты используют ваше табличное пространство, используя представление dba_segments, а затем переместите/перестройте эти объекты с помощью следующих команд:

alter table TABLENAME move;
alter index INDEXNAME rebuild online;
person Lohit Gupta    schedule 07.07.2017