Июн 272012
 

Любой файл данных ORACLE можно не только увеличивать, но и уменьшать, причём минимальный размер, до которого можно уменьшить файл данных, не равен разности его длины и количества свободного места.
Рассмотрим типичный файл (см. картинку). Экстенты (extents) обозначены тёмным цветом, свободное место - светлым.

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

Вот этим запросом можно определить, насколько сильно можно уменьшить файлы:

SELECT 
    file_name, 
    hwm, 
    blocks total_blocks, 
    blocks - hwm + 1 shrinkage_possible
FROM dba_data_files a,
	(
		SELECT 
			file_id, 
			MAX(block_id + blocks) hwm
		FROM dba_extents
		GROUP BY file_id 
	) b
WHERE a.file_id = b.file_id
ORDER BY file_name;

Этот запрос выдаст имя файла, HWM (High Water Mark - дальняя граница последнего экстента, именно до неё можно уменьшать файл), общее количество блоков и количество блоков, на которое можно урезать файл.

Если результат нас не устраивает, можно попробовать реорганизовать файл данных.
Найдём 10 самых крайних экстентов в файле:

SELECT * FROM 
(
  SELECT owner, segment_name, segment_type, block_id 
  FROM dba_extents 
       WHERE FILE_ID = <ID файла, можно взять из dba_data_files>
  ORDER BY block_id DESC 
) 
WHERE ROWNUM <= 10

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

Теперь можно уменьшать файл:

ALTER DATABASE DATAFILE '/dev/vx/rdsk/db10g/file_02.dbf' RESIZE 10G;

Перед уменьшением файла весьма желательно почистить корзину.

  4 комментария to “Насколько можно уменьшить файл данных?”

  1. Спасибо, Cube, за статью, она пришлась очень кстати после большой чистки моей базы.

  2. А где картинка?

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)