Saturday, August 08, 2009

Resizing oversized Oracle datafiles

I am always interested in new techniques or software if that software can increase my productivity. This post is writing using Windows Live Writer.

Things to do

  1. Test numbered lists
  2. Test bulleted lists
  3. Test displaying code
  • This is the bulleted list.
  • Yeh boring eh?
  • Thought so…
  • moving right along

So you made this far without clicking away. Here is some SQL code which reports the current usage of a datafile versus the allocated size and then generates some SQL using our old friend Dynamic SQL for each datafile.

-- Builds on dbf_hwm script

set lines 140
set pages 300
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(+)
order by 1
/

column cmd format a100 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
order by 1
/