Иногда некоторые жмотничают, пытаясь отгрызть от файлов БД лишние 100Мб. Вот этот скрипт им в подарок, выдавая перечень команд для уменьшения файлов БД ровно на столько, насколько они заняты.
Код:
select 'alter database datafile '''||file_name||''' resize '||ceil( (nvl(hwm,1)*32768)/1024/1024 )||'m;' cmd
from dba_data_files a, ( select file_id, max(block_id+blocks-1) hwm from dba_extents group by file_id ) b
where a.file_id = b.file_id(+) and ceil( blocks*32768/1024/1024) -ceil( (nvl(hwm,1)*32768)/1024/1024 ) > 0
/
скрипт малость кривоват и по непонятным причинам иногда выдает рост файлов, поэтому переписал на тупое уменьшение
Код:
begin
FOR i IN 1..100000 LOOP
for c in (select file#,bytes from v$datafile)
loop
begin
execute immediate
'alter database datafile ' || c.file# || ' resize '||(c.bytes-i*10240000);
exception when others then null;
end;
end loop;
end loop;
end;
/
и вот, от Тома Кайта
Код:
----------- maxshrink.sql ----------------------------------
set verify off
column file_name format a50 word_wrapped
column smallest format 999,990 heading "Smallest|Size|Poss."
column currsize format 999,990 heading "Current|Size"
column savings format 999,990 heading "Poss.|Savings"
break on report
compute sum of savings on report
column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/
select file_name,
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
ceil( blocks*&&blksize/1024/1024) currsize,
ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
/
column cmd format a75 word_wrapped
select 'alter database datafile '''||file_name||''' resize ' ||
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) || 'm;' cmd
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
and ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/