Как восстановить хранилище для удаленных больших объектов - PullRequest
6 голосов
/ 14 июня 2010

У меня есть табличное пространство LOB. В настоящее время содержит 9 ГБ из 12 ГБ доступных. И, насколько я могу судить, удаление записей не освобождает хранилище в табличном пространстве. (Это был простой метод мониторинга хранилища - запросы к user_extents, это почти все, что мне разрешено не как администратор БД). Я беспокоюсь о дальнейшей обработке.

Меня беспокоит просто нехватка места - у нас около 9 ГБ из 12 ГБ, доступных для табличного пространства, и я хочу выяснить, как освободить пространство, прежде чем просить больше.

Столбцы больших объектов хранятся в отдельном табличном пространстве, хотя «хранилище в строке» разрешено для небольших.

Это Oracle 11.1, и данные находятся в столбце CLOB и столбце BLOB в одной таблице. Сегменты LOB Index (SYS_IL ...) малы, все хранилище находится в сегментах данных (SYS_LOB ...)

Мы попробовали очистить и объединить и не получили ничего - такое же количество байтов в user_extents.

"Alter table xxx move" будет работать, но нам нужно было бы найти место, куда его можно переместить, где достаточно места для пересмотренных данных. Мы также должны были бы сделать это в нерабочее время и перестроить индексы, конечно, но это достаточно просто.

Копирование хороших данных и выполнение усечения, а затем копирование их обратно также будет работать. Но это в значительной степени то, что делает команда «alter table».

Я скучаю по некоторым простым способам уменьшить объем и вернуть хранилище обратно? Или «alter table xxx move» - лучший подход? Или это не проблема, и Oracle будет извлекать пространство из строк удаленных лепестков, когда это необходимо?

Ответы [ 2 ]

9 голосов
/ 15 января 2015

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

Вы правы, удаление LOB не приведет к восстановлению хранилища в табличном пейзаже.

Выполнение этого запроса до и после удаления LOB даст одинаковый результат

select bytes
    from user_segments
    where tablespace_name = yourTableSpace
      and segment_name = yourTableName; 

Чтение это Oracle doc, я обнаружил, что вам нужно выполнить следующую инструкцию

ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE);

Что сократит BASICFILE сегмент LOB.

Теперь, если вы повторно выполните запрос

select bytes
    from user_segments
    where tablespace_name = yourTableSpace
      and segment_name = yourTableName; 

Вы заметите, что пространство было освобождено для табличного пространства, и сможете повторно использовать это пространство по своему усмотрению.

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

Но перед изменением размера файла данных убедитесь, что вы освободили неиспользуемое пространство в сегменте (украли его из того же документа, как указано выше), используя эти запросы (используйте тот, который вам нужен)

ALTER TABLE table DEALLOCATE UNUSED KEEP integer;
ALTER INDEX index DEALLOCATE UNUSED KEEP integer;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;

Обратите внимание, что предложение KEEP является необязательным и позволяет указать объем пространства, оставшегося в сегменте. Вы можете убедиться, что освобожденное пространство освобождено, изучив представление DBA_FREE_SPACE.

Теперь, чтобы изменить размер вашего файла данных,

ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M

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

Если вы хотите освободить еще больше места, вы можете очистить временное табличное пространство, которое иногда занимает много места (5 ГБ для моей базы данных). Используйте следующий оператор, чтобы проверить его размер:

SELECT tablespace_name, file_name, bytes
  FROM dba_temp_files WHERE tablespace_name like 'TEMP%';
1 голос
/ 15 июня 2010

Обычно, когда экстент выделяется для таблицы, он остается выделенным.Пустое пространство в таблице можно использовать повторно, если в таблицу добавлены дополнительные данные.Однако трудно восстановить пространство из таблицы, потому что таблица может иметь, например, блоки с 1 по 100, и пустые блоки находятся в блоках 50-75, или пустые блоки равны 1,3,5,7 и т. Д.

Вопрос в том, беспокоит ли вас пространство, которое будет повторно использоваться внутри таблицы, или вам нужно освободить пространство для других объектов в табличном пространстве, или вам нужно урезать файлы данных табличного пространства?1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...