Oracle 表空间收缩 Shrink tablespace 表空间对象迁移
SELECT /*+ rule */
'ALTER DATABASE DATAFILE '''
|| FILE_NAME
|| ''' RESIZE '
|| CEIL ((NVL (HWM, 1) * 8192) / 1024 / 1024)
|| 'M;'
FROM DBA_DATA_FILES DBADF
LEFT JOIN ( SELECT FILE_ID, MAX (BLOCK_ID + BLOCKS - 1) HWM
FROM DBA_EXTENTS
GROUP BY FILE_ID) DBAFS
ON DBADF.FILE_ID = DBAFS.FILE_ID
WHERE CEIL (BLOCKS * 8192 / 1024 / 1024)
- CEIL ((NVL (HWM, 1) * 8192) / 1024 / 1024) >
0
AND DBADF.tablespace_name = 'MYTBS1';
column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/
set pages 0
set lines 300
column cmd format a300 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
/
select a.tablespace_name, a.file_name,(b.maximum+c.blocks-1)*d.db_block_size highwater
from dba_data_files a,(select file_id,max(block_id)
maximum from dba_extents group by file_id) b ,dba_extents c ,--这里c.blocks-1 不太对
(select value db_block_size from v$parameter
where name='db_block_size') d
where a.file_id = b.file_id
and c.file_id = b.file_id
and c.block_id = b.maximum
order by a.tablespace_name,a.file_name
SCRIPT 1:
--NOTE: Run the below three select statement one by one --
set verify off
set pages 1000
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
--To Check Database block size:--
column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/
-- To check how much space can be reclaimed --
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(+)
/
--Script to reclaim unused space from the datafiles of respective tablespace--
set pages 0
set lines 300
column cmd format a300 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
/
1
1
Very effective is also moving everything to another new tablespace online:
## Lobs
select 'ALTER TABLE '||s.owner||'.'||l.table_name||' MOVE LOB('||l.column_name||') STORE AS (TABLESPACE USERNAME) online;'
from dba_segments s, dba_lobs l
where s.segment_name = l.segment_name
and s.tablespace_name = 'USERNAME'
and segment_type='LOBSEGMENT'
and partition_name is null;
## Tables move
select 'ALTER TABLE '||owner||'.'||table_name||' move tablespace '||'USERNAME online;' from dba_tables where tablespace_name='USERS'and Owner='USERNAME';
## Move / rebuild indexes
select 'ALTER INDEX '||owner||'.'||index_name||' REBUILD TABLESPACE '||'USERNAME_INDEX parallel 8 online;'
from dba_indexes where tablespace_name='USERS';
## Lob Index move
select 'alter table '||owner||'.'||table_name||' move lob ('||column_name||') store as '||SEGMENT_NAME||' (tablespace USERNAME_INDEX);'from dba_lobs where OWNER='USERNAME' and tablespace_name='USERS';
##
Check Lob indexes
select index_name,index_type, table_name,table_type, tablespace_name from dba_indexes where tablespace_name='USERNAME' order by 3;
select index_name,index_type, table_name,table_typ更多推荐

所有评论(0)