




Для стандартных файлов данных в Oracle вы не можете их сжать. Вам нужно будет сделать что-то вроде:
Для табличного пространства "bigfile" - это означает, что для его создания использовалось CREATE BIGFILE TABLESPACE - вы можете использовать ALTER TABLESPACE .. RESIZE ...
Предостережение: я не системный администратор Oracle, за исключением личных установок. Относитесь ко всему, что я говорю, с большой долей скепсиса.
Я предполагаю, что вы создали файлы данных с автоматическим расширением, и они были расширены за пределы того, что, по вашему мнению, они должны содержать. Есть предложение ALTER DATABASE, которое изменяет размер файла, вот пример из справочника Oracle SQL:
ALTER DATABASE
DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;
Однако я действительно не думаю, что вы хотите делать это вслепую. Лучшим подходом IMO было бы использование команды экспорта для сброса таблиц, которые находятся в этом файле данных, а затем воссоздания табличного пространства.
Вот способ, любезно предоставленный Томом Кайтом, чтобы получить размер блока вашей базы данных, перечислить, сколько места вы можете освободить, и создать команды alter ... для фактического сжатия базы данных. Надеюсь это поможет,
http://cglendenningoracle.blogspot.com/2009/08/how-do-i-shrink-datafiles-to-reclaim.html
Крейг Гленденнинг
Или просто перейдите прямо в AskTom и получите maxshrink.sql, и вы сможете получить скрипт, который работает без рекламы: asktom.oracle.com/pls/asktom/…
ALTER TABLESPACE .... RESIZE разрешено только за пределами HWM. Таким образом, у вас может быть много неиспользуемых сегментов под ним. Перед этой операцией выдайте:
ALTER TABLE .. .SHRINK SPACE в некоторых таблицах этого табличного пространства / файла данных, чтобы реорганизовать содержимое файлов данных.
Это может быть долгая задача, но вы можете генерировать команды с помощью SQL.
Ответ @ Дэйв об экспорте и импорте правильный и лучший выбор для освобождения места. Также в Oracle нет команды сжатия, @ Дэйв права, но существует команда изменения размера, которая, как @Дэйвид сказал, что "файлы данных могут быть изменены до последнего использованного блока", НО есть одна вещь, о которой следует упомянуть, что свободные блоки в файле данных могут быть выделены как что
0101000001111000000000000000000001110000000000
|---------
где: 0-это бесплатный блок 1-б / у блок
изменив размер файла данных до последнего использованного блока, он станет таким:
010100000111100000000000000000000111
|---------
Но как насчет других свободных блоков в файле данных ?? Они недоступны для других файлов данных или самой системы.
Если бы файл данных был таким:
1111111111111100000000000000000
тогда изменение размера будет полезно, но не в предыдущем варианте.
В любом случае, чтобы определить, до какого размера вы можете изменять размер файла данных, вот сценарий:
select 'alter database '||a.name||' datafile '''||b.file_name||'''' ||
' resize '||greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free))||chr(10)||
'--tablespace was '||trunc(bytes_full*100/bytes_total)||
'% full now '||
trunc(bytes_full*100/greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free)))||'%'
from v$database a
,dba_data_files b
,(Select tablespace_name,sum(bytes) bytes_full
From dba_extents
Group by tablespace_name) c
,(Select tablespace_name,sum(bytes) bytes_total
From dba_data_files
Group by tablespace_name) d
,(Select a.tablespace_name,a.file_id,b.bytes bytes_free
From (select tablespace_name,file_id
,max(block_id) max_data_block_id
from dba_extents
group by tablespace_name,file_id) a
,dba_free_space b
where a.tablespace_name = b.tablespace_name
and a.file_id = b.file_id
and b.block_id > a.max_data_block_id) e
Where b.tablespace_name = c.tablespace_name
And b.tablespace_name = d.tablespace_name
And bytes_full/bytes_total < .7
And b.tablespace_name = e.tablespace_name
And b.file_id = e.file_id
Не волнуйтесь, этот скрипт не будет вырезать использованные блоки из файла данных.
Неправильно. Размер файлов данных можно уменьшить до последнего использованного блока, что можно определить из представления словаря данных dba_extents.