DBA 常用工具-table move工具

使用说明:
配置schemname,表需要移到的空间,索引需要移入的空间。
该工具支持分区表
该工具只支持普通索引,不支持文艺索引~也不支持~
该工具支持断点续作:例如 某一个schema 有一万个表,移到九千个表时断掉了,再次运行该工具,会继续移动剩余的一千个表。之前的九千个表不做重复移动。

该工具配置简单,支持索引并行在线创建。

实在是居家旅游,杀人灭口必备良器。

如需扩展其他功能,请与作者:道行尚浅(QQ:122252261),视难易程度收取饭费。(饭费等级:街边摊,快餐,火锅,炒菜,海鲜,至尊套餐 不等~)

DECLARE 
  V_SCHEMA_NAME     
 VARCHAR2(200) := 'SH';
  V_TABLE_TABLESPACE
 VARCHAR2 (100 ) := 'USERS' ;
  V_INEDX_TABLESPACE
 VARCHAR2 (100 ) := 'TEST' ;
  V_PARAEL_DEGREE   
 VARCHAR2(200) := '1';

BEGIN
 
 FOR R IN (SELECT 'ALTER TABLE ' || DBT.OWNER || '.' || DBT.TABLE_NAME ||
                  
 ' MOVE ' || ( CASE
                    
 WHEN DTP.PARTITION_NAME IS NOT NULL THEN
                     
 ' PARTITION  ' || DTP.PARTITION_NAME
                  
 END) || '   TABLESPACE ' || V_TABLE_TABLESPACE DDL_STATMENT,
                   DBT.OWNER OWNER,
                   DBT.TABLE_NAME TABLE_NAME,
                   ROW_NUMBER() OVER(
 PARTITION BY DBT.OWNER, DBT.TABLE_NAME ORDER BY DBT.TABLE_NAME, DTP.PARTITION_POSITION) PAR_POSTION,
                  
 COUNT(*) OVER( PARTITION BY DBT.OWNER, DBT.TABLE_NAME) PAR_CNT
             
 FROM DBA_TABLES DBT, DBA_TAB_PARTITIONS DTP
            
 WHERE DBT.TABLE_NAME = DTP.TABLE_NAME(+)
              
 AND DBT.OWNER = DTP.TABLE_OWNER(+)
              
 AND DBT.OWNER = V_SCHEMA_NAME
              
 AND (DBT.TABLESPACE_NAME != V_TABLE_TABLESPACE OR
                   (DBT.TABLESPACE_NAME
 IS NULL AND
                   DTP.TABLESPACE_NAME != V_TABLE_TABLESPACE))
               
 ORDER BY DBT.TABLE_NAME  ,PAR_POSTION  ) LOOP
--    DBMS_OUTPUT.PUT_LINE(R.DDL_STATMENT); 
execute immediate R.DDL_STATMENT ;
 
   
 IF R.PAR_POSTION = R.PAR_CNT THEN
   
     
 FOR R_INX IN (SELECT ' ALTER INDEX ' || DI.OWNER || '.' ||
                           DI.INDEX_NAME ||
 '  REBUILD  ' || (CASE
                            
 WHEN DIP.PARTITION_NAME IS NOT NULL THEN
                             
 'PARTITION ' || DIP.PARTITION_NAME
                          
 END) || ' COMPUTE STATISTICS ONLINE PARALLEL ' ||
                           V_PARAEL_DEGREE ||
 ' TABLESPACE ' ||
                           V_INEDX_TABLESPACE INDEX_DDL
                     
 FROM DBA_INDEXES DI, DBA_IND_PARTITIONS DIP
                    
 WHERE DI.OWNER = DIP.INDEX_OWNER(+)
                      
 AND DI.INDEX_NAME = DIP.INDEX_NAME(+)
                      
 AND DI.owner=DI.table_owner
                      
 AND DI.TABLE_OWNER = R.OWNER
                      
 AND DI.TABLE_NAME = R.TABLE_NAME
                      
 AND DI.index_type = 'NORMAL'
                      
 AND (DI.TABLESPACE_NAME != V_INEDX_TABLESPACE OR
                           (DI.TABLESPACE_NAME
 IS NULL AND
                           DIP.TABLESPACE_NAME != V_INEDX_TABLESPACE)))
     
      
 LOOP
       
 EXECUTE IMMEDIATE R_INX.INDEX_DDL ;
      
 -- DBMS_OUTPUT.PUT_LINE(R_INX.INDEX_DDL); 
     
 END LOOP;
   
 END IF;
 
 END LOOP;

 
 FOR R_FINAL IN (
                 
                 
 select ' alter index ' || diP.index_owner || '.' ||
                          diP.index_name ||
 '  rebuild  ' || ' partition ' ||
                          dip.partition_name ||
                         
 ' compute statistics online parallel ' ||
                          V_PARAEL_DEGREE ||
 ' TABLESPACE ' ||
                          V_INEDX_TABLESPACE INDEX_DDL
                   
 from dba_ind_partitions DIP
                  
 where 1 = 1
                    
 and DIP.index_owner = V_SCHEMA_NAME
                    
 and DIP.tablespace_name != V_INEDX_TABLESPACE
                    
                 
                 
 UNION ALL
                 
                 
 SELECT ' alter index ' || di.owner || '.' || di.index_name ||
                        
 '  rebuild  ' ||
                        
 ' compute statistics online parallel ' ||
                         V_PARAEL_DEGREE ||
 ' TABLESPACE ' ||
                         V_INEDX_TABLESPACE
                   
 FROM DBA_INDEXES DI
                  
 WHERE DI.owner = V_SCHEMA_NAME
                    
 AND DI.tablespace_name != V_INEDX_TABLESPACE
                    
 AND DI.table_owner=DI.owner
                    
 AND DI.index_type= 'NORMAL')
 
  
 LOOP 
--    DBMS_OUTPUT.put_line(R_FINAL.INDEX_DDL); 
 
 EXECUTE IMMEDIATE R_FINAL.INDEX_DDL  ;
   
   
 END LOOP ;
 
 END;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值