23.08.2011 15:42
OlegON
 
Иногда некоторые жмотничают, пытаясь отгрызть от файлов БД лишние 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
/
01.11.2016 10:42
OlegON
 
Сжатие таблиц до сжатия файлов БД на примере базы ЦФТ (не применяйте на рабочих базах!)
SQL код:
SET SERVEROUTPUT ON
BEGIN
FOR c IN (
SELECT ownertable_name FROM all_tables WHERE owner in ('IBS','AUD','AUDM') AND TEMPORARY='N' 
and NESTED='NO' and compression='DISABLED' 
and (owner,table_namenot in (select owner,table_name from all_tab_columns where data_type='LONG RAW' or data_type='LONG'
and (
owner,table_namenot in (select owner,object_name from dba_objects where object_type in ('MATERIALIZED VIEW'))
)
LOOP
BEGIN
EXECUTE IMMEDIATE 
'ALTER TABLE '||c.owner||'.'||c.table_name || ' enable row movement';
EXECUTE IMMEDIATE 'ALTER TABLE '||c.owner||'.'||c.table_name || ' deallocate unused keep 0';
EXECUTE IMMEDIATE 'ALTER TABLE '||c.owner||'.'||c.table_name || ' shrink space cascade';
EXECUTE IMMEDIATE 'ALTER TABLE '||c.owner||'.'||c.table_name || ' shrink space compact cascade';
exception when others then DBMS_OUTPUT.PUT_LINE(c.table_name);
END;
END LOOP;
END;

Часовой пояс GMT +3, время: 13:52.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.